ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjMjJmNQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTI0IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlZmlsZSBmb3IgdGhlIEV4dDIgRmlsZSBTeXN0ZW0gdXRpbGl0aWVzCisjICAgICAgbGlicmFyaWVzLCBhbiBpbXBvcnRhbnQgb25lIG9mIHdoaWNoIGlzIHRoZSBVbml2ZXJzYWxseSBVbmlxdWUKKyMgICAgICBJZGVudGlmaWVyIChVVUlEKSBsaWJyYXJ5LgorIworCitCdWlsZENvbmZpZ1NwZWNpYWxpemVkCTo9IE5vCitCdWlsZFByb2R1Y3RTcGVjaWFsaXplZAk6PSBObworCitpbmNsdWRlIHByZS5tYWsKKworUGFja2FnZU5hbWUJCTo9IGUyZnNwcm9ncy1saWJzCisKK1BhY2thZ2VFeHRlbnNpb24JOj0gdGFyLmd6CitQYWNrYWdlU2VwYXJhdG9yCTo9IC0KKworUGFja2FnZVBhdGNoQXJncwk6PSAtcDEKKworUGFja2FnZUFyY2hpdmUJCTo9ICQoUGFja2FnZU5hbWUpLiQoUGFja2FnZUV4dGVuc2lvbikKK1BhY2thZ2VTb3VyY2VEaXIJOj0gJChQYWNrYWdlTmFtZSkkKFBhY2thZ2VTZXBhcmF0b3IpJChQYWNrYWdlVmVyc2lvbikKKworUGFja2FnZUJ1aWxkTWFrZWZpbGUJPSAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLE1ha2VmaWxlKQorCitDbGVhblBhdGhzCQkrPSAkKFBhY2thZ2VMaWNlbnNlRmlsZSkKKworYWxsOiAkKFBhY2thZ2VEZWZhdWx0R29hbCkKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBsaWNlbnNlIGNvbnRlbnRzLgorCiskKFBhY2thZ2VMaWNlbnNlUGF0aHMpOiBzb3VyY2UKKworJChQYWNrYWdlU291cmNlRGlyKS9DT1BZSU5HOiBzb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL0NPUFlJTkcKKwkkKGNvcHktcmVzdWx0KQorCisjIEV4dHJhY3QgdGhlIHNvdXJjZSBmcm9tIHRoZSBhcmNoaXZlIGFuZCBhcHBseSBwYXRjaGVzLCBpZiBhbnkuCisKKyQoUGFja2FnZVNvdXJjZURpcik6ICQoUGFja2FnZUFyY2hpdmUpICQoUGFja2FnZVBhdGNoUGF0aHMpCisJJChleHBhbmQtYW5kLXBhdGNoLXBhY2thZ2UpCisKKyMgUHJlcGFyZSB0aGUgc291cmNlcy4KKworLlBIT05ZOiBzb3VyY2UKK3NvdXJjZTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpCisKKyMgUGF0Y2ggdGhlIHNvdXJjZXMsIGlmIG5lY2Vzc2FyeS4KKworLlBIT05ZOiBwYXRjaAorcGF0Y2g6IHNvdXJjZQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGJ1aWxkIG1ha2VmaWxlLgorCiskKFBhY2thZ2VCdWlsZE1ha2VmaWxlKTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSljZCAkKEJ1aWxkRGlyZWN0b3J5KSAmJiBcCisJJChDVVJESVIpLyQoUGFja2FnZVNvdXJjZURpcikvY29uZmlndXJlIFwKKwlDQz0iJChDQykiIENYWD0iJChDWFgpIiBBUj0kKEFSKSBSQU5MSUI9JChSQU5MSUIpIFNUUklQPSQoU1RSSVApIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCS0tYnVpbGQ9JChIb3N0VHVwbGUpIFwKKwktLWhvc3Q9JChUYXJnZXRUdXBsZSkgXAorCS0tZW5hYmxlLWVsZi1zaGxpYnMgXAorCS0tcHJlZml4PS91c3IgXAorCS0tc3lzY29uZmRpcj0vZXRjIFwKKwktLWxvY2Fsc3RhdGVkaXI9L3ZhcgorCisjIENvbmZpZ3VyZSB0aGUgc291cmNlIGZvciBidWlsZGluZy4KKworLlBIT05ZOiBjb25maWd1cmUKK2NvbmZpZ3VyZTogc291cmNlICQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpCisKKyMgQnVpbGQgdGhlIHNvdXJjZS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBidWlsZAorYnVpbGQ6IGNvbmZpZ3VyZQorCSQoVmVyYm9zZSl1bnNldCBNQUtFRkxBR1MgJiYgXAorCSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgYWxsCisKKyMgU3RhZ2UgdGhlIGJ1aWxkIHRvIGEgdGVtcG9yYXJ5IGluc3RhbGxhdGlvbiBhcmVhLgorIworIyBXZSBoYXZlIHRvIHVuc2V0IE1BS0VGTEFHUyBzaW5jZSB0aGV5IGNvbmZ1c2UgdGhlIHBhY2thZ2UgYnVpbGQgb3RoZXJ3aXNlLgorIworIyBXZSBleHBsaWN0bHkgcmVtb3ZlICdsaWJ1dWlkLmxhJyBhbmQgJ2xpYnV1aWQrKy5sYScgYmVjYXVzZSBzb21lCisjIHBhY2thZ2VzIHRoYXQgZGVwZW5kIG9uIGxpYnV1aWQgdXNlIGxpYnRvb2wuIElmIGxpYnRvb2wgZmluZHMgYQorIyAnKi5sYScgZmlsZSBmb3IgYSBsaWJyYXJ5LCBpdCB1c2VzIHRoZSB2YWx1ZSBvZiAnbGliZGlyPTxkaXI+JyBpdAorIyBmaW5kcy4gSW4gb3VyIGNhc2UsIHNpbmNlICctLXByZWZpeD0vdXNyJyB0aGlzIHZhbHVlIGlzCisjICcvdXNyL2xpYicuIEl0IHRoZW4gcmVzb2x2ZXMgJy1sdXVpZCcgdG8gJy91c3IvbGliL2xpYnV1aWQuc28nLiBJbiBhCisjIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50LCB0aGlzIGlzIGxpa2VseSB0byBiZSBuZWl0aGVyIHRoZQorIyByaWdodCBhcmNoaXRlY3R1cmUgbm9yIHRoZSByaWdodCB2ZXJzaW9uIHRvIGxpbmsgYWdhaW5zdC4gSW4gc2hvcnQsCisjIHdlIGxvc2UuCisjCisjIFdlIGNvdWxkIGFsc28gaGFuZGxlIHRoaXMgYnkgcmVtb3ZpbmcgREVTVERJUiBhbmQgc2V0dGluZyB0aGUgcHJlZml4CisjIHRvICQoUmVzdWx0RGlyZWN0b3J5KTsgaG93ZXZlciwgdGhhdCByZXN1bHRzIGluIGxpYnRvb2wgaGFyZC1jb2RpbmcKKyMgJChSZXN1bHREaXJlY3RvcnkpIGFzIHRoZSBSUEFUSCBpbiB0aGUgbGlua2VkIGV4ZWN1dGFibGVzIHdoaWNoIGlzCisjIE5PVCB3aGF0IHdlIHdhbnQgZWl0aGVyLiBXZSBsb3NlIGFnYWluLgorIworIyBCeSByZW1vdmluZyB0aGUgJyoubGEnIGZpbGUsIHdlIHdpbiBieSBlbnN1cmluZyBuZWl0aGVyIGEgbWlzZGlyZWN0ZWQKKyMgbGluayBub3IgYW4gUlBBVEguCisKKy5QSE9OWTogc3RhZ2UKK3N0YWdlOiBidWlsZCB8ICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSl1bnNldCBNQUtFRkxBR1MgJiYgXAorCSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgREVTVERJUj0kKFJlc3VsdERpcmVjdG9yeSkgaW5zdGFsbAorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpICQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCx1c3IvbGliL2xpYnV1aWQubGEpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsLHVzci9saWIvbGlidXVpZCsrLmxhKQorCitjbGVhbjoKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFBhY2thZ2VTb3VyY2VEaXIpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFJlc3VsdERpcmVjdG9yeSkKKworaW5jbHVkZSBwb3N0Lm1hawpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi8ubWlzc2luZy1jb3B5cmlnaHQgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyLy5taXNzaW5nLWNvcHlyaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTljYjMyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi8ubWlzc2luZy1jb3B5cmlnaHQKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworZmluZCAuIC10eXBlIGYgXCEgLW5hbWUgXCp+IFwhIC1leGVjIGdyZXAgLXEgQmVnaW4tSGVhZGVyIFx7XH0gXDsgLXByaW50IFwKKwl8IGdyZXAgLXYgXi4vYnVpbGQKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvLnJlbGVhc2UtY2hlY2tsaXN0IGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi8ucmVsZWFzZS1jaGVja2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MjY1YwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvLnJlbGVhc2UtY2hlY2tsaXN0CkBAIC0wLDAgKzEsMTkgQEAKKzEpICBEbyAibWFrZSBkZXBlbmQiIGlmIG5lY2Vzc2FyeQorCisyKSAgIm1ha2UgY2hlY2siISEhCisKKzMpICBVc2UgImdpdCBsb2ciIHRvIGFzc2VtYmxlIHJlbGVhc2Ugbm90ZXMuCisKKzQpICBSdW4gIihjZCBwbzsgbWFrZSBlMmZzcHJvZ3MucG90LXVwZGF0ZSkiIHRvIHVwZGF0ZSB0aGUgdHJhbnNsYXRpb24gdGVtcGxhdGUuCisKKzUpICBVcGRhdGUgZmlsZXMgd2hpY2ggY29udGFpbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisJdmVyc2lvbi5oCisJUkVBRE1FCisJUkVMRUFTRS1OT1RFUworCWUyZnNwcm9ncy5sc20KKwlkb2MvbGliZXh0MmZzLnRleGluZm8gKHRocmVlIHBsYWNlcykKKworNikgIE1ha2Ugc291cmNlIGRpc3RyaWJ1dGlvbgorCis3KSAgQWRqdXN0IHNpemVzIGluIGUyZnNwcm9ncy1WRVIubHNtOyByZWJ1aWxkIHNvdXJjZSBmaWxlczsgcmVidWlsZCBSUE0gZmlsZXMKKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9DT1BZSU5HIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTIyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL0NPUFlJTkcKQEAgLTAsMCArMSw4NDkgQEAKK1RoaXMgcGFja2FnZSwgdGhlIEVYVDIgZmlsZXN5c3RlbSB1dGlsaXRpZXMsIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlcgordGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgbGliL2V4dDJmcworYW5kIGxpYi9lMnAgbGlicmFyaWVzLCB3aGljaCBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBMaWJyYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgdGhlIGxpYi91dWlkIGxpYnJhcnkgd2hpY2ggaXMgbWFkZQorYXZhaWxhYmxlIHVuZGVyIGEgQlNELXN0eWxlIGxpY2Vuc2UgYW5kIHRoZSBsaWIvZXQgYW5kIGxpYi9zcworbGlicmFyaWVzIHdoaWNoIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbiBNSVQtc3R5bGUgbGljZW5zZS4gIFBsZWFzZQorc2VlIGxpYi91dWlkL0NPUFlJTkcgZm9yIG1vcmUgZGV0YWlscyBmb3IgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmaWxlcworY29tcHJpc2luZyB0aGUgbGlidXVpZCBsaWJyYXJ5LCBhbmQgdGhlIHNvdXJjZSBmaWxlIGhlYWRlcnMgb2YgdGhlCitsaWJldCBhbmQgbGlic3MgbGlicmFyaWVzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitUaGUgbW9zdCByZWNlbnQgb2ZmaWNpYWxseSBkaXN0cmlidXRlZCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBhdAoraHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQuICBJZiB5b3UgbmVlZCB0byBtYWtlIGEgZGlzdHJpYnV0aW9uLAordGhhdCdzIHRoZSBvbmUgeW91IHNob3VsZCB1c2UuICBJZiB0aGVyZSBpcyBzb21lIHJlYXNvbiB3aHkgeW91J2QgbGlrZQorYSBtb3JlIHJlY2VudCB2ZXJzaW9uIHRoYXQgaXMgc3RpbGwgaW4gQUxQSEEgdGVzdGluZyAoaS5lLiwgZWl0aGVyCit1c2luZyB0aGUgIldJUCIgdGVzdCBkaXN0cmlidXRpb25zIG9yIG9uZSBmcm9tIHRoZSBoZyBvciBnaXQKK3JlcG9zaXRvcnkgZnJvbSB0aGUgZGV2ZWxvcG1lbnQgYnJhbmNoLCBwbGVhc2UgY29udGFjdCBtZQorKHR5dHNvQG1pdC5lZHUpIGJlZm9yZSB5b3Ugc2hpcC4gIFRoZSByZWxlYXNlIHNjaGVkdWxlcyBmb3IgdGhpcworcGFja2FnZSBhcmUgZmxleGlibGUsIGlmIHlvdSBnaXZlIG1lIGVub3VnaCBsZWFkIHRpbWUuCisKKworCQkJCQlUaGVvZG9yZSBUcydvCisJCQkJCTIzLUp1bmUtMjAwNworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIAkJICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKKyBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55CitvdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCit5b3VyIGxpYnJhcmllcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCit5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKK3RoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAordmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgordGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorDAorICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IGNvbXBhbmllcyBkaXN0cmlidXRpbmcgZnJlZQorc29mdHdhcmUgd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgdGh1cyBpbiBlZmZlY3QKK3RyYW5zZm9ybWluZyB0aGUgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlLiAgVG8gcHJldmVudCB0aGlzLAord2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCitmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggd2FzIGRlc2lnbmVkIGZvciB1dGlsaXR5IHByb2dyYW1zLiAgVGhpcworbGljZW5zZSwgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbgorZGVzaWduYXRlZCBsaWJyYXJpZXMuICBUaGlzIGxpY2Vuc2UgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5CitvbmU7IGJlIHN1cmUgdG8gcmVhZCBpdCBpbiBmdWxsLCBhbmQgZG9uJ3QgYXNzdW1lIHRoYXQgYW55dGhpbmcgaW4gaXQgaXMKK3RoZSBzYW1lIGFzIGluIHRoZSBvcmRpbmFyeSBsaWNlbnNlLgorCisgIFRoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0Cit0aGV5IGJsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYQorcHJvZ3JhbSBhbmQgc2ltcGx5IHVzaW5nIGl0LiAgTGlua2luZyBhIHByb2dyYW0gd2l0aCBhIGxpYnJhcnksIHdpdGhvdXQKK2NoYW5naW5nIHRoZSBsaWJyYXJ5LCBpcyBpbiBzb21lIHNlbnNlIHNpbXBseSB1c2luZyB0aGUgbGlicmFyeSwgYW5kIGlzCithbmFsb2dvdXMgdG8gcnVubmluZyBhIHV0aWxpdHkgcHJvZ3JhbSBvciBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgSG93ZXZlciwgaW4KK2EgdGV4dHVhbCBhbmQgbGVnYWwgc2Vuc2UsIHRoZSBsaW5rZWQgZXhlY3V0YWJsZSBpcyBhIGNvbWJpbmVkIHdvcmssIGEKK2Rlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnksIGFuZCB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQordHJlYXRzIGl0IGFzIHN1Y2guCisKKyAgQmVjYXVzZSBvZiB0aGlzIGJsdXJyZWQgZGlzdGluY3Rpb24sIHVzaW5nIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbGlicmFyaWVzIGRpZCBub3QgZWZmZWN0aXZlbHkgcHJvbW90ZSBzb2Z0d2FyZQorc2hhcmluZywgYmVjYXVzZSBtb3N0IGRldmVsb3BlcnMgZGlkIG5vdCB1c2UgdGhlIGxpYnJhcmllcy4gIFdlCitjb25jbHVkZWQgdGhhdCB3ZWFrZXIgY29uZGl0aW9ucyBtaWdodCBwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgorCisgIEhvd2V2ZXIsIHVucmVzdHJpY3RlZCBsaW5raW5nIG9mIG5vbi1mcmVlIHByb2dyYW1zIHdvdWxkIGRlcHJpdmUgdGhlCit1c2VycyBvZiB0aG9zZSBwcm9ncmFtcyBvZiBhbGwgYmVuZWZpdCBmcm9tIHRoZSBmcmVlIHN0YXR1cyBvZiB0aGUKK2xpYnJhcmllcyB0aGVtc2VsdmVzLiAgVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KK3Blcm1pdCBkZXZlbG9wZXJzIG9mIG5vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUKK3ByZXNlcnZpbmcgeW91ciBmcmVlZG9tIGFzIGEgdXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZQorbGlicmFyaWVzIHRoYXQgYXJlIGluY29ycG9yYXRlZCBpbiB0aGVtLiAgKFdlIGhhdmUgbm90IHNlZW4gaG93IHRvIGFjaGlldmUKK3RoaXMgYXMgcmVnYXJkcyBjaGFuZ2VzIGluIGhlYWRlciBmaWxlcywgYnV0IHdlIGhhdmUgYWNoaWV2ZWQgaXQgYXMgcmVnYXJkcworY2hhbmdlcyBpbiB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBvZiB0aGUgTGlicmFyeS4pICBUaGUgaG9wZSBpcyB0aGF0IHRoaXMKK3dpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZSBsaWJyYXJpZXMuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5Cit3b3JrcyB0b2dldGhlciB3aXRoIHRoZSBsaWJyYXJ5LgorCisgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCisMCisJCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCitjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAorcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCithZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorICAKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21waWxlIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgYykgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBkKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkKK2Rpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL01DT05GSUcuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL01DT05GSUcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4YTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvTUNPTkZJRy5pbgpAQCAtMCwwICsxLDIzNyBAQAorIyBCZWdpbm5pbmcgb2YgZmlsZSBNQ09ORklHCisKK2FsbDo6CisKK2NoZWNrOjoKKworU0hFTEwgPSAvYmluL3NoCisKK0NPTVBSRVNTX0VYVCA9IGd6IGJ6MiBieiBaCisKK3ByZWZpeCA9IEBwcmVmaXhACityb290X3ByZWZpeCA9IEByb290X3ByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorcm9vdF9iaW5kaXIgPSBAcm9vdF9iaW5kaXJACityb290X3NiaW5kaXIgPSBAcm9vdF9zYmluZGlyQAorcm9vdF9saWJkaXIgPSBAcm9vdF9saWJkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2JpbmRpciA9IEBiaW5kaXJACitzYmluZGlyID0gQHNiaW5kaXJACitsaWJkaXIgPSBAbGliZGlyQAorZGF0YWRpcj0gQGRhdGFkaXJACitsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorcm9vdF9zeXNjb25mZGlyPSBAcm9vdF9zeXNjb25mZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQorbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCittYW41ZGlyID0gJChtYW5kaXIpL21hbjUKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAoraW5mb2RpciA9IEBpbmZvZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorCitAU0VUX01BS0VACisKK0BpZkdOVW1ha2VAIFYgPQorQGlmR05VbWFrZUAgaWZlcSAoJChzdHJpcCAkKFYpKSwpCitAaWZHTlVtYWtlQCAjICBFID0gQGVjaG8KK0BpZkdOVW1ha2VAICMgIFEgPSBACitAaWZHTlVtYWtlQCAgICBFID0gQEVACitAaWZHTlVtYWtlQCAgICBRID0gQFFACitAaWZHTlVtYWtlQCBlbHNlCitAaWZHTlVtYWtlQCAgICBFID0gQFwjCitAaWZHTlVtYWtlQCAgICBRID0KK0BpZkdOVW1ha2VAIGVuZGlmCisKK0BpZk5vdEdOVW1ha2VAIEUgPSBARUAKK0BpZk5vdEdOVW1ha2VAIFEgPSBAUUAKKworQ0MgPSBAQ0NACitCVUlMRF9DQyA9IEBCVUlMRF9DQ0AKK0RFRlMgPSAtRExPQ0FMRURJUj1cIiQobG9jYWxlZGlyKVwiIC1EUk9PVF9TWVNDT05GRElSPVwiJChyb290X3N5c2NvbmZkaXIpXCIgQERFRlNACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQRkxBR1MgPSAgLUkkKHRvcF9idWlsZGRpcikvbGliIC1JJCh0b3Bfc3JjZGlyKS9saWIgQENQUEZMQUdTQAorSU5UTF9GTEFHUyA9IEBJTlRMX0ZMQUdTQAorQUxMX0NGTEFHUyA9ICQoQ1BQRkxBR1MpICQoREVGUykgJChVU0VfV0ZMQUdTKSAkKENGTEFHUykgJChYVFJBX0NGTEFHUykgXAorCSQoSU5UTF9GTEFHUykgJChMSU5VWF9JTkNMVURFKSAKK0xERkxBR1MgPSBATERGTEFHU0AKK0FMTF9MREZMQUdTID0gJChMREZMQUdTKSBATERGTEFHX0RZTkFNSUNACitMREZMQUdTX1NUQVRJQyA9ICQoTERGTEFHUykgQExERkxBR19TVEFUSUNACitCVUlMRF9DRkxBR1MgPSBAQlVJTERfQ0ZMQUdTQAorQlVJTERfTERGTEFHUyA9IEBCVUlMRF9MREZMQUdTQAorTElOS19CVUlMRF9GTEFHUyA9IEBMSU5LX0JVSUxEX0ZMQUdTQAorTElOS19JTlNUQUxMX0ZMQUdTID0gQExJTktfSU5TVEFMTF9GTEFHU0AKK1JNID0gQFJNQAorTE4gPSBATE5ACitMTl9TID0gQExOX1NACitNViA9IEBNVkAKK0NQID0gQENQQAorQ0hNT0QgPSBAQ0hNT0RACitBUiA9IEBBUkAKK0FXSyA9IEBBV0tACitTRUQgPSBAU0VEQAorUEVSTCA9IEBQRVJMQAorUkFOTElCID0gQFJBTkxJQkAKK1NUUklQID0gQFNUUklQQAorTEQgPSAkKFBVUkUpIEBDQ0AKK0FSVVBEID0gJChBUikgcgorQVJHRU4gPSAkKEFSKSByYworTERDT05GSUcgPSBATERDT05GSUdACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorCisjCisjIExpYnJhcnkgZGVmaW5pdGlvbnMKKyMKK0xJQiA9ICQodG9wX2J1aWxkZGlyKS9saWIKK0xJQlNTID0gJChMSUIpL2xpYnNzQExJQl9FWFRAIEBQUklWQVRFX0xJQlNfQ01UQCBARExPUEVOX0xJQkAKK0xJQkNPTV9FUlIgPSAkKExJQikvbGliY29tX2VyckBMSUJfRVhUQCBAUFJJVkFURV9MSUJTX0NNVEAgQFNFTV9JTklUX0xJQkAKK0xJQkUyUCA9ICQoTElCKS9saWJlMnBATElCX0VYVEAKK0xJQkVYVDJGUyA9ICQoTElCKS9saWJleHQyZnNATElCX0VYVEAKK0xJQlVVSUQgPSBATElCVVVJREAgQFNPQ0tFVF9MSUJACitMSUJCTEtJRCA9IEBMSUJCTEtJREAgQFBSSVZBVEVfTElCU19DTVRAICQoTElCVVVJRCkKK0xJQklOVEwgPSBATElCSU5UTEAKK0RFUExJQlNTID0gJChMSUIpL2xpYnNzQExJQl9FWFRACitERVBMSUJDT01fRVJSID0gJChMSUIpL2xpYmNvbV9lcnJATElCX0VYVEAKK0RFUExJQlVVSUQgPSBAREVQTElCVVVJREAKK0RFUExJQkJMS0lEID0gQERFUExJQkJMS0lEQCBAUFJJVkFURV9MSUJTX0NNVEAgJChERVBMSUJVVUlEKQorCitTVEFUSUNfTElCU1MgPSAkKExJQikvbGlic3NAU1RBVElDX0xJQl9FWFRAIEBETE9QRU5fTElCQAorU1RBVElDX0xJQkNPTV9FUlIgPSAkKExJQikvbGliY29tX2VyckBTVEFUSUNfTElCX0VYVEAgQFNFTV9JTklUX0xJQkAKK1NUQVRJQ19MSUJFMlAgPSAkKExJQikvbGliZTJwQFNUQVRJQ19MSUJfRVhUQAorU1RBVElDX0xJQkVYVDJGUyA9ICQoTElCKS9saWJleHQyZnNAU1RBVElDX0xJQl9FWFRACitTVEFUSUNfTElCVVVJRCA9IEBTVEFUSUNfTElCVVVJREAgQFNPQ0tFVF9MSUJACitTVEFUSUNfTElCQkxLSUQgPSBAU1RBVElDX0xJQkJMS0lEQCAkKFNUQVRJQ19MSUJVVUlEKQorREVQU1RBVElDX0xJQlNTID0gJChMSUIpL2xpYnNzQFNUQVRJQ19MSUJfRVhUQAorREVQU1RBVElDX0xJQkNPTV9FUlIgPSAkKExJQikvbGliY29tX2VyckBTVEFUSUNfTElCX0VYVEAKK0RFUFNUQVRJQ19MSUJVVUlEID0gQERFUFNUQVRJQ19MSUJVVUlEQAorREVQU1RBVElDX0xJQkJMS0lEID0gQERFUFNUQVRJQ19MSUJCTEtJREAgJChTVEFUSUNfTElCVVVJRCkKKworUFJPRklMRURfTElCU1MgPSAkKExJQikvbGlic3NAUFJPRklMRURfTElCX0VYVEAgQERMT1BFTl9MSUJACitQUk9GSUxFRF9MSUJDT01fRVJSID0gJChMSUIpL2xpYmNvbV9lcnJAUFJPRklMRURfTElCX0VYVEAgQFNFTV9JTklUX0xJQkAKK1BST0ZJTEVEX0xJQkUyUCA9ICQoTElCKS9saWJlMnBAUFJPRklMRURfTElCX0VYVEAKK1BST0ZJTEVEX0xJQkVYVDJGUyA9ICQoTElCKS9saWJleHQyZnNAUFJPRklMRURfTElCX0VYVEAKK1BST0ZJTEVEX0xJQlVVSUQgPSBAUFJPRklMRURfTElCVVVJREAgQFNPQ0tFVF9MSUJACitQUk9GSUxFRF9MSUJCTEtJRCA9IEBQUk9GSUxFRF9MSUJCTEtJREAgJChQUk9GSUxFRF9MSUJVVUlEKQorREVQUFJPRklMRURfTElCU1MgPSAkKExJQikvbGlic3NAUFJPRklMRURfTElCX0VYVEAKK0RFUFBST0ZJTEVEX0xJQkNPTV9FUlIgPSAkKExJQikvbGliY29tX2VyckBQUk9GSUxFRF9MSUJfRVhUQAorREVQUFJPRklMRURfTElCVVVJRCA9IEBQUk9GSUxFRF9MSUJVVUlEQAorREVQUFJPRklMRURfTElCQkxLSUQgPSBAUFJPRklMRURfTElCQkxLSURAICQoUFJPRklMRURfTElCVVVJRCkKKworIyBBbiBpbmNsdWRlIGRpcmVjdGl2ZSBwb2ludGluZyB0byBhIGRpcmVjdG9yeSBob2xkaW5nIGVub3VnaCBsaW51eC1saWtlCisjIGluY2x1ZGUgZmlsZXMgdG8gc2F0aXNmeSBzb21lIHByb2dyYW1zIGhlcmUKK0xJTlVYX0lOQ0xVREU9QExJTlVYX0lOQ0xVREVACisKKyMKKyMgQSBmYXN0IHN1YnN0aXR1dGlvbiBjb21tYW5kIGZvciBmaXhpbmcgdXAgbWFuIHBhZ2VzLCBzaGVsbCBzY3JpcHRzLCBldGMuCisjCitTVUJTVF9DT05GPSQodG9wX2J1aWxkZGlyKS91dGlsL3N1YnN0LmNvbmYKK1NVQlNUSVRVVEU9ICQodG9wX2J1aWxkZGlyKS91dGlsL3N1YnN0IC1mICQoU1VCU1RfQ09ORikKK1NVQlNUSVRVVEVfVVBUSU1FPSAkKHRvcF9idWlsZGRpcikvdXRpbC9zdWJzdCAtdCAtZiAkKFNVQlNUX0NPTkYpCitERVBfU1VCU1RJVFVURT0gJCh0b3BfYnVpbGRkaXIpL3V0aWwvc3Vic3QgJChTVUJTVF9DT05GKQorCiskKHRvcF9idWlsZGRpcikvdXRpbC9zdWJzdDoKKwljZCAkKHRvcF9idWlsZGRpcikvdXRpbCA7ICQoTUFLRSkgc3Vic3QKKworIworIyBXYXJuaW5nIGZsYWdzCisjCisjIFJ1biBtYWtlIGdjYy13YWxsIHRvIGRvIGEgYnVpbGQgd2l0aCB3YXJuaW5nIG1lc3NhZ2VzLgorIworIworV0ZMQUdTPQkJLXN0ZD1jOTkgLURfWE9QRU5fU09VUkNFPTYwMCAtRF9HTlVfU09VUkNFIFwKKwkJCS1wZWRhbnRpYyAkKFdGTEFHU19FWFRSQSkgXAorCQkJLVdhbGwgLVcgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCBcCisJCQktV2Nhc3QtcXVhbCAtV2Nhc3QtYWxpZ24gLVduby12YXJpYWRpYy1tYWNyb3MgXAorCQkJLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyBcCisJCQktV2Zvcm1hdC1zZWN1cml0eSAgLVdmb3JtYXQtbm9ubGl0ZXJhbCBcCisJCQktV21pc3NpbmctZm9ybWF0LWF0dHJpYnV0ZSAtTzIgLVdzdHJpY3QtYWxpYXNpbmcgXAorCQkJLVduZXN0ZWQtZXh0ZXJucyAtV2lubGluZSAtRE5PX0lOTElORV9GVU5DUyAtV3NoYWRvdyBcCisJCQktVUVOQUJMRV9OTFMKKworZ2NjLXdhbGwtbmV3OgorCShtYWtlIFVTRV9XRkxBR1M9IiQoV0ZMQUdTKSIgPiAvZGV2L251bGwpIDI+JjEgfCBzZWQgLWYgJCh0b3Bfc3JjZGlyKS91dGlsL2djYy13YWxsLWNsZWFudXAgCisKK2djYy13YWxsOgorCW1ha2UgY2xlYW4gPiAvZGV2L251bGwKKwltYWtlIGdjYy13YWxsLW5ldworCisjCisjIEluc3RhbGxhdGlvbiB1c2VyIGFuZCBncm91cHMKKyMKK0JJTkdSUD0JCWJpbgorQklOT1dOPQkJYmluCitCSU5NT0RFPQk1NTUKK0lOQ0dSUD0JCWJpbgorSU5DT1dOPQkJYmluCitJTkNNT0RFPQk0NDQKK0xJQk9XTj0JCWJpbgorTElCR1JQPQkJYmluCitMSUJNT0RFPQk0NDQKK01BTkdSUD0JCWJpbgorTUFOT1dOPQkJYmluCitNQU5NT0RFPQk0NDQKKworIworIyBBdXRvY29uZiBtYWdpYy4uLgorIworCitERVBfTElCX01BS0VGSUxFUyA9ICQodG9wX3NyY2RpcikvbGliL01ha2VmaWxlLmxpYnJhcnkgXAorCSQodG9wX3NyY2RpcikvbGliL01ha2VmaWxlLmVsZi1saWIgIFwKKwkkKHRvcF9zcmNkaXIpL2xpYi9NYWtlZmlsZS5ic2QtbGliICQodG9wX3NyY2RpcikvbGliL01ha2VmaWxlLmRhcndpbi1saWIgXAorCSQodG9wX3NyY2RpcikvbGliL01ha2VmaWxlLnNvbGFyaXMtbGliICQodG9wX3NyY2RpcikvbGliL01ha2VmaWxlLmNoZWNrZXIgXAorCSQodG9wX3NyY2RpcikvbGliL01ha2VmaWxlLnByb2ZpbGUKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlCisJY2QgJCh0b3BfYnVpbGRkaXIpOyAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisKKyQodG9wX2J1aWxkZGlyKS9NQ09ORklHOiAkKHRvcF9zcmNkaXIpL01DT05GSUcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcik7IENPTkZJR19GSUxFUz1NQ09ORklHIC4vY29uZmlnLnN0YXR1cworCiskKHRvcF9idWlsZGRpcikvbGliL3N1YnN0aXR1dGVfc2g6ICQodG9wX3NyY2RpcikvbGliL3N1YnN0aXR1dGVfc2guaW4gXAorCQkkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKTsgQ09ORklHX0ZJTEVTPWxpYi9zdWJzdGl0dXRlX3NoIC4vY29uZmlnLnN0YXR1cworCiskKHRvcF9idWlsZGRpcikvdXRpbC9zdWJzdC5jb25mOiAkKHRvcF9zcmNkaXIpL3V0aWwvc3Vic3QuY29uZi5pbiBcCisJCSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpOyBDT05GSUdfRklMRVM9dXRpbC9zdWJzdC5jb25mIC4vY29uZmlnLnN0YXR1cworCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9NQ09ORklHIFwKKwkJJChERVBfTUFLRUZJTEUpICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpOyBDT05GSUdfRklMRVM9JChteV9kaXIpL01ha2VmaWxlIC4vY29uZmlnLnN0YXR1cworCitATUFJTlRBSU5FUl9DTVRAJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCitATUFJTlRBSU5FUl9DTVRACWNkICQodG9wX3NyY2RpcikgJiYgYXV0b2NvbmYKKworIworIyBNYWtlIGRlcGVuZCBtYWdpYy4uLgorIworCisuZGVwZW5kOiBNYWtlZmlsZSAkKFNSQ1MpICQodG9wX3NyY2RpcikvZGVwZml4LnNlZCAkKHRvcF9zcmNkaXIpL3dvcmR3cmFwLnBsCisJaWYgdGVzdCAtbiAiJChTUkNTKSIgOyB0aGVuIFwKKwkJJChDQykgLU0gJChBTExfQ0ZMQUdTKSAkKFNSQ1MpIHwgXAorCQkJJChTRUQpIC1mICQodG9wX3NyY2RpcikvZGVwZml4LnNlZCBcCisJCQkgICAgLWUgJ3M7ICQoc3JjZGlyKS87ICQkKHNyY2RpcikvO2cnIFwKKwkJCSAgICAtZSAnczsgJCh0b3Bfc3JjZGlyKS87ICQkKHRvcF9zcmNkaXIpLztnJyBcCisJCQkgICAgLWUgJ3M7ICQodG9wX2J1aWxkZGlyKS87ICQkKHRvcF9idWlsZGRpcikvO2cnIFwKKwkJCSAgICAtZSAnczsgXC4vOyA7ZycgXAorCQkJICAgIC1lICcvXiMvZCcgXAorCQkJICAgIC1lICcvXiAqXFwkJC9kJyB8IFwKKwkJCSQoUEVSTCkgJCh0b3Bfc3JjZGlyKS93b3Jkd3JhcC5wbCA+IC5kZXBlbmQ7IFwKKwllbHNlIDo7IGZpCisKK2RlcGVuZDo6IC5kZXBlbmQKKwlpZiB0ZXN0IC1uICIkKFNSQ1MpIiA7IHRoZW4gXAorCQlzZWQgLWUgJy9eIyArKysgRGVwZW5kZW5jeSBsaW5lIGVhdGVyICsrKy8sJCRkJyBcCisJCQk8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiB8IGNhdCAtIC5kZXBlbmQgXAorCQkJPiAkKHNyY2RpcikvTWFrZWZpbGUuaW4ubmV3OyBcCisJaWYgY21wIC1zICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4ubmV3IDsgdGhlbiBcCisJCSQoUk0pICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5uZXcgOyBcCisJZWxzZSBcCisJCSQoTVYpICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4ub2xkOyBcCisJCSQoTVYpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5uZXcgJChzcmNkaXIpL01ha2VmaWxlLmluOyBcCisJZmkgOyBlbHNlIDo7IGZpCisKKyMgRW5kIG9mIGZpbGUgTUNPTkZJRwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9NYWtlZmlsZS5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwOGVmZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNDQgQEAKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACit0b3BfYnVpbGRkaXIgPSAuCitteV9kaXIgPSAuCitJTlNUQUxMID0gQElOU1RBTExACisKK0BNQ09ORklHQAorCislIDogJS5zaAorCitAUkVTSVpFUl9DTVRAUkVTSVpFX0RJUj0gcmVzaXplCitAREVCVUdGU19DTVRAREVCVUdGU19ESVI9IGRlYnVnZnMKK0BVVUlEX0NNVEBVVUlEX0xJQl9TVUJESVI9IGxpYi91dWlkCitAQkxLSURfQ01UQEJMS0lEX0xJQl9TVUJESVI9IGxpYi9ibGtpZAorCitMSUJfU1VCRElSUz1saWIvZXQgbGliL3NzIGxpYi9lMnAgJChVVUlEX0xJQl9TVUJESVIpIGxpYi9leHQyZnMgJChCTEtJRF9MSUJfU1VCRElSKSBpbnRsCitQUk9HX1NVQkRJUlM9ZTJmc2NrICQoREVCVUdGU19ESVIpIG1pc2MgJChSRVNJWkVfRElSKSB0ZXN0cy9wcm9ncyBwbworU1VCRElSUz11dGlsICQoTElCX1NVQkRJUlMpICQoUFJPR19TVUJESVJTKSB0ZXN0cworCitTVUJTPSBsaWIvZXh0MmZzL2V4dDJfdHlwZXMuaCBsaWIvYmxraWQvYmxraWRfdHlwZXMuaCBsaWIvdXVpZC91dWlkX3R5cGVzLmgKKworVEFSPXRhcgorCithbGw6OiBzdWJzCisJJChNQUtFKSBsaWJzCisJJChNQUtFKSBwcm9ncworCSQoTUFLRSkgZG9jcworCitzdWJzOiAkKERFUF9TVUJTVElUVVRFKQorCUBmb3IgaSBpbiAkKFNVQlMpIDsgZG8gaWYgdGVzdCAtZCBgZGlybmFtZSAkJGlgIDsgXAorCQl0aGVuICQoTUFLRSkgJCRpIHx8IGV4aXQgJCQ/IDsgZmkgOyBkb25lCisJQChpZiB0ZXN0IC1kIGxpYi9ldCA7IHRoZW4gY2QgbGliL2V0ICYmICQoTUFLRSkgY29tcGlsZV9ldDsgZmkpCisJQChpZiB0ZXN0IC1kIGxpYi9leHQyZnMgOyB0aGVuIGNkIGxpYi9leHQyZnMgJiYgJChNQUtFKSBleHQyX2Vyci5oOyBmaSkKKworcHJvZ3M6IGFsbC1wcm9ncy1yZWN1cnNpdmUKK2xpYnM6IGFsbC1saWJzLXJlY3Vyc2l2ZQorYWxsLXByb2dzLXJlY3Vyc2l2ZSBhbGwtbGlicy1yZWN1cnNpdmU6IHN1YnMKKworZTJmc3Byb2dzLnNwZWM6ICQoREVQX1NVQlNUSVRVVEUpIGUyZnNwcm9ncy5zcGVjLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpOyBDT05GSUdfRklMRVM9Li9lMmZzcHJvZ3Muc3BlYyAuL2NvbmZpZy5zdGF0dXMKKworcnBtOiBlMmZzcHJvZ3Muc3BlYworCXNoIGNvbnRyaWIvYnVpbGQtcnBtCisKK2RvY3M6CisJLUB0ZXN0IC1kIGRvYyAmJiBjZCBkb2MgJiYgJChNQUtFKSBsaWJleHQyZnMuaW5mbworCitpbnN0YWxsLWRvYy1saWJzOgorCS1AdGVzdCAtZCBkb2MgJiYgY2QgZG9jICYmICQoTUFLRSkgaW5zdGFsbC1kb2MtbGlicworCit1bmluc3RhbGwtZG9jLWxpYnM6CisJLUB0ZXN0IC1kIGRvYyAmJiBjZCBkb2MgJiYgJChNQUtFKSB1bmluc3RhbGwtZG9jLWxpYnMKKworY2xlYW4tZG9jOgorCS1AdGVzdCAtZCBkb2MgJiYgY2QgZG9jICYmICQoTUFLRSkgY2xlYW4KKworZGlzdGNsZWFuLWRvYzoKKwktdGVzdCAtZCBkb2MgJiYgY2QgZG9jICYmICQoTUFLRSkgZGlzdGNsZWFuCisKK2luc3RhbGw6IHN1YnMgYWxsLWxpYnMtcmVjdXJzaXZlIGluc3RhbGwtcHJvZ3MtcmVjdXJzaXZlIFwKKyAgaW5zdGFsbC1zaGxpYnMtbGlicy1yZWN1cnNpdmUgaW5zdGFsbC1kb2MtbGlicworCWlmIHRlc3QgISAtZCBlMmZzY2sgJiYgdGVzdCAhIC1kIGRlYnVnZnMgJiYgdGVzdCAhIC1kIG1pc2MgJiYgdGVzdCAhIC1kIGV4dDJlZCA7IHRoZW4gJChNQUtFKSBpbnN0YWxsLWxpYnMgOyBmaQorCitpbnN0YWxsLXN0cmlwOiBzdWJzIGFsbC1saWJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXN0cmlwLXByb2dzLXJlY3Vyc2l2ZSBcCisgIGluc3RhbGwtc2hsaWJzLXN0cmlwLWxpYnMtcmVjdXJzaXZlIGluc3RhbGwtZG9jLWxpYnMKKwordW5pbnN0YWxsOiB1bmluc3RhbGwtcHJvZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbC1zaGxpYnMtbGlicy1yZWN1cnNpdmUgdW5pbnN0YWxsLWRvYy1saWJzCisKK2luc3RhbGwtbGliczogaW5zdGFsbC1saWJzLXJlY3Vyc2l2ZQorCit1bmluc3RhbGwtbGliczogdW5pbnN0YWxsLWxpYnMtcmVjdXJzaXZlCisKK1RBR1MgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgZGVwZW5kLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAorICBtb3N0bHljbGVhbi1yZWN1cnNpdmUgcmVhbGNsZWFuLXJlY3Vyc2l2ZToKKwlAZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJICBpZiB0ZXN0IC1kICQkc3ViZGlyIDsgdGhlbiBcCisJICAgIHRhcmdldD1gZWNobyAkQHwkKFNFRCkgJ3MvLXJlY3Vyc2l2ZS8vJ2A7IFwKKwkgICAgZWNobyBtYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXI7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJCR0YXJnZXQpIHx8IGV4aXQgMTsgXAorCSAgZmkgOyBcCisJZG9uZQorCithbGwtcHJvZ3MtcmVjdXJzaXZlIGluc3RhbGwtcHJvZ3MtcmVjdXJzaXZlIGluc3RhbGwtc3RyaXAtcHJvZ3MtcmVjdXJzaXZlIFwKKyAgdW5pbnN0YWxsLXByb2dzLXJlY3Vyc2l2ZTogYWxsLWxpYnMtcmVjdXJzaXZlCisJQGZvciBzdWJkaXIgaW4gJChQUk9HX1NVQkRJUlMpOyBkbyBcCisJICBpZiB0ZXN0IC1kICQkc3ViZGlyIDsgdGhlbiBcCisJICAgIHRhcmdldD1gZWNobyAkQHwkKFNFRCkgJ3MvLXByb2dzLXJlY3Vyc2l2ZS8vJ2A7IFwKKwkgICAgZWNobyBtYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXI7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJCR0YXJnZXQpIHx8IGV4aXQgMTsgXAorCSAgZmkgOyBcCisJZG9uZQorCithbGwtbGlicy1yZWN1cnNpdmUgaW5zdGFsbC1saWJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXN0cmlwLWxpYnMtcmVjdXJzaXZlIFwKKyAgdW5pbnN0YWxsLWxpYnMtcmVjdXJzaXZlIGluc3RhbGwtc2hsaWJzLWxpYnMtcmVjdXJzaXZlIFwKKyAgaW5zdGFsbC1zaGxpYnMtc3RyaXAtbGlicy1yZWN1cnNpdmUgdW5pbnN0YWxsLXNobGlicy1saWJzLXJlY3Vyc2l2ZToKKwlAZm9yIHN1YmRpciBpbiAkKExJQl9TVUJESVJTKTsgZG8gXAorCSAgaWYgdGVzdCAtZCAkJHN1YmRpciA7IHRoZW4gXAorCSAgICB0YXJnZXQ9YGVjaG8gJEB8JChTRUQpICdzLy1saWJzLXJlY3Vyc2l2ZS8vJ2A7IFwKKwkgICAgZWNobyBtYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXI7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJCR0YXJnZXQpIHx8IGV4aXQgMTsgXAorCSAgZmkgOyBcCisJZG9uZQorCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIG1vc3RseWNsZWFuLWxvY2FsCisKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUgY2xlYW4tbG9jYWwgY2xlYW4tZG9jCisJJChSTSkgLWYgJChTVUJTKSAKKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tZG9jIGRpc3RjbGVhbi1yZWN1cnNpdmUKKwkkKFJNKSAtcmYgYXV0b200dGUuY2FjaGUgZTJmc3Byb2dzLnNwZWMgZXh0MmVkL01ha2VmaWxlIHBvL3N0YW1wLXBvCisJJChNQUtFKSBkaXN0Y2xlYW4tbG9jYWwgCisKK3JlYWxjbGVhbjogcmVhbGNsZWFuLXJlY3Vyc2l2ZSByZWFsY2xlYW4tbG9jYWwKKworZGVwZW5kOjogZGVwZW5kLXJlY3Vyc2l2ZQorCitsaWIvZXh0MmZzL2V4dDJfdHlwZXMuaDogJChERVBfU1VCU1RJVFVURSkgYXNtX3R5cGVzLmggXAorCQkkKHNyY2RpcikvbGliL2V4dDJmcy9leHQyX3R5cGVzLmguaW4KKwljZCAkKHRvcF9idWlsZGRpcik7IENPTkZJR19GSUxFUz0uL2xpYi9leHQyZnMvZXh0Ml90eXBlcy5oIC4vY29uZmlnLnN0YXR1cworCitsaWIvYmxraWQvYmxraWRfdHlwZXMuaDogJChERVBfU1VCU1RJVFVURSkgYXNtX3R5cGVzLmggXAorCQkkKHNyY2RpcikvbGliL2Jsa2lkL2Jsa2lkX3R5cGVzLmguaW4KKwljZCAkKHRvcF9idWlsZGRpcik7IENPTkZJR19GSUxFUz0uL2xpYi9ibGtpZC9ibGtpZF90eXBlcy5oIC4vY29uZmlnLnN0YXR1cworCitsaWIvdXVpZC91dWlkX3R5cGVzLmg6ICQoREVQX1NVQlNUSVRVVEUpIGFzbV90eXBlcy5oIFwKKwkJJChzcmNkaXIpL2xpYi91dWlkL3V1aWRfdHlwZXMuaC5pbgorCWNkICQodG9wX2J1aWxkZGlyKTsgQ09ORklHX0ZJTEVTPS4vbGliL3V1aWQvdXVpZF90eXBlcy5oIC4vY29uZmlnLnN0YXR1cworCittb3N0bHljbGVhbi1sb2NhbDoKKwkkKFJNKSAtZiBcIyogKn4gKi5vcmlnIGNvcmUgTUFLRUxPRyAKKworY2xlYW4tbG9jYWw6IG1vc3RseWNsZWFuLWxvY2FsCisKK2Rpc3RjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwKKwkkKFJNKSAtZiAkKFNVQlMpICQoU1VCU1RfQ09ORikgXAorCQljb25maWcuc3RhdHVzIGNvbmZpZy5sb2cgY29uZmlnLmNhY2hlIE1DT05GSUcgTWFrZWZpbGUgXAorCQkkKHNyY2RpcikvVEFHUyAkKHNyY2RpcikvTWFrZWZpbGUuaW4ub2xkCisKK3JlYWxjbGVhbi1sb2NhbDogZGlzdGNsZWFuLWxvY2FsCisJJChSTSkgLWYgY29uZmlndXJlCisKK2NoZWNrOjoJc3VicyBjaGVjay1yZWN1cnNpdmUKKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9SRUFETUUuc3Vic2V0IGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9SRUFETUUuc3Vic2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWQ0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL1JFQURNRS5zdWJzZXQKQEAgLTAsMCArMSwxNSBAQAorVGhpcyBkaXN0cmlidXRpb24gY29udGFpbnMgYSBzdWJzZXQgb2YgdGhlIGUyZnNwcm9ncyBwYWNrYWdlOyBpdAorY29udGFpbnMgdGhlIGJhc2UgbGlicmFyaWVzIChzcywgZXQsIHV1aWQsIGJsa2lkKSB3aGljaCBtYXkgYmUgdXNlZCBieQorb3RoZXIgbm9uLWV4dDItcmVsYXRlZCBhcHBsaWNhdGlvbnMuCisKK1RoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igbm9uLUxpbnV4IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgbmVlZCB0aGVzZQorbGlicmFyaWVzIGZvciBHTk9NRSwgYnV0IHdobyBkbyBub3QgbmVlZCB0aGUgZXh0Mi9leHQzIGZpbGVzeXN0ZW0KK3V0aWxpdGllcy4KKworVGhlIGZ1bGwgZTJmc3Byb2dzIGRpc3RyaWJ1dGlvbnMgY2FuIGJlIGZvdW5kIGF0IHRoZSBlMmZzcHJvZ3Mgd2ViCitwYWdlLCB3aGljaCBpczoKKworCWh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0CisKK0luIGNhc2Ugb2YgYnVncyBpbiB0aGVzZSBsaWJyYXJpZXMsIHBsZWFzZSBjb250YWN0IFRlZCBUcydvIGF0Cit0eXRzb0BtaXQuZWR1IG9yIHR5dHNvQGFsdW0ubWl0LmVkdS4KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvU0hMSUJTIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9TSExJQlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYmJjMwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvU0hMSUJTCkBAIC0wLDAgKzEsMzUgQEAKK0xpYnJhcnk6bGliY29tX2Vyci5vCitEZXNjcmlwdGlvbjogQ29tbW9uIGVycm9yIGNvZGUgbGlicmFyeQorTWFpbnRhaW5lcjogVGhlb2RvcmUgVHMnbworRW1haWw6IHR5dHNvQG1pdC5lZHUKK1N0YXJ0OiAweDY2ODAwMDAwCitFbmQ6ICAgMHg2Njg3ZmZmZgorCitMaWJyYXJ5OmxpYnNzLm8KK0Rlc2NyaXB0aW9uOiBHZW5lcmljIFN1YnN5c3RlbSBsaWJyYXJ5IChTaW1wbGUgdHR5IFVJKQorTWFpbnRhaW5lcjogVGhlb2RvcmUgVHMnbworRW1haWw6IHR5dHNvQG1pdC5lZHUKK1N0YXJ0OiAweDY2ODgwMDAwCitFbmQ6ICAgMHg2NjhmZmZmZgorCitMaWJyYXJ5OmxpYmV4dDJmcy5zbworRGVzY3JpcHRpb246IFRoZSBleHQyZnMgKHJhdyBpbnRlcmZhY2UpIGxpYnJhcnkKK01haW50YWluZXI6IFRoZW9kb3JlIFRzJ28KK0VtYWlsOiB0eXRzb0BtaXQuZWR1CitTdGFydDogMHg2NjkwMDAwMAorRW5kOiAgIDB4NjY5N2ZmZmYKKworTGlicmFyeTpsaWJlMnAuc28KK0Rlc2NyaXB0aW9uOiBUaGUgZTJwIChleHQyZnMncyBwcm9ncmFtbWVycykgbGlicmFyeQorTWFpbnRhaW5lcjogVGhlb2RvcmUgVHMnbworRW1haWw6IHR5dHNvQG1pdC5lZHUKK1N0YXJ0OiAweDY2OTgwMDAwCitFbmQ6ICAgMHg2NjlmZmZmZgorCitMaWJyYXJ5OmxpYnV1aWQuc28KK0Rlc2NyaXB0aW9uOiBEQ0UgVW5pdmVyc2FsbHkgVW5pcXVlIElEIChVVUlEKSBsaWJyYXJ5CitNYWludGFpbmVyOiBUaGVvZG9yZSBUcydvCitFbWFpbDogdHl0c29AbWl0LmVkdQorU3RhcnQ6IDB4Njc5MDAwMDAKK0VuZDogICAweDY3OWZmZmZmCisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvU1VCTUlUVElORy1QQVRDSEVTIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9TVUJNSVRUSU5HLVBBVENIRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5ZGViMwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvU1VCTUlUVElORy1QQVRDSEVTCkBAIC0wLDAgKzEsMzkgQEAKKworTGlrZSB0aGUgTGludXgga2VybmVsLCBzdWJtaXR0ZWQgZTJmc3Byb2dzIHBhdGNoZXMgbm93IHJlcXVpcmUgdGhlCitmb2xsb3dpbmcgInNpZ24tb2ZmIiBwcm9jZWR1cmU6CisKK1RoZSBzaWduLW9mZiBpcyBhIHNpbXBsZSBsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGV4cGxhbmF0aW9uIGZvciB0aGUKK3BhdGNoLCB3aGljaCBjZXJ0aWZpZXMgdGhhdCB5b3Ugd3JvdGUgaXQgb3Igb3RoZXJ3aXNlIGhhdmUgdGhlIHJpZ2h0IHRvCitwYXNzIGl0IG9uIGFzIGEgb3Blbi1zb3VyY2UgcGF0Y2guICBUaGUgcnVsZXMgYXJlIHByZXR0eSBzaW1wbGU6IGlmIHlvdQorY2FuIGNlcnRpZnkgdGhlIGJlbG93OgorCisgICAgICAgIERldmVsb3BlcidzIENlcnRpZmljYXRlIG9mIE9yaWdpbiAxLjEKKworICAgICAgICBCeSBtYWtpbmcgYSBjb250cmlidXRpb24gdG8gdGhpcyBwcm9qZWN0LCBJIGNlcnRpZnkgdGhhdDoKKworICAgICAgICAoYSkgVGhlIGNvbnRyaWJ1dGlvbiB3YXMgY3JlYXRlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IGJ5IG1lIGFuZCBJCisgICAgICAgICAgICBoYXZlIHRoZSByaWdodCB0byBzdWJtaXQgaXQgdW5kZXIgdGhlIG9wZW4gc291cmNlIGxpY2Vuc2UKKyAgICAgICAgICAgIGluZGljYXRlZCBpbiB0aGUgZmlsZTsgb3IKKworICAgICAgICAoYikgVGhlIGNvbnRyaWJ1dGlvbiBpcyBiYXNlZCB1cG9uIHByZXZpb3VzIHdvcmsgdGhhdCwgdG8gdGhlIGJlc3QKKyAgICAgICAgICAgIG9mIG15IGtub3dsZWRnZSwgaXMgY292ZXJlZCB1bmRlciBhbiBhcHByb3ByaWF0ZSBvcGVuIHNvdXJjZQorICAgICAgICAgICAgbGljZW5zZSBhbmQgSSBoYXZlIHRoZSByaWdodCB1bmRlciB0aGF0IGxpY2Vuc2UgdG8gc3VibWl0IHRoYXQKKyAgICAgICAgICAgIHdvcmsgd2l0aCBtb2RpZmljYXRpb25zLCB3aGV0aGVyIGNyZWF0ZWQgaW4gd2hvbGUgb3IgaW4gcGFydAorICAgICAgICAgICAgYnkgbWUsIHVuZGVyIHRoZSBzYW1lIG9wZW4gc291cmNlIGxpY2Vuc2UgKHVubGVzcyBJIGFtCisgICAgICAgICAgICBwZXJtaXR0ZWQgdG8gc3VibWl0IHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UpLCBhcyBpbmRpY2F0ZWQKKyAgICAgICAgICAgIGluIHRoZSBmaWxlOyBvcgorCisgICAgICAgIChjKSBUaGUgY29udHJpYnV0aW9uIHdhcyBwcm92aWRlZCBkaXJlY3RseSB0byBtZSBieSBzb21lIG90aGVyCisgICAgICAgICAgICBwZXJzb24gd2hvIGNlcnRpZmllZCAoYSksIChiKSBvciAoYykgYW5kIEkgaGF2ZSBub3QgbW9kaWZpZWQKKyAgICAgICAgICAgIGl0LgorCisJKGQpIEkgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCB0aGlzIHByb2plY3QgYW5kIHRoZSBjb250cmlidXRpb24KKwkgICAgYXJlIHB1YmxpYyBhbmQgdGhhdCBhIHJlY29yZCBvZiB0aGUgY29udHJpYnV0aW9uIChpbmNsdWRpbmcgYWxsCisJICAgIHBlcnNvbmFsIGluZm9ybWF0aW9uIEkgc3VibWl0IHdpdGggaXQsIGluY2x1ZGluZyBteSBzaWduLW9mZikgaXMKKwkgICAgbWFpbnRhaW5lZCBpbmRlZmluaXRlbHkgYW5kIG1heSBiZSByZWRpc3RyaWJ1dGVkIGNvbnNpc3RlbnQgd2l0aAorCSAgICB0aGlzIHByb2plY3Qgb3IgdGhlIG9wZW4gc291cmNlIGxpY2Vuc2UocykgaW52b2x2ZWQuCisKK3RoZW4geW91IGp1c3QgYWRkIGEgbGluZSBzYXlpbmcKKworCVNpZ25lZC1vZmYtYnk6IFJhbmRvbSBKIERldmVsb3BlciA8cmFuZG9tQGRldmVsb3Blci5leGFtcGxlLm9yZz4KKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9hY2xvY2FsLm00IGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDQ2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2FjbG9jYWwubTQKQEAgLTAsMCArMSwyNzc3IEBACisjIGNvZGVzZXQubTQgc2VyaWFsIEFNMSAoZ2V0dGV4dC0wLjEwLjQwKQorZG5sIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK0FDX0RFRlVOKFtBTV9MQU5HSU5GT19DT0RFU0VUXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBubF9sYW5naW5mbyBhbmQgQ09ERVNFVF0sIGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQsCisgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGFuZ2luZm8uaD5dLAorICAgICAgW2NoYXIqIGNzID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7XSwKKyAgICAgIGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQ9eWVzLAorICAgICAgYW1fY3ZfbGFuZ2luZm9fY29kZXNldD1ubykKKyAgICBdKQorICBpZiB0ZXN0ICRhbV9jdl9sYW5naW5mb19jb2Rlc2V0ID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfTEFOR0lORk9fQ09ERVNFVCwgMSwKKyAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgPGxhbmdpbmZvLmg+IGFuZCBubF9sYW5naW5mbyhDT0RFU0VUKS5dKQorICBmaQorXSkKKyMgZ2V0dGV4dC5tNCBzZXJpYWwgMjggKGdldHRleHQtMC4xMykKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KK2RubAorZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKK2RubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorZG5sIGZ1bmN0aW9uYWxpdHkuCitkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAorZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorZG5sIGdldHRleHQgcGFja2FnZSBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorZG5sIFRoZXkgYXJlICpub3QqIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCitkbmwgQXV0aG9yczoKK2RubCAgIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LTIwMDAuCitkbmwgICBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4sIDIwMDAtMjAwMy4KKworZG5sIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCisKK2RubCBVc2FnZTogQU1fR05VX0dFVFRFWFQoW0lOVExTWU1CT0xdLCBbTkVFRFNZTUJPTF0sIFtJTlRMRElSXSkuCitkbmwgSU5UTFNZTUJPTCBjYW4gYmUgb25lIG9mICdleHRlcm5hbCcsICduby1saWJ0b29sJywgJ3VzZS1saWJ0b29sJy4gVGhlCitkbmwgICAgZGVmYXVsdCAoaWYgaXQgaXMgbm90IHNwZWNpZmllZCBvciBlbXB0eSkgaXMgJ25vLWxpYnRvb2wnLgorZG5sICAgIElOVExTWU1CT0wgc2hvdWxkIGJlICdleHRlcm5hbCcgZm9yIHBhY2thZ2VzIHdpdGggbm8gaW50bCBkaXJlY3RvcnksCitkbmwgICAgYW5kICduby1saWJ0b29sJyBvciAndXNlLWxpYnRvb2wnIGZvciBwYWNrYWdlcyB3aXRoIGFuIGludGwgZGlyZWN0b3J5LgorZG5sICAgIElmIElOVExTWU1CT0wgaXMgJ3VzZS1saWJ0b29sJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeQorZG5sICAgICQodG9wX2J1aWxkZGlyKS9pbnRsL2xpYmludGwubGEgd2lsbCBiZSBjcmVhdGVkIChzaGFyZWQgYW5kL29yIHN0YXRpYywKK2RubCAgICBkZXBlbmRpbmcgb24gLS17ZW5hYmxlLGRpc2FibGV9LXtzaGFyZWQsc3RhdGljfSBhbmQgb24gdGhlIHByZXNlbmNlIG9mCitkbmwgICAgQU0tRElTQUJMRS1TSEFSRUQpLiBJZiBJTlRMU1lNQk9MIGlzICduby1saWJ0b29sJywgYSBzdGF0aWMgbGlicmFyeQorZG5sICAgICQodG9wX2J1aWxkZGlyKS9pbnRsL2xpYmludGwuYSB3aWxsIGJlIGNyZWF0ZWQuCitkbmwgSWYgTkVFRFNZTUJPTCBpcyBzcGVjaWZpZWQgYW5kIGlzICduZWVkLW5nZXR0ZXh0JywgdGhlbiBHTlUgZ2V0dGV4dAorZG5sICAgIGltcGxlbWVudGF0aW9ucyAoaW4gbGliYyBvciBsaWJpbnRsKSB3aXRob3V0IHRoZSBuZ2V0dGV4dCgpIGZ1bmN0aW9uCitkbmwgICAgd2lsbCBiZSBpZ25vcmVkLiAgSWYgTkVFRFNZTUJPTCBpcyBzcGVjaWZpZWQgYW5kIGlzCitkbmwgICAgJ25lZWQtZm9ybWF0c3RyaW5nLW1hY3JvcycsIHRoZW4gR05VIGdldHRleHQgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QKK2RubCAgICBzdXBwb3J0IHRoZSBJU08gQyA5OSA8aW50dHlwZXMuaD4gZm9ybWF0c3RyaW5nIG1hY3JvcyB3aWxsIGJlIGlnbm9yZWQuCitkbmwgSU5UTERJUiBpcyB1c2VkIHRvIGZpbmQgdGhlIGludGwgbGlicmFyaWVzLiAgSWYgZW1wdHksCitkbmwgICAgdGhlIHZhbHVlIGAkKHRvcF9idWlsZGRpcikvaW50bC8nIGlzIHVzZWQuCitkbmwKK2RubCBUaGUgcmVzdWx0IG9mIHRoZSBjb25maWd1cmF0aW9uIGlzIG9uZSBvZiB0aHJlZSBjYXNlczoKK2RubCAxKSBHTlUgZ2V0dGV4dCwgYXMgaW5jbHVkZWQgaW4gdGhlIGludGwgc3ViZGlyZWN0b3J5LCB3aWxsIGJlIGNvbXBpbGVkCitkbmwgICAgYW5kIHVzZWQuCitkbmwgICAgQ2F0YWxvZyBmb3JtYXQ6IEdOVSAtLT4gaW5zdGFsbCBpbiAkKGRhdGFkaXIpCitkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IC5tbyBhZnRlciBpbnN0YWxsYXRpb24sIC5nbW8gaW4gc291cmNlIHRyZWUKK2RubCAyKSBHTlUgZ2V0dGV4dCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgc3lzdGVtJ3MgQyBsaWJyYXJ5LgorZG5sICAgIENhdGFsb2cgZm9ybWF0OiBHTlUgLS0+IGluc3RhbGwgaW4gJChkYXRhZGlyKQorZG5sICAgIENhdGFsb2cgZXh0ZW5zaW9uOiAubW8gYWZ0ZXIgaW5zdGFsbGF0aW9uLCAuZ21vIGluIHNvdXJjZSB0cmVlCitkbmwgMykgTm8gaW50ZXJuYXRpb25hbGl6YXRpb24sIGFsd2F5cyB1c2UgRW5nbGlzaCBtc2dpZC4KK2RubCAgICBDYXRhbG9nIGZvcm1hdDogbm9uZQorZG5sICAgIENhdGFsb2cgZXh0ZW5zaW9uOiBub25lCitkbmwgSWYgSU5UTFNZTUJPTCBpcyAnZXh0ZXJuYWwnLCBvbmx5IGNhc2VzIDIgYW5kIDMgY2FuIG9jY3VyLgorZG5sIFRoZSB1c2Ugb2YgLmdtbyBpcyBoaXN0b3JpY2FsIChpdCB3YXMgbmVlZGVkIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHRoZQorZG5sIEdOVSBmb3JtYXQgY2F0YWxvZ3Mgd2hlbiBidWlsZGluZyBvbiBhIHBsYXRmb3JtIHdpdGggYW4gWC9PcGVuIGdldHRleHQpLAorZG5sIGJ1dCB3ZSBrZWVwIGl0IGluIG9yZGVyIG5vdCB0byBmb3JjZSBpcnJlbGV2YW50IGZpbGVuYW1lIGNoYW5nZXMgb24gdGhlCitkbmwgbWFpbnRhaW5lcnMuCitkbmwKK0FDX0RFRlVOKFtBTV9HTlVfR0VUVEVYVF0sCitbCisgIGRubCBBcmd1bWVudCBjaGVja2luZy4KKyAgaWZlbHNlKFskMV0sIFtdLCAsIFtpZmVsc2UoWyQxXSwgW2V4dGVybmFsXSwgLCBbaWZlbHNlKFskMV0sIFtuby1saWJ0b29sXSwgLCBbaWZlbHNlKFskMV0sIFt1c2UtbGlidG9vbF0sICwKKyAgICBbZXJycHJpbnQoW0VSUk9SOiBpbnZhbGlkIGZpcnN0IGFyZ3VtZW50IHRvIEFNX0dOVV9HRVRURVhUCitdKV0pXSldKV0pCisgIGlmZWxzZShbJDJdLCBbXSwgLCBbaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgLCBbaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLCAsCisgICAgW2VycnByaW50KFtFUlJPUjogaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgdG8gQU1fR05VX0dFVFRFWFQKK10pXSldKV0pCisgIGRlZmluZShndF9pbmNsdWRlZF9pbnRsLCBpZmVsc2UoWyQxXSwgW2V4dGVybmFsXSwgW25vXSwgW3llc10pKQorICBkZWZpbmUoZ3RfbGlidG9vbF9zdWZmaXhfcHJlZml4LCBpZmVsc2UoWyQxXSwgW3VzZS1saWJ0b29sXSwgW2xdLCBbXSkpCisKKyAgQUNfUkVRVUlSRShbQU1fUE9fU1VCRElSU10pZG5sCisgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKKyAgICBBQ19SRVFVSVJFKFtBTV9JTlRMX1NVQkRJUl0pZG5sCisgIF0pCisKKyAgZG5sIFByZXJlcXVpc2l0ZXMgb2YgQUNfTElCX0xJTktGTEFHU19CT0RZLgorICBBQ19SRVFVSVJFKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdKQorICBBQ19SRVFVSVJFKFtBQ19MSUJfUlBBVEhdKQorCisgIGRubCBTb21ldGltZXMgbGliaW50bCByZXF1aXJlcyBsaWJpY29udiwgc28gZmlyc3Qgc2VhcmNoIGZvciBsaWJpY29udi4KKyAgZG5sIElkZWFsbHkgd2Ugd291bGQgZG8gdGhpcyBzZWFyY2ggb25seSBhZnRlciB0aGUKKyAgZG5sICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgZG5sICAgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisgIGRubCB0ZXN0cy4gQnV0IGlmIGNvbmZpZ3VyZS5pbiBpbnZva2VzIEFNX0lDT05WIGFmdGVyIEFNX0dOVV9HRVRURVhUCisgIGRubCB0aGUgY29uZmlndXJlIHNjcmlwdCB3b3VsZCBuZWVkIHRvIGNvbnRhaW4gdGhlIHNhbWUgc2hlbGwgY29kZQorICBkbmwgYWdhaW4sIG91dHNpZGUgYW55ICdpZicuIFRoZXJlIGFyZSB0d28gc29sdXRpb25zOgorICBkbmwgLSBJbnZva2UgQU1fSUNPTlZfTElOS0ZMQUdTX0JPRFkgaGVyZSwgb3V0c2lkZSBhbnkgJ2lmJy4KKyAgZG5sIC0gQ29udHJvbCB0aGUgZXhwYW5zaW9ucyBpbiBtb3JlIGRldGFpbCB1c2luZyBBQ19QUk9WSURFX0lGRUxTRS4KKyAgZG5sIFNpbmNlIEFDX1BST1ZJREVfSUZFTFNFIGlzIG9ubHkgaW4gYXV0b2NvbmYgPj0gMi41MiBhbmQgbm90CisgIGRubCBkb2N1bWVudGVkLCB3ZSBhdm9pZCBpdC4KKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgLCBbCisgICAgQUNfUkVRVUlSRShbQU1fSUNPTlZfTElOS0ZMQUdTX0JPRFldKQorICBdKQorCisgIGRubCBTZXQgVVNFX05MUy4KKyAgQU1fTkxTCisKKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9bm8KKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworICBdKQorICBMSUJJTlRMPQorICBMVExJQklOVEw9CisgIFBPU1VCPQorCisgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKKyAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICBndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQ9bm8KKyAgICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQorICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKKyAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAorICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAorICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQorICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICBdKQorICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0CisgICAgICAgIGRubCB0byB1c2UuICBJZiBHTlUgZ2V0dGV4dCBpcyBhdmFpbGFibGUgd2UgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUKKyAgICAgICAgZG5sIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCisKKyAgICAgICAgZG5sIEFkZCBhIHZlcnNpb24gbnVtYmVyIHRvIHRoZSBjYWNoZSBtYWNyb3MuCisgICAgICAgIGRlZmluZShbZ3RfYXBpX3ZlcnNpb25dLCBpZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sIDMsIGlmZWxzZShbJDJdLCBbbmVlZC1uZ2V0dGV4dF0sIDIsIDEpKSkKKyAgICAgICAgZGVmaW5lKFtndF9jdl9mdW5jX2dudWdldHRleHRfbGliY10sIFtndF9jdl9mdW5jX2dudWdldHRleHRdZ3RfYXBpX3ZlcnNpb25bX2xpYmNdKQorICAgICAgICBkZWZpbmUoW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsXSwgW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF1ndF9hcGlfdmVyc2lvbltfbGliaW50bF0pCisKKyAgICAgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBHTlUgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmMsCisgICAgICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CitdaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLAorWyNpZm5kZWYgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisjZW5kaWYKK2NoYW5nZXF1b3RlKCwpZG5sCit0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworY2hhbmdlcXVvdGUoWyxdKWRubAorXSwgW10pW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKK2V4dGVybiBpbnQgKl9ubF9kb21haW5fYmluZGluZ3M7XSwKKyAgICAgICAgICAgIFtiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgWyArIChpbnQpIG5nZXR0ZXh0ICgiIiwgIiIsIDApXSwgW10pWyArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2RvbWFpbl9iaW5kaW5nc10sCisgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliYz15ZXMsCisgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliYz1ubyldKQorCisgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICBkbmwgU29tZXRpbWVzIGxpYmludGwgcmVxdWlyZXMgbGliaWNvbnYsIHNvIGZpcnN0IHNlYXJjaCBmb3IgbGliaWNvbnYuCisgICAgICAgICAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgLCBbCisgICAgICAgICAgICBBTV9JQ09OVl9MSU5LCisgICAgICAgICAgXSkKKyAgICAgICAgICBkbmwgU2VhcmNoIGZvciBsaWJpbnRsIGFuZCBkZWZpbmUgTElCSU5UTCwgTFRMSUJJTlRMIGFuZCBJTkNJTlRMCisgICAgICAgICAgZG5sIGFjY29yZGluZ2x5LiBEb24ndCB1c2UgQUNfTElCX0xJTktGTEFHU19CT0RZKFtpbnRsXSxbaWNvbnZdKQorICAgICAgICAgIGRubCBiZWNhdXNlIHRoYXQgd291bGQgYWRkICItbGljb252IiB0byBMSUJJTlRMIGFuZCBMVExJQklOVEwKKyAgICAgICAgICBkbmwgZXZlbiBpZiBsaWJpY29udiBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShbaW50bF0pCisgICAgICAgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBHTlUgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKKyAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsLAorICAgICAgICAgICBbZ3Rfc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkSU5DSU5UTCIKKyAgICAgICAgICAgIGd0X3NhdmVfTElCUz0iJExJQlMiCisgICAgICAgICAgICBMSUJTPSIkTElCUyAkTElCSU5UTCIKKyAgICAgICAgICAgIGRubCBOb3cgc2VlIHdoZXRoZXIgbGliaW50bCBleGlzdHMgYW5kIGRvZXMgbm90IGRlcGVuZCBvbiBsaWJpY29udi4KKyAgICAgICAgICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPgorXWlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwKK1sjaWZuZGVmIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OCisjZGVmaW5lIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKG1ham9yKSAoKG1ham9yKSA9PSAwID8gMCA6IC0xKQorI2VuZGlmCitjaGFuZ2VxdW90ZSgsKWRubAordHlwZWRlZiBpbnQgYXJyYXkgWzIgKiAoX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04oMCkgPj0gMSkgLSAxXTsKK2NoYW5nZXF1b3RlKFssXSlkbmwKK10sIFtdKVtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CitleHRlcm4KKyNpZmRlZiBfX2NwbHVzcGx1cworIkMiCisjZW5kaWYKK2NvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKCk7XSwKKyAgICAgICAgICAgICAgW2JpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV1pZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCBbICsgKGludCkgbmdldHRleHQgKCIiLCAiIiwgMCldLCBbXSlbICsgX25sX21zZ19jYXRfY250ciArICpfbmxfZXhwYW5kX2FsaWFzICgwKV0sCisgICAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPXllcywKKyAgICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGw9bm8pCisgICAgICAgICAgICBkbmwgTm93IHNlZSB3aGV0aGVyIGxpYmludGwgZXhpc3RzIGFuZCBkZXBlbmRzIG9uIGxpYmljb252LgorICAgICAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsIiAhPSB5ZXMgJiYgdGVzdCAtbiAiJExJQklDT05WIjsgdGhlbgorICAgICAgICAgICAgICBMSUJTPSIkTElCUyAkTElCSUNPTlYiCisgICAgICAgICAgICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPgorXWlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwKK1sjaWZuZGVmIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OCisjZGVmaW5lIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKG1ham9yKSAoKG1ham9yKSA9PSAwID8gMCA6IC0xKQorI2VuZGlmCitjaGFuZ2VxdW90ZSgsKWRubAordHlwZWRlZiBpbnQgYXJyYXkgWzIgKiAoX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04oMCkgPj0gMSkgLSAxXTsKK2NoYW5nZXF1b3RlKFssXSlkbmwKK10sIFtdKVtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CitleHRlcm4KKyNpZmRlZiBfX2NwbHVzcGx1cworIkMiCisjZW5kaWYKK2NvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKCk7XSwKKyAgICAgICAgICAgICAgICBbYmluZHRleHRkb21haW4gKCIiLCAiIik7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXWlmZWxzZShbJDJdLCBbbmVlZC1uZ2V0dGV4dF0sIFsgKyAoaW50KSBuZ2V0dGV4dCAoIiIsICIiLCAwKV0sIFtdKVsgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9leHBhbmRfYWxpYXMgKDApXSwKKyAgICAgICAgICAgICAgIFtMSUJJTlRMPSIkTElCSU5UTCAkTElCSUNPTlYiCisgICAgICAgICAgICAgICAgTFRMSUJJTlRMPSIkTFRMSUJJTlRMICRMVExJQklDT05WIgorICAgICAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPXllcworICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBDUFBGTEFHUz0iJGd0X3NhdmVfQ1BQRkxBR1MiCisgICAgICAgICAgICBMSUJTPSIkZ3Rfc2F2ZV9MSUJTIl0pCisgICAgICAgIGZpCisKKyAgICAgICAgZG5sIElmIGFuIGFscmVhZHkgcHJlc2VudCBvciBwcmVpbnN0YWxsZWQgR05VIGdldHRleHQoKSBpcyBmb3VuZCwKKyAgICAgICAgZG5sIHVzZSBpdC4gIEJ1dCBpZiB0aGlzIG1hY3JvIGlzIHVzZWQgaW4gR05VIGdldHRleHQsIGFuZCBHTlUKKyAgICAgICAgZG5sIGdldHRleHQgaXMgYWxyZWFkeSBwcmVpbnN0YWxsZWQgaW4gbGliaW50bCwgd2UgdXBkYXRlIHRoaXMKKyAgICAgICAgZG5sIGxpYmludGwuICAoQ2YuIHRoZSBpbnN0YWxsIHJ1bGUgaW4gaW50bC9NYWtlZmlsZS5pbi4pCisgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliYyIgPSAieWVzIiBcCisgICAgICAgICAgIHx8IHsgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiIFwKKyAgICAgICAgICAgICAgICAmJiB0ZXN0ICIkUEFDS0FHRSIgIT0gZ2V0dGV4dC1ydW50aW1lIFwKKyAgICAgICAgICAgICAgICAmJiB0ZXN0ICIkUEFDS0FHRSIgIT0gZ2V0dGV4dC10b29sczsgfTsgdGhlbgorICAgICAgICAgIGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dD15ZXMKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRubCBSZXNldCB0aGUgdmFsdWVzIHNldCBieSBzZWFyY2hpbmcgZm9yIGxpYmludGwuCisgICAgICAgICAgTElCSU5UTD0KKyAgICAgICAgICBMVExJQklOVEw9CisgICAgICAgICAgSU5DSU5UTD0KKyAgICAgICAgZmkKKworICAgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKKyAgICAgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICBkbmwgR05VIGdldHRleHQgaXMgbm90IGZvdW5kIGluIHRoZSBDIGxpYnJhcnkuCisgICAgICAgICAgZG5sIEZhbGwgYmFjayBvbiBpbmNsdWRlZCBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgorICAgICAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgorICAgICAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgTElCSU5UTD0iaWZlbHNlKFskM10sW10sXCR7dG9wX2J1aWxkZGlyfS9pbnRsLFskM10pL2xpYmludGwuW11ndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXhbXWEgJExJQklDT05WIgorICAgICAgICBMVExJQklOVEw9ImlmZWxzZShbJDNdLFtdLFwke3RvcF9idWlsZGRpcn0vaW50bCxbJDNdKS9saWJpbnRsLltdZ3RfbGlidG9vbF9zdWZmaXhfcHJlZml4W11hICRMVExJQklDT05WIgorICAgICAgICBMSUJTPWBlY2hvICIgJExJQlMgIiB8IHNlZCAtZSAncy8gLWxpbnRsIC8gLycgLWUgJ3MvXiAvLycgLWUgJ3MvICQvLydgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiIFwKKyAgICAgICAgIHx8IHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdG8gdXNlIEdOVSBnZXR0ZXh0IHRvb2xzLgorICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgZmkKKyAgICBdKQorCisgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIiBcCisgICAgICAgfHwgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLAorICAgICAgICBbRGVmaW5lIHRvIDEgaWYgdHJhbnNsYXRpb24gb2YgcHJvZ3JhbSBtZXNzYWdlcyB0byB0aGUgdXNlcidzIG5hdGl2ZSBsYW5ndWFnZQorICAgaXMgcmVxdWVzdGVkLl0pCisgICAgZWxzZQorICAgICAgVVNFX05MUz1ubworICAgIGZpCisgIGZpCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHVzZSBOTFNdKQorICBBQ19NU0dfUkVTVUxUKFskVVNFX05MU10pCisgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGVyZSB0aGUgZ2V0dGV4dCBmdW5jdGlvbiBjb21lcyBmcm9tXSkKKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKyAgICAgICAgZ3Rfc291cmNlPSJleHRlcm5hbCBsaWJpbnRsIgorICAgICAgZWxzZQorICAgICAgICBndF9zb3VyY2U9ImxpYmMiCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGd0X3NvdXJjZT0iaW5jbHVkZWQgaW50bCBkaXJlY3RvcnkiCisgICAgZmkKKyAgICBBQ19NU0dfUkVTVUxUKFskZ3Rfc291cmNlXSkKKyAgZmkKKworICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorCisgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaG93IHRvIGxpbmsgd2l0aCBsaWJpbnRsXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJExJQklOVExdKQorICAgICAgICBBQ19MSUJfQVBQRU5EVE9WQVIoW0NQUEZMQUdTXSwgWyRJTkNJTlRMXSkKKyAgICAgIGZpCisKKyAgICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBwYWNrYWdlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCisgICAgICAgW0RlZmluZSBpZiB0aGUgR05VIGdldHRleHQoKSBmdW5jdGlvbiBpcyBhbHJlYWR5IHByZXNlbnQgb3IgcHJlaW5zdGFsbGVkLl0pCisgICAgICBBQ19ERUZJTkUoSEFWRV9EQ0dFVFRFWFQsIDEsCisgICAgICAgW0RlZmluZSBpZiB0aGUgR05VIGRjZ2V0dGV4dCgpIGZ1bmN0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBvciBwcmVpbnN0YWxsZWQuXSkKKyAgICBmaQorCisgICAgZG5sIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICBQT1NVQj1wbworICBmaQorCisgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKKyAgICBkbmwgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IEJVSUxEX0lOQ0xVREVEX0xJQklOVEwKKyAgICBkbmwgdG8gJ3llcycgYmVjYXVzZSBzb21lIG9mIHRoZSB0ZXN0c3VpdGUgcmVxdWlyZXMgaXQuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dC1ydW50aW1lIHx8IHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQtdG9vbHM7IHRoZW4KKyAgICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgorICAgIEFDX1NVQlNUKEJVSUxEX0lOQ0xVREVEX0xJQklOVEwpCisgICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCisgICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQorCisgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIGNvbmZpZ3VyZS5pbnMgbWF5IGJlIHVzaW5nIHRoaXMuCisgICAgbmxzX2N2X2hlYWRlcl9pbnRsPQorICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9CisKKyAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgTWFrZWZpbGVzIG1heSBiZSB1c2luZyB0aGlzLgorICAgIERBVEFESVJOQU1FPXNoYXJlCisgICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCisKKyAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgTWFrZWZpbGVzIG1heSBiZSB1c2luZyB0aGlzLgorICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKKworICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisgICAgR0VOQ0FUPWdlbmNhdAorICAgIEFDX1NVQlNUKEdFTkNBVCkKKworICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisgICAgaWYgdGVzdCAiJFVTRV9JTkNMVURFRF9MSUJJTlRMIiA9IHllczsgdGhlbgorICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICBmaQorICAgIEFDX1NVQlNUKElOVExPQkpTKQorCisgICAgZG5sIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgaWYgdGhlIHN1cnJvdW5kaW5nIHBhY2thZ2Ugd2lzaGVzIGl0LgorICAgIElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYPWd0X2xpYnRvb2xfc3VmZml4X3ByZWZpeAorICAgIEFDX1NVQlNUKElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYKQorICBdKQorCisgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisgIElOVExMSUJTPSIkTElCSU5UTCIKKyAgQUNfU1VCU1QoSU5UTExJQlMpCisKKyAgZG5sIE1ha2UgYWxsIGRvY3VtZW50ZWQgdmFyaWFibGVzIGtub3duIHRvIGF1dG9jb25mLgorICBBQ19TVUJTVChMSUJJTlRMKQorICBBQ19TVUJTVChMVExJQklOVEwpCisgIEFDX1NVQlNUKFBPU1VCKQorXSkKKworCitkbmwgQ2hlY2tzIGZvciBhbGwgcHJlcmVxdWlzaXRlcyBvZiB0aGUgaW50bCBzdWJkaXJlY3RvcnksCitkbmwgZXhjZXB0IGZvciBJTlRMX0xJQlRPT0xfU1VGRklYX1BSRUZJWCAoYW5kIHBvc3NpYmx5IExJQlRPT0wpLCBJTlRMT0JKUywKK2RubCAgICAgICAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMLCBCVUlMRF9JTkNMVURFRF9MSUJJTlRMLgorQUNfREVGVU4oW0FNX0lOVExfU1VCRElSXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKKyAgQUNfUkVRVUlSRShbQU1fTUtJTlNUQUxMRElSU10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAorICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKKyAgQUNfUkVRVUlSRShbYmhfQ19TSUdORURdKWRubAorICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAorICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCisgIEFDX1JFUVVJUkUoW2ptX0FDX1RZUEVfTE9OR19MT05HXSlkbmwKKyAgQUNfUkVRVUlSRShbZ3RfVFlQRV9MT05HRE9VQkxFXSlkbmwKKyAgQUNfUkVRVUlSRShbZ3RfVFlQRV9XQ0hBUl9UXSlkbmwKKyAgQUNfUkVRVUlSRShbZ3RfVFlQRV9XSU5UX1RdKWRubAorICBBQ19SRVFVSVJFKFtqbV9BQ19IRUFERVJfSU5UVFlQRVNfSF0pCisgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9TVERJTlRfSF0pCisgIEFDX1JFUVVJUkUoW2d0X1RZUEVfSU5UTUFYX1RdKQorICBBQ19SRVFVSVJFKFtndF9QUklOVEZfUE9TSVhdKQorICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCisgIEFDX1JFUVVJUkUoW2ptX0dMSUJDMjFdKWRubAorICBBQ19SRVFVSVJFKFtndF9JTlRESVYwXSlkbmwKKyAgQUNfUkVRVUlSRShbam1fQUNfVFlQRV9VSU5UTUFYX1RdKWRubAorICBBQ19SRVFVSVJFKFtndF9IRUFERVJfSU5UVFlQRVNfSF0pZG5sCisgIEFDX1JFUVVJUkUoW2d0X0lOVFRZUEVTX1BSSV0pZG5sCisgIEFDX1JFUVVJUkUoW2dsX1hTSVpFXSlkbmwKKworICBBQ19DSEVDS19UWVBFKFtwdHJkaWZmX3RdLCAsCisgICAgW0FDX0RFRklORShbcHRyZGlmZl90XSwgW2xvbmddLAorICAgICAgIFtEZWZpbmUgYXMgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyB0d28gcG9pbnRlcnMsIGlmIHRoZSBzeXN0ZW0gZG9lc24ndCBkZWZpbmUgaXQuXSkKKyAgICBdKQorICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdGRkZWYuaCBcCitzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzeXMvcGFyYW0uaF0pCisgIEFDX0NIRUNLX0ZVTkNTKFthc3ByaW50ZiBmd3ByaW50ZiBnZXRjd2QgZ2V0ZWdpZCBnZXRldWlkIGdldGdpZCBnZXR1aWQgXAorbWVtcGNweSBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc25wcmludGYgc3RwY3B5IHN0cmNhc2VjbXAgc3RyZHVwIFwKK3N0cnRvdWwgdHNlYXJjaCB3Y3NsZW4gX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQgXAorX19mc2V0bG9ja2luZ10pCisKKyAgZG5sIFVzZSB0aGUgX3NucHJpbnRmIGZ1bmN0aW9uIG9ubHkgaWYgaXQgaXMgZGVjbGFyZWQgKGJlY2F1c2Ugb24gTmV0QlNEIGl0CisgIGRubCBpcyBkZWZpbmVkIGFzIGEgd2VhayBhbGlhcyBvZiBzbnByaW50Zjsgd2UgcHJlZmVyIHRvIHVzZSB0aGUgbGF0dGVyKS4KKyAgZ3RfQ0hFQ0tfREVDTChfc25wcmludGYsIFsjaW5jbHVkZSA8c3RkaW8uaD5dKQorICBndF9DSEVDS19ERUNMKF9zbndwcmludGYsIFsjaW5jbHVkZSA8c3RkaW8uaD5dKQorCisgIGRubCBVc2UgdGhlICpfdW5sb2NrZWQgZnVuY3Rpb25zIG9ubHkgaWYgdGhleSBhcmUgZGVjbGFyZWQuCisgIGRubCAoYmVjYXVzZSBzb21lIG9mIHRoZW0gd2VyZSBkZWZpbmVkIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQgaW4gU29sYXJpcworICBkbmwgMi41LjEgYnV0IHdlcmUgcmVtb3ZlZCBpbiBTb2xhcmlzIDIuNiwgd2hlcmVhcyB3ZSB3YW50IGJpbmFyaWVzIGJ1aWx0CisgIGRubCBvbiBTb2xhcmlzIDIuNS4xIHRvIHJ1biBvbiBTb2xhcmlzIDIuNikuCisgIGRubCBEb24ndCB1c2UgQUNfQ0hFQ0tfREVDTFMgYmVjYXVzZSBpdCBpc24ndCBzdXBwb3J0ZWQgaW4gYXV0b2NvbmYtMi4xMy4KKyAgZ3RfQ0hFQ0tfREVDTChmZW9mX3VubG9ja2VkLCBbI2luY2x1ZGUgPHN0ZGlvLmg+XSkKKyAgZ3RfQ0hFQ0tfREVDTChmZ2V0c191bmxvY2tlZCwgWyNpbmNsdWRlIDxzdGRpby5oPl0pCisgIGd0X0NIRUNLX0RFQ0woZ2V0Y191bmxvY2tlZCwgWyNpbmNsdWRlIDxzdGRpby5oPl0pCisKKyAgY2FzZSAkZ3RfY3ZfZnVuY19wcmludGZfcG9zaXggaW4KKyAgICAqeWVzKSBIQVZFX1BPU0lYX1BSSU5URj0xIDs7CisgICAgKikgSEFWRV9QT1NJWF9QUklOVEY9MCA7OworICBlc2FjCisgIEFDX1NVQlNUKFtIQVZFX1BPU0lYX1BSSU5URl0pCisgIGlmIHRlc3QgIiRhY19jdl9mdW5jX2FzcHJpbnRmIiA9IHllczsgdGhlbgorICAgIEhBVkVfQVNQUklOVEY9MQorICBlbHNlCisgICAgSEFWRV9BU1BSSU5URj0wCisgIGZpCisgIEFDX1NVQlNUKFtIQVZFX0FTUFJJTlRGXSkKKyAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfc25wcmludGYiID0geWVzOyB0aGVuCisgICAgSEFWRV9TTlBSSU5URj0xCisgIGVsc2UKKyAgICBIQVZFX1NOUFJJTlRGPTAKKyAgZmkKKyAgQUNfU1VCU1QoW0hBVkVfU05QUklOVEZdKQorICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY193cHJpbnRmIiA9IHllczsgdGhlbgorICAgIEhBVkVfV1BSSU5URj0xCisgIGVsc2UKKyAgICBIQVZFX1dQUklOVEY9MAorICBmaQorICBBQ19TVUJTVChbSEFWRV9XUFJJTlRGXSkKKworICBBTV9JQ09OVgorICBBTV9MQU5HSU5GT19DT0RFU0VUCisgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIEFNX0xDX01FU1NBR0VTCisgIGZpCisKKyAgZG5sIGludGwvcGx1cmFsLmMgaXMgZ2VuZXJhdGVkIGZyb20gaW50bC9wbHVyYWwueS4gSXQgcmVxdWlyZXMgYmlzb24sCisgIGRubCBiZWNhdXNlIHBsdXJhbC55IHVzZXMgYmlzb24gc3BlY2lmaWMgZmVhdHVyZXMuIEl0IHJlcXVpcmVzIGF0IGxlYXN0CisgIGRubCBiaXNvbi0xLjI2IGJlY2F1c2UgZWFybGllciB2ZXJzaW9ucyBnZW5lcmF0ZSBhIHBsdXJhbC5jIHRoYXQgZG9lc24ndAorICBkbmwgY29tcGlsZS4KKyAgZG5sIGJpc29uIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgbWFpbnRhaW5lciAod2hvIHRvdWNoZXMgcGx1cmFsLnkpLiBCdXQgaW4KKyAgZG5sIG9yZGVyIHRvIGF2b2lkIHNlcGFyYXRlIE1ha2VmaWxlcyBvciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUsIHdlIHB1dAorICBkbmwgdGhlIHJ1bGUgaW4gZ2VuZXJhbCBNYWtlZmlsZS4gTm93LCBzb21lIHBlb3BsZSBjYXJlbGVzc2x5IHRvdWNoIHRoZQorICBkbmwgZmlsZXMgb3IgaGF2ZSBhIGJyb2tlbiAibWFrZSIgcHJvZ3JhbSwgaGVuY2UgdGhlIHBsdXJhbC5jIHJ1bGUgd2lsbAorICBkbmwgc29tZXRpbWVzIGZpcmUuIFRvIGF2b2lkIGFuIGVycm9yLCBkZWZpbmVzIEJJU09OIHRvICI6IiBpZiBpdCBpcyBub3QKKyAgZG5sIHByZXNlbnQgb3IgdG9vIG9sZC4KKyAgQUNfQ0hFQ0tfUFJPR1MoW0lOVExCSVNPTl0sIFtiaXNvbl0pCisgIGlmIHRlc3QgLXogIiRJTlRMQklTT04iOyB0aGVuCisgICAgYWNfdmVyY19mYWlsPXllcworICBlbHNlCisgICAgZG5sIEZvdW5kIGl0LCBub3cgY2hlY2sgdGhlIHZlcnNpb24uCisgICAgQUNfTVNHX0NIRUNLSU5HKFt2ZXJzaW9uIG9mIGJpc29uXSkKK2NoYW5nZXF1b3RlKDw8LD4+KWRubAorICAgIGFjX3Byb2dfdmVyc2lvbj1gJElOVExCSVNPTiAtLXZlcnNpb24gMj4mMSB8IHNlZCAtbiAncy9eLipHTlUgQmlzb24uKiBcKFswLTldKlwuWzAtOS5dKlwpLiokL1wxL3AnYAorICAgIGNhc2UgJGFjX3Byb2dfdmVyc2lvbiBpbgorICAgICAgJycpIGFjX3Byb2dfdmVyc2lvbj0idi4gPy4/PywgYmFkIjsgYWNfdmVyY19mYWlsPXllczs7CisgICAgICAxLjJbNi05XSogfCAxLlszLTldWzAtOV0qIHwgWzItOV0uKikKK2NoYW5nZXF1b3RlKFssXSlkbmwKKyAgICAgICAgIGFjX3Byb2dfdmVyc2lvbj0iJGFjX3Byb2dfdmVyc2lvbiwgb2siOyBhY192ZXJjX2ZhaWw9bm87OworICAgICAgKikgYWNfcHJvZ192ZXJzaW9uPSIkYWNfcHJvZ192ZXJzaW9uLCBiYWQiOyBhY192ZXJjX2ZhaWw9eWVzOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGFjX3Byb2dfdmVyc2lvbl0pCisgIGZpCisgIGlmIHRlc3QgJGFjX3ZlcmNfZmFpbCA9IHllczsgdGhlbgorICAgIElOVExCSVNPTj06CisgIGZpCitdKQorCisKK2RubCBndF9DSEVDS19ERUNMKEZVTkMsIElOQ0xVREVTKQorZG5sIENoZWNrIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyBkZWNsYXJlZC4KK0FDX0RFRlVOKFtndF9DSEVDS19ERUNMXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgJDEgaXMgZGVjbGFyZWRdLCBhY19jdl9oYXZlX2RlY2xfJDEsCisgICAgW0FDX1RSWV9DT01QSUxFKFskMl0sIFsKKyNpZm5kZWYgJDEKKyAgY2hhciAqcCA9IChjaGFyICopICQxOworI2VuZGlmCitdLCBhY19jdl9oYXZlX2RlY2xfJDE9eWVzLCBhY19jdl9oYXZlX2RlY2xfJDE9bm8pXSkKKyAgaWYgdGVzdCAkYWNfY3ZfaGF2ZV9kZWNsXyQxID0geWVzOyB0aGVuCisgICAgZ3RfdmFsdWU9MQorICBlbHNlCisgICAgZ3RfdmFsdWU9MAorICBmaQorICBBQ19ERUZJTkVfVU5RVU9URUQoW0hBVkVfREVDTF9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIFskZ3RfdmFsdWVdLAorICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYCQxJywgYW5kIHRvIDAgaWYgeW91IGRvbid0Ll0pCitdKQorCisKK2RubCBVc2FnZTogQU1fR05VX0dFVFRFWFRfVkVSU0lPTihbZ2V0dGV4dC12ZXJzaW9uXSkKK0FDX0RFRlVOKFtBTV9HTlVfR0VUVEVYVF9WRVJTSU9OXSwgW10pCisjIGdsaWJjMjEubTQgc2VyaWFsIDIgKGZpbGV1dGlscy00LjEuMywgZ2V0dGV4dC0wLjEwLjQwKQorZG5sIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRlc3QgZm9yIHRoZSBHTlUgQyBMaWJyYXJ5LCB2ZXJzaW9uIDIuMSBvciBuZXdlci4KKyMgRnJvbSBCcnVubyBIYWlibGUuCisKK0FDX0RFRlVOKFtqbV9HTElCQzIxXSwKKyAgWworICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5IDIuMSBvciBuZXdlciwKKyAgICAgIGFjX2N2X2dudV9saWJyYXJ5XzJfMSwKKyAgICAgIFtBQ19FR1JFUF9DUFAoW0x1Y2t5IEdOVSB1c2VyXSwKKwlbCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKyAjaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAxKSB8fCAoX19HTElCQ19fID4gMikKKyAgTHVja3kgR05VIHVzZXIKKyAjZW5kaWYKKyNlbmRpZgorCV0sCisJYWNfY3ZfZ251X2xpYnJhcnlfMl8xPXllcywKKwlhY19jdl9nbnVfbGlicmFyeV8yXzE9bm8pCisgICAgICBdCisgICAgKQorICAgIEFDX1NVQlNUKEdMSUJDMjEpCisgICAgR0xJQkMyMT0iJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIKKyAgXQorKQorIyBpY29udi5tNCBzZXJpYWwgQU00IChnZXR0ZXh0LTAuMTEuMykKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorCitBQ19ERUZVTihbQU1fSUNPTlZfTElOS0ZMQUdTX0JPRFldLAorWworICBkbmwgUHJlcmVxdWlzaXRlcyBvZiBBQ19MSUJfTElOS0ZMQUdTX0JPRFkuCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisKKyAgZG5sIFNlYXJjaCBmb3IgbGliaWNvbnYgYW5kIGRlZmluZSBMSUJJQ09OViwgTFRMSUJJQ09OViBhbmQgSU5DSUNPTlYKKyAgZG5sIGFjY29yZGluZ2x5LgorICBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoW2ljb252XSkKK10pCisKK0FDX0RFRlVOKFtBTV9JQ09OVl9MSU5LXSwKK1sKKyAgZG5sIFNvbWUgc3lzdGVtcyBoYXZlIGljb252IGluIGxpYmMsIHNvbWUgaGF2ZSBpdCBpbiBsaWJpY29udiAoT1NGLzEgYW5kCisgIGRubCB0aG9zZSB3aXRoIHRoZSBzdGFuZGFsb25lIHBvcnRhYmxlIEdOVSBsaWJpY29udiBpbnN0YWxsZWQpLgorCisgIGRubCBTZWFyY2ggZm9yIGxpYmljb252IGFuZCBkZWZpbmUgTElCSUNPTlYsIExUTElCSUNPTlYgYW5kIElOQ0lDT05WCisgIGRubCBhY2NvcmRpbmdseS4KKyAgQUNfUkVRVUlSRShbQU1fSUNPTlZfTElOS0ZMQUdTX0JPRFldKQorCisgIGRubCBBZGQgJElOQ0lDT05WIHRvIENQUEZMQUdTIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmcgY2hlY2tzLAorICBkbmwgYmVjYXVzZSBpZiB0aGUgdXNlciBoYXMgaW5zdGFsbGVkIGxpYmljb252IGFuZCBub3QgZGlzYWJsZWQgaXRzIHVzZQorICBkbmwgdmlhIC0td2l0aG91dC1saWJpY29udi1wcmVmaXgsIGhlIHdhbnRzIHRvIHVzZSBpdC4gVGhlIGZpcnN0CisgIGRubCBBQ19UUllfTElOSyB3aWxsIHRoZW4gZmFpbCwgdGhlIHNlY29uZCBBQ19UUllfTElOSyB3aWxsIHN1Y2NlZWQuCisgIGFtX3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgQUNfTElCX0FQUEVORFRPVkFSKFtDUFBGTEFHU10sIFskSU5DSUNPTlZdKQorCisgIEFDX0NBQ0hFX0NIRUNLKGZvciBpY29udiwgYW1fY3ZfZnVuY19pY29udiwgWworICAgIGFtX2N2X2Z1bmNfaWNvbnY9Im5vLCBjb25zaWRlciBpbnN0YWxsaW5nIEdOVSBsaWJpY29udiIKKyAgICBhbV9jdl9saWJfaWNvbnY9bm8KKyAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+XSwKKyAgICAgIFtpY29udl90IGNkID0gaWNvbnZfb3BlbigiIiwiIik7CisgICAgICAgaWNvbnYoY2QsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgaWNvbnZfY2xvc2UoY2QpO10sCisgICAgICBhbV9jdl9mdW5jX2ljb252PXllcykKKyAgICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgIT0geWVzOyB0aGVuCisgICAgICBhbV9zYXZlX0xJQlM9IiRMSUJTIgorICAgICAgTElCUz0iJExJQlMgJExJQklDT05WIgorICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpY29udi5oPl0sCisgICAgICAgIFtpY29udl90IGNkID0gaWNvbnZfb3BlbigiIiwiIik7CisgICAgICAgICBpY29udihjZCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgIGljb252X2Nsb3NlKGNkKTtdLAorICAgICAgICBhbV9jdl9saWJfaWNvbnY9eWVzCisgICAgICAgIGFtX2N2X2Z1bmNfaWNvbnY9eWVzKQorICAgICAgTElCUz0iJGFtX3NhdmVfTElCUyIKKyAgICBmaQorICBdKQorICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9JQ09OViwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaWNvbnYoKSBmdW5jdGlvbi5dKQorICBmaQorICBpZiB0ZXN0ICIkYW1fY3ZfbGliX2ljb252IiA9IHllczsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaG93IHRvIGxpbmsgd2l0aCBsaWJpY29udl0pCisgICAgQUNfTVNHX1JFU1VMVChbJExJQklDT05WXSkKKyAgZWxzZQorICAgIGRubCBJZiAkTElCSUNPTlYgZGlkbid0IGxlYWQgdG8gYSB1c2FibGUgbGlicmFyeSwgd2UgZG9uJ3QgbmVlZCAkSU5DSUNPTlYKKyAgICBkbmwgZWl0aGVyLgorICAgIENQUEZMQUdTPSIkYW1fc2F2ZV9DUFBGTEFHUyIKKyAgICBMSUJJQ09OVj0KKyAgICBMVExJQklDT05WPQorICBmaQorICBBQ19TVUJTVChMSUJJQ09OVikKKyAgQUNfU1VCU1QoTFRMSUJJQ09OVikKK10pCisKK0FDX0RFRlVOKFtBTV9JQ09OVl0sCitbCisgIEFNX0lDT05WX0xJTksKKyAgaWYgdGVzdCAiJGFtX2N2X2Z1bmNfaWNvbnYiID0geWVzOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaWNvbnYgZGVjbGFyYXRpb25dKQorICAgIEFDX0NBQ0hFX1ZBTChhbV9jdl9wcm90b19pY29udiwgWworICAgICAgQUNfVFJZX0NPTVBJTEUoWworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+CitleHRlcm4KKyNpZmRlZiBfX2NwbHVzcGx1cworIkMiCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorc2l6ZV90IGljb252IChpY29udl90IGNkLCBjaGFyICogKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICogKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOworI2Vsc2UKK3NpemVfdCBpY29udigpOworI2VuZGlmCitdLCBbXSwgYW1fY3ZfcHJvdG9faWNvbnZfYXJnMT0iIiwgYW1fY3ZfcHJvdG9faWNvbnZfYXJnMT0iY29uc3QiKQorICAgICAgYW1fY3ZfcHJvdG9faWNvbnY9ImV4dGVybiBzaXplX3QgaWNvbnYgKGljb252X3QgY2QsICRhbV9jdl9wcm90b19pY29udl9hcmcxIGNoYXIgKiAqaW5idWYsIHNpemVfdCAqaW5ieXRlc2xlZnQsIGNoYXIgKiAqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCk7Il0pCisgICAgYW1fY3ZfcHJvdG9faWNvbnY9YGVjaG8gIlskXWFtX2N2X3Byb3RvX2ljb252IiB8IHRyIC1zICcgJyB8IHNlZCAtZSAncy8oIC8oLydgCisgICAgQUNfTVNHX1JFU1VMVChbJF17YWNfdDotCisgICAgICAgICB9WyRdYW1fY3ZfcHJvdG9faWNvbnYpCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKElDT05WX0NPTlNULCAkYW1fY3ZfcHJvdG9faWNvbnZfYXJnMSwKKyAgICAgIFtEZWZpbmUgYXMgY29uc3QgaWYgdGhlIGRlY2xhcmF0aW9uIG9mIGljb252KCkgbmVlZHMgY29uc3QuXSkKKyAgZmkKK10pCisjIGludGRpdjAubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMS4zKQorZG5sIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorCitBQ19ERUZVTihbZ3RfSU5URElWMF0sCitbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCisKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgaW50ZWdlciBkaXZpc2lvbiBieSB6ZXJvIHJhaXNlcyBTSUdGUEVdLAorICAgIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlLAorICAgIFsKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fY3BsdXNwbHVzCitzaWdmcGVfaGFuZGxlciAoaW50IHNpZykKKyNlbHNlCitzaWdmcGVfaGFuZGxlciAoc2lnKSBpbnQgc2lnOworI2VuZGlmCit7CisgIC8qIEV4aXQgd2l0aCBjb2RlIDAgaWYgU0lHRlBFLCB3aXRoIGNvZGUgMSBpZiBhbnkgb3RoZXIgc2lnbmFsLiAgKi8KKyAgZXhpdCAoc2lnICE9IFNJR0ZQRSk7Cit9CisKK2ludCB4ID0gMTsKK2ludCB5ID0gMDsKK2ludCB6OworaW50IG5hbjsKKworaW50IG1haW4gKCkKK3sKKyAgc2lnbmFsIChTSUdGUEUsIHNpZ2ZwZV9oYW5kbGVyKTsKKy8qIElSSVggYW5kIEFJWCAod2hlbiAieGxjIC1xY2hlY2siIGlzIHVzZWQpIHlpZWxkIHNpZ25hbCBTSUdUUkFQLiAgKi8KKyNpZiAoZGVmaW5lZCAoX19zZ2kpIHx8IGRlZmluZWQgKF9BSVgpKSAmJiBkZWZpbmVkIChTSUdUUkFQKQorICBzaWduYWwgKFNJR1RSQVAsIHNpZ2ZwZV9oYW5kbGVyKTsKKyNlbmRpZgorLyogTGludXgvU1BBUkMgeWllbGRzIHNpZ25hbCBTSUdJTEwuICAqLworI2lmIGRlZmluZWQgKF9fc3BhcmNfXykgJiYgZGVmaW5lZCAoX19saW51eF9fKQorICBzaWduYWwgKFNJR0lMTCwgc2lnZnBlX2hhbmRsZXIpOworI2VuZGlmCisKKyAgeiA9IHggLyB5OworICBuYW4gPSB5IC8geTsKKyAgZXhpdCAoMSk7Cit9CitdLCBndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZT15ZXMsIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPW5vLAorICAgICAgICBbCisgICAgICAgICAgIyBHdWVzcyBiYXNlZCBvbiB0aGUgQ1BVLgorICAgICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgICAgIGFscGhhKiB8IGlbMzQ1NjddODYgfCBtNjhrIHwgczM5MCopCisgICAgICAgICAgICAgIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPSJndWVzc2luZyB5ZXMiOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPSJndWVzc2luZyBubyI7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgXSkKKyAgICBdKQorICBjYXNlICIkZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGUiIGluCisgICAgKnllcykgdmFsdWU9MTs7CisgICAgKikgdmFsdWU9MDs7CisgIGVzYWMKKyAgQUNfREVGSU5FX1VOUVVPVEVEKElOVERJVjBfUkFJU0VTX1NJR0ZQRSwgJHZhbHVlLAorICAgIFtEZWZpbmUgaWYgaW50ZWdlciBkaXZpc2lvbiBieSB6ZXJvIHJhaXNlcyBzaWduYWwgU0lHRlBFLl0pCitdKQorIyBpbnRtYXgubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorZG5sIFRlc3Qgd2hldGhlciB0aGUgc3lzdGVtIGhhcyB0aGUgJ2ludG1heF90JyB0eXBlLCBidXQgZG9uJ3QgYXR0ZW1wdCB0bworZG5sIGZpbmQgYSByZXBsYWNlbWVudCBpZiBpdCBpcyBsYWNraW5nLgorCitBQ19ERUZVTihbZ3RfVFlQRV9JTlRNQVhfVF0sCitbCisgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9JTlRUWVBFU19IXSkKKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX1NURElOVF9IXSkKKyAgQUNfQ0FDSEVfQ0hFQ0soZm9yIGludG1heF90LCBndF9jdl9jX2ludG1heF90LAorICAgIFtBQ19UUllfQ09NUElMRShbCisjaW5jbHVkZSA8c3RkZGVmLmg+IAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0hfV0lUSF9VSU5UTUFYCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorXSwgW2ludG1heF90IHggPSAtMTtdLCBndF9jdl9jX2ludG1heF90PXllcywgZ3RfY3ZfY19pbnRtYXhfdD1ubyldKQorICBpZiB0ZXN0ICRndF9jdl9jX2ludG1heF90ID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSU5UTUFYX1QsIDEsCisgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnaW50bWF4X3QnIHR5cGUgaW4gPHN0ZGludC5oPiBvciA8aW50dHlwZXMuaD4uXSkKKyAgZmkKK10pCisjIGludHR5cGVzLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTEuNCkKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gUGF1bCBFZ2dlcnQuCisKKyMgRGVmaW5lIEhBVkVfSU5UVFlQRVNfSCBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkb2Vzbid0IGNsYXNoIHdpdGgKKyMgPHN5cy90eXBlcy5oPi4KKworQUNfREVGVU4oW2d0X0hFQURFUl9JTlRUWVBFU19IXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBpbnR0eXBlcy5oXSwgZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2gsCisgIFsKKyAgICBBQ19UUllfQ09NUElMRSgKKyAgICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD5dLAorICAgICAgW10sIGd0X2N2X2hlYWRlcl9pbnR0eXBlc19oPXllcywgZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2g9bm8pCisgIF0pCisgIGlmIHRlc3QgJGd0X2N2X2hlYWRlcl9pbnR0eXBlc19oID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfSU5UVFlQRVNfSCwgMSwKKyAgICAgIFtEZWZpbmUgaWYgPGludHR5cGVzLmg+IGV4aXN0cyBhbmQgZG9lc24ndCBjbGFzaCB3aXRoIDxzeXMvdHlwZXMuaD4uXSkKKyAgZmkKK10pCisjIGludHR5cGVzX2gubTQgc2VyaWFsIDUgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gUGF1bCBFZ2dlcnQuCisKKyMgRGVmaW5lIEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVggaWYgPGludHR5cGVzLmg+IGV4aXN0cywKKyMgZG9lc24ndCBjbGFzaCB3aXRoIDxzeXMvdHlwZXMuaD4sIGFuZCBkZWNsYXJlcyB1aW50bWF4X3QuCisKK0FDX0RFRlVOKFtqbV9BQ19IRUFERVJfSU5UVFlQRVNfSF0sCitbCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgaW50dHlwZXMuaF0sIGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oLAorICBbQUNfVFJZX0NPTVBJTEUoCisgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPl0sCisgICAgW3VpbnRtYXhfdCBpID0gKHVpbnRtYXhfdCkgLTE7XSwKKyAgICBqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaD15ZXMsCisgICAgam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2g9bm8pXSkKKyAgaWYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWCwgMSwKKyAgICAgIFtEZWZpbmUgaWYgPGludHR5cGVzLmg+IGV4aXN0cywgZG9lc24ndCBjbGFzaCB3aXRoIDxzeXMvdHlwZXMuaD4sCisgICAgICAgYW5kIGRlY2xhcmVzIHVpbnRtYXhfdC4gXSkKKyAgZmkKK10pCisjIGludHR5cGVzLXByaS5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjExLjQpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworIyBEZWZpbmUgUFJJX01BQ1JPU19CUk9LRU4gaWYgPGludHR5cGVzLmg+IGV4aXN0cyBhbmQgZGVmaW5lcyB0aGUgUFJJKgorIyBtYWNyb3MgdG8gbm9uLXN0cmluZyB2YWx1ZXMuICBUaGlzIGlzIHRoZSBjYXNlIG9uIEFJWCA0LjMuMy4KKworQUNfREVGVU4oW2d0X0lOVFRZUEVTX1BSSV0sCitbCisgIEFDX1JFUVVJUkUoW2d0X0hFQURFUl9JTlRUWVBFU19IXSkKKyAgaWYgdGVzdCAkZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgaW50dHlwZXMuaCBQUkl4Tk4gbWFjcm9zIGFyZSBicm9rZW5dLAorICAgICAgZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbiwKKyAgICAgIFsKKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2lmZGVmIFBSSWQzMgorY2hhciAqcCA9IFBSSWQzMjsKKyNlbmRpZgorXSwgW10sIGd0X2N2X2ludHR5cGVzX3ByaV9icm9rZW49bm8sIGd0X2N2X2ludHR5cGVzX3ByaV9icm9rZW49eWVzKQorICAgICAgXSkKKyAgZmkKKyAgaWYgdGVzdCAiJGd0X2N2X2ludHR5cGVzX3ByaV9icm9rZW4iID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKFBSSV9NQUNST1NfQlJPS0VOLCAxLAorICAgICAgW0RlZmluZSBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkZWZpbmVzIHVudXNhYmxlIFBSSSogbWFjcm9zLl0pCisgIGZpCitdKQorIyBpc2MtcG9zaXgubTQgc2VyaWFsIDIgKGdldHRleHQtMC4xMS4yKQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgZmlsZSBpcyBub3QgbmVlZGVkIHdpdGggYXV0b2NvbmYtMi41MyBhbmQgbmV3ZXIuICBSZW1vdmUgaXQgaW4gMjAwNS4KKworIyBUaGlzIHRlc3QgcmVwbGFjZXMgdGhlIG9uZSBpbiBhdXRvY29uZi4KKyMgQ3VycmVudGx5IHRoaXMgbWFjcm8gc2hvdWxkIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgYXV0b2NvbmYgbWFjcm8KKyMgYmVjYXVzZSBnZXR0ZXh0J3MgZ2V0dGV4dC5tNCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGF1dG9tYWtlIHBhY2thZ2UpCisjIHN0aWxsIHVzZXMgaXQuICBPdGhlcndpc2UsIHRoZSB1c2UgaW4gZ2V0dGV4dC5tNCBtYWtlcyBhdXRvaGVhZGVyCisjIGdpdmUgdGhlc2UgZGlhZ25vc3RpY3M6CisjICAgY29uZmlndXJlLmluOjU1NjogQUNfVFJZX0NPTVBJTEUgd2FzIGNhbGxlZCBiZWZvcmUgQUNfSVNDX1BPU0lYCisjICAgY29uZmlndXJlLmluOjU1NjogQUNfVFJZX1JVTiB3YXMgY2FsbGVkIGJlZm9yZSBBQ19JU0NfUE9TSVgKKwordW5kZWZpbmUoW0FDX0lTQ19QT1NJWF0pCisKK0FDX0RFRlVOKFtBQ19JU0NfUE9TSVhdLAorICBbCisgICAgZG5sIFRoaXMgdGVzdCByZXBsYWNlcyB0aGUgb2Jzb2xlc2NlbnQgQUNfSVNDX1BPU0lYIGtsdWRnZS4KKyAgICBBQ19DSEVDS19MSUIoY3Bvc2l4LCBzdHJlcnJvciwgW0xJQlM9IiRMSUJTIC1sY3Bvc2l4Il0pCisgIF0KKykKKyMgbGNtZXNzYWdlLm00IHNlcmlhbCAzIChnZXR0ZXh0LTAuMTEuMykKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KK2RubAorZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKK2RubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorZG5sIGZ1bmN0aW9uYWxpdHkuCitkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAorZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorZG5sIGdldHRleHQgcGFja2FnZSBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorZG5sIFRoZXkgYXJlICpub3QqIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCitkbmwgQXV0aG9yczoKK2RubCAgIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisKK0FDX0RFRlVOKFtBTV9MQ19NRVNTQUdFU10sCitbCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCisgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCisgICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCisgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAorICAgICAgW0RlZmluZSBpZiB5b3VyIDxsb2NhbGUuaD4gZmlsZSBkZWZpbmVzIExDX01FU1NBR0VTLl0pCisgIGZpCitdKQorIyBsaWItbGQubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMykKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIFN1YnJvdXRpbmVzIG9mIGxpYnRvb2wubTQsCitkbmwgd2l0aCByZXBsYWNlbWVudHMgcy9BQ18vQUNfTElCLyBhbmQgcy9sdF9jdi9hY2xfY3YvIHRvIGF2b2lkIGNvbGxpc2lvbgorZG5sIHdpdGggbGlidG9vbC5tNC4KKworZG5sIEZyb20gbGlidG9vbC0xLjQuIFNldHMgdGhlIHZhcmlhYmxlIHdpdGhfZ251X2xkIHRvIHllcyBvciBuby4KK0FDX0RFRlVOKFtBQ19MSUJfUFJPR19MRF9HTlVdLAorW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjbF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBhY2xfY3ZfcHJvZ19nbnVfbGQ9eWVzIDs7CisqKQorICBhY2xfY3ZfcHJvZ19nbnVfbGQ9bm8gOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGFjbF9jdl9wcm9nX2dudV9sZAorXSkKKworZG5sIEZyb20gbGlidG9vbC0xLjQuIFNldHMgdGhlIHZhcmlhYmxlIExELgorQUNfREVGVU4oW0FDX0xJQl9QUk9HX0xEXSwKK1tBQ19BUkdfV0lUSChnbnUtbGQsCitbICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKK3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyMgUHJlcGFyZSBQQVRIX1NFUEFSQVRPUi4KKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopXQorICAgICAgW3JlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLyddCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGFjbF9jdl9wYXRoX0xELAorW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgYWNsX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkYWNsX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrIDs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNsX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGFjbF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorQUNfTElCX1BST0dfTERfR05VCitdKQorIyBsaWItbGluay5tNCBzZXJpYWwgNCAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK2RubCBBQ19MSUJfTElOS0ZMQUdTKG5hbWUgWywgZGVwZW5kZW5jaWVzXSkgc2VhcmNoZXMgZm9yIGxpYm5hbWUgYW5kCitkbmwgdGhlIGxpYnJhcmllcyBjb3JyZXNwb25kaW5nIHRvIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBkZXBlbmRlbmNpZXMuCitkbmwgU2V0cyBhbmQgQUNfU1VCU1RzIHRoZSBMSUIke05BTUV9IGFuZCBMVExJQiR7TkFNRX0gdmFyaWFibGVzIGFuZAorZG5sIGF1Z21lbnRzIHRoZSBDUFBGTEFHUyB2YXJpYWJsZS4KK0FDX0RFRlVOKFtBQ19MSUJfTElOS0ZMQUdTXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKyAgQUNfUkVRVUlSRShbQUNfTElCX1JQQVRIXSkKKyAgZGVmaW5lKFtOYW1lXSxbdHJhbnNsaXQoWyQxXSxbLi8tXSwgW19fX10pXSkKKyAgZGVmaW5lKFtOQU1FXSxbdHJhbnNsaXQoWyQxXSxbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX10pXSkKKyAgQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byBsaW5rIHdpdGggbGliW10kMV0sIFthY19jdl9saWJbXU5hbWVbXV9saWJzXSwgWworICAgIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShbJDFdLCBbJDJdKQorICAgIGFjX2N2X2xpYltdTmFtZVtdX2xpYnM9IiRMSUJbXU5BTUUiCisgICAgYWNfY3ZfbGliW11OYW1lW11fbHRsaWJzPSIkTFRMSUJbXU5BTUUiCisgICAgYWNfY3ZfbGliW11OYW1lW11fY3BwZmxhZ3M9IiRJTkNbXU5BTUUiCisgIF0pCisgIExJQltdTkFNRT0iJGFjX2N2X2xpYltdTmFtZVtdX2xpYnMiCisgIExUTElCW11OQU1FPSIkYWNfY3ZfbGliW11OYW1lW11fbHRsaWJzIgorICBJTkNbXU5BTUU9IiRhY19jdl9saWJbXU5hbWVbXV9jcHBmbGFncyIKKyAgQUNfTElCX0FQUEVORFRPVkFSKFtDUFBGTEFHU10sIFskSU5DXU5BTUUpCisgIEFDX1NVQlNUKFtMSUJdTkFNRSkKKyAgQUNfU1VCU1QoW0xUTElCXU5BTUUpCisgIGRubCBBbHNvIHNldCBIQVZFX0xJQltdTkFNRSBzbyB0aGF0IEFDX0xJQl9IQVZFX0xJTktGTEFHUyBjYW4gcmV1c2UgdGhlCisgIGRubCByZXN1bHRzIG9mIHRoaXMgc2VhcmNoIHdoZW4gdGhpcyBsaWJyYXJ5IGFwcGVhcnMgYXMgYSBkZXBlbmRlbmN5LgorICBIQVZFX0xJQltdTkFNRT15ZXMKKyAgdW5kZWZpbmUoW05hbWVdKQorICB1bmRlZmluZShbTkFNRV0pCitdKQorCitkbmwgQUNfTElCX0hBVkVfTElOS0ZMQUdTKG5hbWUsIGRlcGVuZGVuY2llcywgaW5jbHVkZXMsIHRlc3Rjb2RlKQorZG5sIHNlYXJjaGVzIGZvciBsaWJuYW1lIGFuZCB0aGUgbGlicmFyaWVzIGNvcnJlc3BvbmRpbmcgdG8gZXhwbGljaXQgYW5kCitkbmwgaW1wbGljaXQgZGVwZW5kZW5jaWVzLCB0b2dldGhlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5jbHVkZSBmaWxlcyBhbmQKK2RubCB0aGUgYWJpbGl0eSB0byBjb21waWxlIGFuZCBsaW5rIHRoZSBzcGVjaWZpZWQgdGVzdGNvZGUuIElmIGZvdW5kLCBpdAorZG5sIHNldHMgYW5kIEFDX1NVQlNUcyBIQVZFX0xJQiR7TkFNRX09eWVzIGFuZCB0aGUgTElCJHtOQU1FfSBhbmQKK2RubCBMVExJQiR7TkFNRX0gdmFyaWFibGVzIGFuZCBhdWdtZW50cyB0aGUgQ1BQRkxBR1MgdmFyaWFibGUsIGFuZAorZG5sICNkZWZpbmVzIEhBVkVfTElCJHtOQU1FfSB0byAxLiBPdGhlcndpc2UsIGl0IHNldHMgYW5kIEFDX1NVQlNUcworZG5sIEhBVkVfTElCJHtOQU1FfT1ubyBhbmQgTElCJHtOQU1FfSBhbmQgTFRMSUIke05BTUV9IHRvIGVtcHR5LgorQUNfREVGVU4oW0FDX0xJQl9IQVZFX0xJTktGTEFHU10sCitbCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisgIGRlZmluZShbTmFtZV0sW3RyYW5zbGl0KFskMV0sWy4vLV0sIFtfX19dKV0pCisgIGRlZmluZShbTkFNRV0sW3RyYW5zbGl0KFskMV0sW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX19dKV0pCisKKyAgZG5sIFNlYXJjaCBmb3IgbGliW11OYW1lIGFuZCBkZWZpbmUgTElCW11OQU1FLCBMVExJQltdTkFNRSBhbmQgSU5DW11OQU1FCisgIGRubCBhY2NvcmRpbmdseS4KKyAgQUNfTElCX0xJTktGTEFHU19CT0RZKFskMV0sIFskMl0pCisKKyAgZG5sIEFkZCAkSU5DW11OQU1FIHRvIENQUEZMQUdTIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmcgY2hlY2tzLAorICBkbmwgYmVjYXVzZSBpZiB0aGUgdXNlciBoYXMgaW5zdGFsbGVkIGxpYltdTmFtZSBhbmQgbm90IGRpc2FibGVkIGl0cyB1c2UKKyAgZG5sIHZpYSAtLXdpdGhvdXQtbGliW11OYW1lLXByZWZpeCwgaGUgd2FudHMgdG8gdXNlIGl0LgorICBhY19zYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgIEFDX0xJQl9BUFBFTkRUT1ZBUihbQ1BQRkxBR1NdLCBbJElOQ11OQU1FKQorCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgbGliW10kMV0sIFthY19jdl9saWJbXU5hbWVdLCBbCisgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBMSUJTPSIkTElCUyAkTElCW11OQU1FIgorICAgIEFDX1RSWV9MSU5LKFskM10sIFskNF0sIFthY19jdl9saWJbXU5hbWU9eWVzXSwgW2FjX2N2X2xpYltdTmFtZT1ub10pCisgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgXSkKKyAgaWYgdGVzdCAiJGFjX2N2X2xpYltdTmFtZSIgPSB5ZXM7IHRoZW4KKyAgICBIQVZFX0xJQltdTkFNRT15ZXMKKyAgICBBQ19ERUZJTkUoW0hBVkVfTElCXU5BTUUsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICQxIGxpYnJhcnkuXSkKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBsaW5rIHdpdGggbGliW10kMV0pCisgICAgQUNfTVNHX1JFU1VMVChbJExJQltdTkFNRV0pCisgIGVsc2UKKyAgICBIQVZFX0xJQltdTkFNRT1ubworICAgIGRubCBJZiAkTElCW11OQU1FIGRpZG4ndCBsZWFkIHRvIGEgdXNhYmxlIGxpYnJhcnksIHdlIGRvbid0IG5lZWQKKyAgICBkbmwgJElOQ1tdTkFNRSBlaXRoZXIuCisgICAgQ1BQRkxBR1M9IiRhY19zYXZlX0NQUEZMQUdTIgorICAgIExJQltdTkFNRT0KKyAgICBMVExJQltdTkFNRT0KKyAgZmkKKyAgQUNfU1VCU1QoW0hBVkVfTElCXU5BTUUpCisgIEFDX1NVQlNUKFtMSUJdTkFNRSkKKyAgQUNfU1VCU1QoW0xUTElCXU5BTUUpCisgIHVuZGVmaW5lKFtOYW1lXSkKKyAgdW5kZWZpbmUoW05BTUVdKQorXSkKKworZG5sIERldGVybWluZSB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IHBhcmFtZXRlcnMgbmVlZGVkIHRvIHVzZSBycGF0aDoKK2RubCBsaWJleHQsIHNobGliZXh0LCBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLAorZG5sIGhhcmRjb2RlX2RpcmVjdCwgaGFyZGNvZGVfbWludXNfTC4KK0FDX0RFRlVOKFtBQ19MSUJfUlBBVEhdLAorWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkgICAgICAgICAgICAgICAgZG5sIHdlIHVzZSAkQ0MsICRHQ0MsICRMREZMQUdTCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUk9HX0xEXSkgICAgICAgICAgICBkbmwgd2UgdXNlICRMRCwgJHdpdGhfZ251X2xkCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkgICAgICAgICBkbmwgd2UgdXNlICRob3N0CisgIEFDX1JFUVVJUkUoW0FDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRdKSBkbmwgd2UgdXNlICRhY19hdXhfZGlyCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3Igc2hhcmVkIGxpYnJhcnkgcnVuIHBhdGggb3JpZ2luXSwgYWNsX2N2X3JwYXRoLCBbCisgICAgQ0M9IiRDQyIgR0NDPSIkR0NDIiBMREZMQUdTPSIkTERGTEFHUyIgTEQ9IiRMRCIgd2l0aF9nbnVfbGQ9IiR3aXRoX2dudV9sZCIgXAorICAgICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICIkYWNfYXV4X2Rpci9jb25maWcucnBhdGgiICIkaG9zdCIgPiBjb25mdGVzdC5zaAorICAgIC4gLi9jb25mdGVzdC5zaAorICAgIHJtIC1mIC4vY29uZnRlc3Quc2gKKyAgICBhY2xfY3ZfcnBhdGg9ZG9uZQorICBdKQorICB3bD0iJGFjbF9jdl93bCIKKyAgbGliZXh0PSIkYWNsX2N2X2xpYmV4dCIKKyAgc2hsaWJleHQ9IiRhY2xfY3Zfc2hsaWJleHQiCisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9IiRhY2xfY3ZfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIKKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0iJGFjbF9jdl9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIgorICBoYXJkY29kZV9kaXJlY3Q9IiRhY2xfY3ZfaGFyZGNvZGVfZGlyZWN0IgorICBoYXJkY29kZV9taW51c19MPSIkYWNsX2N2X2hhcmRjb2RlX21pbnVzX0wiCisgIGRubCBEZXRlcm1pbmUgd2hldGhlciB0aGUgdXNlciB3YW50cyBycGF0aCBoYW5kbGluZyBhdCBhbGwuCisgIEFDX0FSR19FTkFCTEUocnBhdGgsCisgICAgWyAgLS1kaXNhYmxlLXJwYXRoICAgICAgICAgZG8gbm90IGhhcmRjb2RlIHJ1bnRpbWUgbGlicmFyeSBwYXRoc10sCisgICAgOiwgZW5hYmxlX3JwYXRoPXllcykKK10pCisKK2RubCBBQ19MSUJfTElOS0ZMQUdTX0JPRFkobmFtZSBbLCBkZXBlbmRlbmNpZXNdKSBzZWFyY2hlcyBmb3IgbGlibmFtZSBhbmQKK2RubCB0aGUgbGlicmFyaWVzIGNvcnJlc3BvbmRpbmcgdG8gZXhwbGljaXQgYW5kIGltcGxpY2l0IGRlcGVuZGVuY2llcy4KK2RubCBTZXRzIHRoZSBMSUIke05BTUV9LCBMVExJQiR7TkFNRX0gYW5kIElOQyR7TkFNRX0gdmFyaWFibGVzLgorQUNfREVGVU4oW0FDX0xJQl9MSU5LRkxBR1NfQk9EWV0sCitbCisgIGRlZmluZShbTkFNRV0sW3RyYW5zbGl0KFskMV0sW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX19dKV0pCisgIGRubCBCeSBkZWZhdWx0LCBsb29rIGluICRpbmNsdWRlZGlyIGFuZCAkbGliZGlyLgorICB1c2VfYWRkaXRpb25hbD15ZXMKKyAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKyAgICBldmFsIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj1cIiRpbmNsdWRlZGlyXCIKKyAgICBldmFsIGFkZGl0aW9uYWxfbGliZGlyPVwiJGxpYmRpclwiCisgIF0pCisgIEFDX0xJQl9BUkdfV0lUSChbbGliJDEtcHJlZml4XSwKK1sgIC0td2l0aC1saWIkMS1wcmVmaXhbPURJUl0gIHNlYXJjaCBmb3IgbGliJDEgaW4gRElSL2luY2x1ZGUgYW5kIERJUi9saWIKKyAgLS13aXRob3V0LWxpYiQxLXByZWZpeCAgICAgZG9uJ3Qgc2VhcmNoIGZvciBsaWIkMSBpbiBpbmNsdWRlZGlyIGFuZCBsaWJkaXJdLAorWworICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWG5vIjsgdGhlbgorICAgICAgdXNlX2FkZGl0aW9uYWw9bm8KKyAgICBlbHNlCisgICAgICBpZiB0ZXN0ICJYJHdpdGh2YWwiID0gIlgiOyB0aGVuCisgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorICAgICAgICBdKQorICAgICAgZWxzZQorICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9IiR3aXRodmFsL2luY2x1ZGUiCisgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPSIkd2l0aHZhbC9saWIiCisgICAgICBmaQorICAgIGZpCitdKQorICBkbmwgU2VhcmNoIHRoZSBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzIGluICRhZGRpdGlvbmFsX2xpYmRpciBhbmQKKyAgZG5sICRMREZMQUdTLiBVc2luZyBicmVhZHRoLWZpcnN0LXNlYWNoLgorICBMSUJbXU5BTUU9CisgIExUTElCW11OQU1FPQorICBJTkNbXU5BTUU9CisgIHJwYXRoZGlycz0KKyAgbHRycGF0aGRpcnM9CisgIG5hbWVzX2FscmVhZHlfaGFuZGxlZD0KKyAgbmFtZXNfbmV4dF9yb3VuZD0nJDEgJDInCisgIHdoaWxlIHRlc3QgLW4gIiRuYW1lc19uZXh0X3JvdW5kIjsgZG8KKyAgICBuYW1lc190aGlzX3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCIKKyAgICBuYW1lc19uZXh0X3JvdW5kPQorICAgIGZvciBuYW1lIGluICRuYW1lc190aGlzX3JvdW5kOyBkbworICAgICAgYWxyZWFkeV9oYW5kbGVkPQorICAgICAgZm9yIG4gaW4gJG5hbWVzX2FscmVhZHlfaGFuZGxlZDsgZG8KKyAgICAgICAgaWYgdGVzdCAiJG4iID0gIiRuYW1lIjsgdGhlbgorICAgICAgICAgIGFscmVhZHlfaGFuZGxlZD15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCAteiAiJGFscmVhZHlfaGFuZGxlZCI7IHRoZW4KKyAgICAgICAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPSIkbmFtZXNfYWxyZWFkeV9oYW5kbGVkICRuYW1lIgorICAgICAgICBkbmwgU2VlIGlmIGl0IHdhcyBhbHJlYWR5IGxvY2F0ZWQgYnkgYW4gZWFybGllciBBQ19MSUJfTElOS0ZMQUdTCisgICAgICAgIGRubCBvciBBQ19MSUJfSEFWRV9MSU5LRkxBR1MgY2FsbC4KKyAgICAgICAgdXBwZXJuYW1lPWBlY2hvICIkbmFtZSIgfCBzZWQgLWUgJ3l8YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy18QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX198J2AKKyAgICAgICAgZXZhbCB2YWx1ZT1cIlwkSEFWRV9MSUIkdXBwZXJuYW1lXCIKKyAgICAgICAgaWYgdGVzdCAtbiAiJHZhbHVlIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIiR2YWx1ZSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgIGV2YWwgdmFsdWU9XCJcJExJQiR1cHBlcm5hbWVcIgorICAgICAgICAgICAgdGVzdCAteiAiJHZhbHVlIiB8fCBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSR2YWx1ZSIKKyAgICAgICAgICAgIGV2YWwgdmFsdWU9XCJcJExUTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16ICIkdmFsdWUiIHx8IExUTElCW11OQU1FPSIke0xUTElCW11OQU1FfSR7TFRMSUJbXU5BTUU6KyB9JHZhbHVlIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRubCBBbiBlYXJsaWVyIGNhbGwgdG8gQUNfTElCX0hBVkVfTElOS0ZMQUdTIGhhcyBkZXRlcm1pbmVkCisgICAgICAgICAgICBkbmwgdGhhdCB0aGlzIGxpYnJhcnkgZG9lc24ndCBleGlzdC4gU28ganVzdCBkcm9wIGl0LgorICAgICAgICAgICAgOgorICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBkbmwgU2VhcmNoIHRoZSBsaWJyYXJ5IGxpYiRuYW1lIGluICRhZGRpdGlvbmFsX2xpYmRpciBhbmQgJExERkxBR1MKKyAgICAgICAgICBkbmwgYW5kIHRoZSBhbHJlYWR5IGNvbnN0cnVjdGVkICRMSUJOQU1FLyRMVExJQk5BTUUuCisgICAgICAgICAgZm91bmRfZGlyPQorICAgICAgICAgIGZvdW5kX2xhPQorICAgICAgICAgIGZvdW5kX3NvPQorICAgICAgICAgIGZvdW5kX2E9CisgICAgICAgICAgaWYgdGVzdCAkdXNlX2FkZGl0aW9uYWwgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYmV4dCIgJiYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgZm91bmRfZGlyPSIkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgIGZvdW5kX3NvPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IgorICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgZm91bmRfYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRsaWJleHQiCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiA9ICJYIjsgdGhlbgorICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCW11OQU1FOyBkbworICAgICAgICAgICAgICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW2V2YWwgeD1cIiR4XCJdKQorICAgICAgICAgICAgICBjYXNlICIkeCIgaW4KKyAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkeCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYmV4dCIgJiYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS4kc2hsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfc289IiRkaXIvbGliJG5hbWUuJHNobGliZXh0IgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgZG5sIEZvdW5kIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0tTCRmb3VuZF9kaXIgLWwkbmFtZSIKKyAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfc28iICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICBkbmwgTGlua2luZyB3aXRoIGEgc2hhcmVkIGxpYnJhcnkuIFdlIGF0dGVtcHQgdG8gaGFyZGNvZGUgaXRzCisgICAgICAgICAgICAgIGRubCBkaXJlY3RvcnkgaW50byB0aGUgZXhlY3V0YWJsZSdzIHJ1bnBhdGgsIHVubGVzcyBpdCdzIHRoZQorICAgICAgICAgICAgICBkbmwgc3RhbmRhcmQgL3Vzci9saWIuCisgICAgICAgICAgICAgIGlmIHRlc3QgIiRlbmFibGVfcnBhdGgiID0gbm8gfHwgdGVzdCAiWCRmb3VuZF9kaXIiID0gIlgvdXNyL2xpYiI7IHRoZW4KKyAgICAgICAgICAgICAgICBkbmwgTm8gaGFyZGNvZGluZyBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkbmwgVXNlIGFuIGV4cGxpY2l0IG9wdGlvbiB0byBoYXJkY29kZSBESVIgaW50byB0aGUgcmVzdWx0aW5nCisgICAgICAgICAgICAgICAgZG5sIGJpbmFyeS4KKyAgICAgICAgICAgICAgICBkbmwgUG90ZW50aWFsbHkgYWRkIERJUiB0byBsdHJwYXRoZGlycy4KKyAgICAgICAgICAgICAgICBkbmwgVGhlIGx0cnBhdGhkaXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gJExUTElCTkFNRSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBmb3IgeCBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgbHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZm91bmRfZGlyIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG5sIFRoZSBoYXJkY29kaW5nIGludG8gJExJQk5BTUUgaXMgc3lzdGVtIGRlcGVuZGVudC4KKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorICAgICAgICAgICAgICAgICAgZG5sIFVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgIGRubCByZXN1bHRpbmcgYmluYXJ5LgorICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiICYmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGRubCBVc2UgYW4gZXhwbGljaXQgb3B0aW9uIHRvIGhhcmRjb2RlIERJUiBpbnRvIHRoZSByZXN1bHRpbmcKKyAgICAgICAgICAgICAgICAgICAgZG5sIGJpbmFyeS4KKyAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgRElSIHRvIHJwYXRoZGlycy4KKyAgICAgICAgICAgICAgICAgICAgZG5sIFRoZSBycGF0aGRpcnMgd2lsbCBiZSBhcHBlbmRlZCB0byAkTElCTkFNRSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGZvdW5kX2RpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIHJwYXRoZGlycz0iJHJwYXRoZGlycyAkZm91bmRfZGlyIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkbmwgUmVseSBvbiAiLUwkZm91bmRfZGlyIi4KKyAgICAgICAgICAgICAgICAgICAgZG5sIEJ1dCBkb24ndCBhZGQgaXQgaWYgaXQncyBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgTERGTEFHUworICAgICAgICAgICAgICAgICAgICBkbmwgb3IgdGhlIGFscmVhZHkgY29uc3RydWN0ZWQgJExJQk5BTUUKKyAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCW11OQU1FOyBkbworICAgICAgICAgICAgICAgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0tTCRmb3VuZF9kaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubzsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGRubCBGSVhNRTogTm90IHN1cmUgd2hldGhlciB3ZSBzaG91bGQgdXNlCisgICAgICAgICAgICAgICAgICAgICAgZG5sICItTCRmb3VuZF9kaXIgLWwkbmFtZSIgb3IgIi1MJGZvdW5kX2RpciAkZm91bmRfc28iCisgICAgICAgICAgICAgICAgICAgICAgZG5sIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgV2UgY2Fubm90IHVzZSAkaGFyZGNvZGVfcnVucGF0aF92YXIgYW5kIExEX1JVTl9QQVRICisgICAgICAgICAgICAgICAgICAgICAgZG5sIGhlcmUsIGJlY2F1c2UgdGhpcyBkb2Vzbid0IGZpdCBpbiBmbGFncyBwYXNzZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgZG5sIGNvbXBpbGVyLiBTbyBnaXZlIHVwLiBObyBoYXJkY29kaW5nLiBUaGlzIGFmZmVjdHMgb25seQorICAgICAgICAgICAgICAgICAgICAgIGRubCB2ZXJ5IG9sZCBzeXN0ZW1zLgorICAgICAgICAgICAgICAgICAgICAgIGRubCBGSVhNRTogTm90IHN1cmUgd2hldGhlciB3ZSBzaG91bGQgdXNlCisgICAgICAgICAgICAgICAgICAgICAgZG5sICItTCRmb3VuZF9kaXIgLWwkbmFtZSIgb3IgIi1MJGZvdW5kX2RpciAkZm91bmRfc28iCisgICAgICAgICAgICAgICAgICAgICAgZG5sIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0tbCRuYW1lIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2EiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgIGRubCBMaW5raW5nIHdpdGggYSBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9hIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZG5sIFdlIHNob3VsZG4ndCBjb21lIGhlcmUsIGJ1dCBhbnl3YXkgaXQncyBnb29kIHRvIGhhdmUgYQorICAgICAgICAgICAgICAgIGRubCBmYWxsYmFjay4KKyAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRubCBBc3N1bWUgdGhlIGluY2x1ZGUgZmlsZXMgYXJlIG5lYXJieS4KKyAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0KKyAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9kaXIiIGluCisgICAgICAgICAgICAgICovbGliIHwgKi9saWIvKQorICAgICAgICAgICAgICAgIGJhc2VkaXI9YGVjaG8gIlgkZm91bmRfZGlyIiB8IHNlZCAtZSAncyxeWCwsJyAtZSAncywvbGliLyokLCwnYAorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJGJhc2VkaXIvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICBkbmwgUG90ZW50aWFsbHkgYWRkICRhZGRpdGlvbmFsX2luY2x1ZGVkaXIgdG8gJElOQ05BTUUuCisgICAgICAgICAgICAgIGRubCBCdXQgZG9uJ3QgYWRkIGl0CisgICAgICAgICAgICAgIGRubCAgIDEuIGlmIGl0J3MgdGhlIHN0YW5kYXJkIC91c3IvaW5jbHVkZSwKKyAgICAgICAgICAgICAgZG5sICAgMi4gaWYgaXQncyAvdXNyL2xvY2FsL2luY2x1ZGUgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisgICAgICAgICAgICAgIGRubCAgIDMuIGlmIGl0J3MgYWxyZWFkeSBwcmVzZW50IGluICRDUFBGTEFHUyBvciB0aGUgYWxyZWFkeQorICAgICAgICAgICAgICBkbmwgICAgICBjb25zdHJ1Y3RlZCAkSU5DTkFNRSwKKyAgICAgICAgICAgICAgZG5sICAgNC4gaWYgaXQgZG9lc24ndCBleGlzdCBhcyBhIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYL3Vzci9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgPSAiWC91c3IvbG9jYWwvaW5jbHVkZSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICBsaW51eCopIGhhdmVpdD15ZXM7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGZvciB4IGluICRDUFBGTEFHUyAkSU5DW11OQU1FOyBkbworICAgICAgICAgICAgICAgICAgICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW2V2YWwgeD1cIiR4XCJdKQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9pbmNsdWRlZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGRubCBSZWFsbHkgYWRkICRhZGRpdGlvbmFsX2luY2x1ZGVkaXIgdG8gJElOQ05BTUUuCisgICAgICAgICAgICAgICAgICAgICAgSU5DW11OQU1FPSIke0lOQ1tdTkFNRX0ke0lOQ1tdTkFNRTorIH0tSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG5sIExvb2sgZm9yIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmb3VuZF9sYSI7IHRoZW4KKyAgICAgICAgICAgICAgZG5sIFJlYWQgdGhlIC5sYSBmaWxlLiBJdCBkZWZpbmVzIHRoZSB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgZG5sIGRsbmFtZSwgbGlicmFyeV9uYW1lcywgb2xkX2xpYnJhcnksIGRlcGVuZGVuY3lfbGlicywgY3VycmVudCwKKyAgICAgICAgICAgICAgZG5sIGFnZSwgcmV2aXNpb24sIGluc3RhbGxlZCwgZGxvcGVuLCBkbHByZW9wZW4sIGxpYmRpci4KKyAgICAgICAgICAgICAgc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisgICAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9sYSIgaW4KKyAgICAgICAgICAgICAgICAqLyogfCAqXFwqKSAuICIkZm91bmRfbGEiIDs7CisgICAgICAgICAgICAgICAgKikgLiAiLi8kZm91bmRfbGEiIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgbGliZGlyPSIkc2F2ZV9saWJkaXIiCisgICAgICAgICAgICAgIGRubCBXZSB1c2Ugb25seSBkZXBlbmRlbmN5X2xpYnMuCisgICAgICAgICAgICAgIGZvciBkZXAgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKyAgICAgICAgICAgICAgICBjYXNlICIkZGVwIiBpbgorICAgICAgICAgICAgICAgICAgLUwqKQorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX2xpYmRpcj1gZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLUwvLydgCisgICAgICAgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMSUJOQU1FIGFuZCAkTFRMSUJOQU1FLgorICAgICAgICAgICAgICAgICAgICBkbmwgQnV0IGRvbid0IGFkZCBpdAorICAgICAgICAgICAgICAgICAgICBkbmwgICAxLiBpZiBpdCdzIHRoZSBzdGFuZGFyZCAvdXNyL2xpYiwKKyAgICAgICAgICAgICAgICAgICAgZG5sICAgMi4gaWYgaXQncyAvdXNyL2xvY2FsL2xpYiBhbmQgd2UgYXJlIHVzaW5nIEdDQyBvbiBMaW51eCwKKyAgICAgICAgICAgICAgICAgICAgZG5sICAgMy4gaWYgaXQncyBhbHJlYWR5IHByZXNlbnQgaW4gJExERkxBR1Mgb3IgdGhlIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgZG5sICAgICAgY29uc3RydWN0ZWQgJExJQk5BTUUsCisgICAgICAgICAgICAgICAgICAgIGRubCAgIDQuIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYXMgYSBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9saWJkaXIiICE9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9saWJkaXIiID0gIlgvdXNyL2xvY2FsL2xpYiI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCopIGhhdmVpdD15ZXM7OworICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMSUJbXU5BTUU7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRubCBSZWFsbHkgYWRkICRhZGRpdGlvbmFsX2xpYmRpciB0byAkTElCTkFNRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1MJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMVExJQltdTkFNRTsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMVExJQk5BTUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0tTCRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgIC1SKikKKyAgICAgICAgICAgICAgICAgICAgZGlyPWBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtUi8vJ2AKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgIT0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBkbmwgUG90ZW50aWFsbHkgYWRkIERJUiB0byBycGF0aGRpcnMuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIFRoZSBycGF0aGRpcnMgd2lsbCBiZSBhcHBlbmRlZCB0byAkTElCTkFNRSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJwYXRoZGlycz0iJHJwYXRoZGlycyAkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCBESVIgdG8gbHRycGF0aGRpcnMuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIFRoZSBsdHJwYXRoZGlycyB3aWxsIGJlIGFwcGVuZGVkIHRvICRMVExJQk5BTUUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJGx0cnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGx0cnBhdGhkaXJzPSIkbHRycGF0aGRpcnMgJGRpciIKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgLWwqKQorICAgICAgICAgICAgICAgICAgICBkbmwgSGFuZGxlIHRoaXMgaW4gdGhlIG5leHQgcm91bmQuCisgICAgICAgICAgICAgICAgICAgIG5hbWVzX25leHRfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kICJgZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLWwvLydgCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAqLmxhKQorICAgICAgICAgICAgICAgICAgICBkbmwgSGFuZGxlIHRoaXMgaW4gdGhlIG5leHQgcm91bmQuIFRocm93IGF3YXkgdGhlIC5sYSdzCisgICAgICAgICAgICAgICAgICAgIGRubCBkaXJlY3Rvcnk7IGl0IGlzIGFscmVhZHkgY29udGFpbmVkIGluIGEgcHJlY2VkaW5nIC1MCisgICAgICAgICAgICAgICAgICAgIGRubCBvcHRpb24uCisgICAgICAgICAgICAgICAgICAgIG5hbWVzX25leHRfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kICJgZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzLF5YLiovLCwnIC1lICdzLF5saWIsLCcgLWUgJ3MsXC5sYSQsLCdgCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICBkbmwgTW9zdCBsaWtlbHkgYW4gaW1tZWRpYXRlIGxpYnJhcnkgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZGVwIgorICAgICAgICAgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfSRkZXAiCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRubCBEaWRuJ3QgZmluZCB0aGUgbGlicmFyeTsgYXNzdW1lIGl0IGlzIGluIHRoZSBzeXN0ZW0gZGlyZWN0b3JpZXMKKyAgICAgICAgICAgIGRubCBrbm93biB0byB0aGUgbGlua2VyIGFuZCBydW50aW1lIGxvYWRlci4gKEFsbCB0aGUgc3lzdGVtCisgICAgICAgICAgICBkbmwgZGlyZWN0b3JpZXMga25vd24gdG8gdGhlIGxpbmtlciBzaG91bGQgYWxzbyBiZSBrbm93biB0byB0aGUKKyAgICAgICAgICAgIGRubCBydW50aW1lIGxvYWRlciwgb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gaXMgc2V2ZXJlbHkgbWlzY29uZmlndXJlZC4pCisgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1sJG5hbWUiCisgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1sJG5hbWUiCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCisgIGlmIHRlc3QgIlgkcnBhdGhkaXJzIiAhPSAiWCI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKyAgICAgIGRubCBXZWlyZCBwbGF0Zm9ybTogb25seSB0aGUgbGFzdCAtcnBhdGggb3B0aW9uIGNvdW50cywgdGhlIHVzZXIgbXVzdAorICAgICAgZG5sIHBhc3MgYWxsIHBhdGggZWxlbWVudHMgaW4gb25lIG9wdGlvbi4gV2UgY2FuIGFycmFuZ2UgdGhhdCBmb3IgYQorICAgICAgZG5sIHNpbmdsZSBsaWJyYXJ5LCBidXQgbm90IHdoZW4gbW9yZSB0aGFuIG9uZSAkTElCTkFNRXMgYXJlIHVzZWQuCisgICAgICBhbGxkaXJzPQorICAgICAgZm9yIGZvdW5kX2RpciBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICBhbGxkaXJzPSIke2FsbGRpcnN9JHthbGxkaXJzOiskaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcn0kZm91bmRfZGlyIgorICAgICAgZG9uZQorICAgICAgZG5sIE5vdGU6IGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgdXNlcyAkbGliZGlyIGFuZCAkd2wuCisgICAgICBhY2xfc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisgICAgICBsaWJkaXI9IiRhbGxkaXJzIgorICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgbGliZGlyPSIkYWNsX3NhdmVfbGliZGlyIgorICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZmxhZyIKKyAgICBlbHNlCisgICAgICBkbmwgVGhlIC1ycGF0aCBvcHRpb25zIGFyZSBjdW11bGF0aXZlLgorICAgICAgZm9yIGZvdW5kX2RpciBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICBhY2xfc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisgICAgICAgIGxpYmRpcj0iJGZvdW5kX2RpciIKKyAgICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9JGZsYWciCisgICAgICBkb25lCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAiWCRsdHJwYXRoZGlycyIgIT0gIlgiOyB0aGVuCisgICAgZG5sIFdoZW4gdXNpbmcgbGlidG9vbCwgdGhlIG9wdGlvbiB0aGF0IHdvcmtzIGZvciBib3RoIGxpYnJhcmllcyBhbmQKKyAgICBkbmwgZXhlY3V0YWJsZXMgaXMgLVIuIFRoZSAtUiBvcHRpb25zIGFyZSBjdW11bGF0aXZlLgorICAgIGZvciBmb3VuZF9kaXIgaW4gJGx0cnBhdGhkaXJzOyBkbworICAgICAgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0tUiRmb3VuZF9kaXIiCisgICAgZG9uZQorICBmaQorXSkKKworZG5sIEFDX0xJQl9BUFBFTkRUT1ZBUihWQVIsIENPTlRFTlRTKSBhcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBDT05URU5UUyB0byBWQVIsCitkbmwgdW5sZXNzIGFscmVhZHkgcHJlc2VudCBpbiBWQVIuCitkbmwgV29ya3Mgb25seSBmb3IgQ1BQRkxBR1MsIG5vdCBmb3IgTElCKiB2YXJpYWJsZXMgYmVjYXVzZSB0aGF0IHNvbWV0aW1lcworZG5sIGNvbnRhaW5zIHR3byBvciB0aHJlZSBjb25zZWN1dGl2ZSBlbGVtZW50cyB0aGF0IGJlbG9uZyB0b2dldGhlci4KK0FDX0RFRlVOKFtBQ19MSUJfQVBQRU5EVE9WQVJdLAorWworICBmb3IgZWxlbWVudCBpbiBbJDJdOyBkbworICAgIGhhdmVpdD0KKyAgICBmb3IgeCBpbiAkWyQxXTsgZG8KKyAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZWxlbWVudCI7IHRoZW4KKyAgICAgICAgaGF2ZWl0PXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgIFskMV09IiR7WyQxXX0ke1skMV06KyB9JGVsZW1lbnQiCisgICAgZmkKKyAgZG9uZQorXSkKKyMgbGliLXByZWZpeC5tNCBzZXJpYWwgMyAoZ2V0dGV4dC0wLjEzKQorZG5sIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK2RubCBBQ19MSUJfQVJHX1dJVEggaXMgc3lub255bW91cyB0byBBQ19BUkdfV0lUSCBpbiBhdXRvY29uZi0yLjEzLCBhbmQKK2RubCBzaW1pbGFyIHRvIEFDX0FSR19XSVRIIGluIGF1dG9jb25mIDIuNTIuLi4yLjU3IGV4Y2VwdCB0aGF0IGlzIGRvZXNuJ3QKK2RubCByZXF1aXJlIGV4Y2Vzc2l2ZSBicmFja2V0aW5nLgoraWZkZWYoW0FDX0hFTFBfU1RSSU5HXSwKK1tBQ19ERUZVTihbQUNfTElCX0FSR19XSVRIXSwgW0FDX0FSR19XSVRIKFskMV0sW1skMl1dLFskM10sWyQ0XSldKV0sCitbQUNfREVGVU4oW0FDX11bTElCX0FSR19XSVRIXSwgW0FDX0FSR19XSVRIKFskMV0sWyQyXSxbJDNdLFskNF0pXSldKQorCitkbmwgQUNfTElCX1BSRUZJWCBhZGRzIHRvIHRoZSBDUFBGTEFHUyBhbmQgTERGTEFHUyB0aGUgZmxhZ3MgdGhhdCBhcmUgbmVlZGVkCitkbmwgdG8gYWNjZXNzIHByZXZpb3VzbHkgaW5zdGFsbGVkIGxpYnJhcmllcy4gVGhlIGJhc2ljIGFzc3VtcHRpb24gaXMgdGhhdAorZG5sIGEgdXNlciB3aWxsIHdhbnQgcGFja2FnZXMgdG8gdXNlIG90aGVyIHBhY2thZ2VzIGhlIHByZXZpb3VzbHkgaW5zdGFsbGVkCitkbmwgd2l0aCB0aGUgc2FtZSAtLXByZWZpeCBvcHRpb24uCitkbmwgVGhpcyBtYWNybyBpcyBub3QgbmVlZGVkIGlmIG9ubHkgQUNfTElCX0xJTktGTEFHUyBpcyB1c2VkIHRvIGxvY2F0ZQorZG5sIGxpYnJhcmllcywgYnV0IGlzIG90aGVyd2lzZSB2ZXJ5IGNvbnZlbmllbnQuCitBQ19ERUZVTihbQUNfTElCX1BSRUZJWF0sCitbCisgIEFDX0JFRk9SRShbJDBdLCBbQUNfTElCX0xJTktGTEFHU10pCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0pCisgIGRubCBCeSBkZWZhdWx0LCBsb29rIGluICRpbmNsdWRlZGlyIGFuZCAkbGliZGlyLgorICB1c2VfYWRkaXRpb25hbD15ZXMKKyAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKyAgICBldmFsIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj1cIiRpbmNsdWRlZGlyXCIKKyAgICBldmFsIGFkZGl0aW9uYWxfbGliZGlyPVwiJGxpYmRpclwiCisgIF0pCisgIEFDX0xJQl9BUkdfV0lUSChbbGliLXByZWZpeF0sCitbICAtLXdpdGgtbGliLXByZWZpeFs9RElSXSBzZWFyY2ggZm9yIGxpYnJhcmllcyBpbiBESVIvaW5jbHVkZSBhbmQgRElSL2xpYgorICAtLXdpdGhvdXQtbGliLXByZWZpeCAgICBkb24ndCBzZWFyY2ggZm9yIGxpYnJhcmllcyBpbiBpbmNsdWRlZGlyIGFuZCBsaWJkaXJdLAorWworICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWG5vIjsgdGhlbgorICAgICAgdXNlX2FkZGl0aW9uYWw9bm8KKyAgICBlbHNlCisgICAgICBpZiB0ZXN0ICJYJHdpdGh2YWwiID0gIlgiOyB0aGVuCisgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorICAgICAgICBdKQorICAgICAgZWxzZQorICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9IiR3aXRodmFsL2luY2x1ZGUiCisgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPSIkd2l0aHZhbC9saWIiCisgICAgICBmaQorICAgIGZpCitdKQorICBpZiB0ZXN0ICR1c2VfYWRkaXRpb25hbCA9IHllczsgdGhlbgorICAgIGRubCBQb3RlbnRpYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkQ1BQRkxBR1MuCisgICAgZG5sIEJ1dCBkb24ndCBhZGQgaXQKKyAgICBkbmwgICAxLiBpZiBpdCdzIHRoZSBzdGFuZGFyZCAvdXNyL2luY2x1ZGUsCisgICAgZG5sICAgMi4gaWYgaXQncyBhbHJlYWR5IHByZXNlbnQgaW4gJENQUEZMQUdTLAorICAgIGRubCAgIDMuIGlmIGl0J3MgL3Vzci9sb2NhbC9pbmNsdWRlIGFuZCB3ZSBhcmUgdXNpbmcgR0NDIG9uIExpbnV4LAorICAgIGRubCAgIDQuIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYXMgYSBkaXJlY3RvcnkuCisgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYL3Vzci9pbmNsdWRlIjsgdGhlbgorICAgICAgaGF2ZWl0PQorICAgICAgZm9yIHggaW4gJENQUEZMQUdTOyBkbworICAgICAgICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW2V2YWwgeD1cIiR4XCJdKQorICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgPSAiWC91c3IvbG9jYWwvaW5jbHVkZSI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICBsaW51eCopIGhhdmVpdD15ZXM7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICAgIGRubCBSZWFsbHkgYWRkICRhZGRpdGlvbmFsX2luY2x1ZGVkaXIgdG8gJENQUEZMQUdTLgorICAgICAgICAgICAgQ1BQRkxBR1M9IiR7Q1BQRkxBR1N9JHtDUFBGTEFHUzorIH0tSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgICBkbmwgUG90ZW50aWFsbHkgYWRkICRhZGRpdGlvbmFsX2xpYmRpciB0byAkTERGTEFHUy4KKyAgICBkbmwgQnV0IGRvbid0IGFkZCBpdAorICAgIGRubCAgIDEuIGlmIGl0J3MgdGhlIHN0YW5kYXJkIC91c3IvbGliLAorICAgIGRubCAgIDIuIGlmIGl0J3MgYWxyZWFkeSBwcmVzZW50IGluICRMREZMQUdTLAorICAgIGRubCAgIDMuIGlmIGl0J3MgL3Vzci9sb2NhbC9saWIgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisgICAgZG5sICAgNC4gaWYgaXQgZG9lc24ndCBleGlzdCBhcyBhIGRpcmVjdG9yeS4KKyAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiAhPSAiWC91c3IvbGliIjsgdGhlbgorICAgICAgaGF2ZWl0PQorICAgICAgZm9yIHggaW4gJExERkxBR1M7IGRvCisgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgPSAiWC91c3IvbG9jYWwvbGliIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICBkbmwgUmVhbGx5IGFkZCAkYWRkaXRpb25hbF9saWJkaXIgdG8gJExERkxBR1MuCisgICAgICAgICAgICBMREZMQUdTPSIke0xERkxBR1N9JHtMREZMQUdTOisgfS1MJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGZpCisgIGZpCitdKQorCitkbmwgQUNfTElCX1BSRVBBUkVfUFJFRklYIGNyZWF0ZXMgdmFyaWFibGVzIGFjbF9maW5hbF9wcmVmaXgsCitkbmwgYWNsX2ZpbmFsX2V4ZWNfcHJlZml4LCBjb250YWluaW5nIHRoZSB2YWx1ZXMgdG8gd2hpY2ggJHByZWZpeCBhbmQKK2RubCAkZXhlY19wcmVmaXggd2lsbCBleHBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KK0FDX0RFRlVOKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdLAorWworICBkbmwgVW5mb3J0dW5hdGVseSwgcHJlZml4IGFuZCBleGVjX3ByZWZpeCBnZXQgb25seSBmaW5hbGx5IGRldGVybWluZWQKKyAgZG5sIGF0IHRoZSBlbmQgb2YgY29uZmlndXJlLgorICBpZiB0ZXN0ICJYJHByZWZpeCIgPSAiWE5PTkUiOyB0aGVuCisgICAgYWNsX2ZpbmFsX3ByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorICBlbHNlCisgICAgYWNsX2ZpbmFsX3ByZWZpeD0iJHByZWZpeCIKKyAgZmkKKyAgaWYgdGVzdCAiWCRleGVjX3ByZWZpeCIgPSAiWE5PTkUiOyB0aGVuCisgICAgYWNsX2ZpbmFsX2V4ZWNfcHJlZml4PScke3ByZWZpeH0nCisgIGVsc2UKKyAgICBhY2xfZmluYWxfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZmkKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBldmFsIGFjbF9maW5hbF9leGVjX3ByZWZpeD1cIiRhY2xfZmluYWxfZXhlY19wcmVmaXhcIgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCitdKQorCitkbmwgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtzdGF0ZW1lbnRdKSBldmFsdWF0ZXMgc3RhdGVtZW50LCB3aXRoIHRoZQorZG5sIHZhcmlhYmxlcyBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGJvdW5kIHRvIHRoZSB2YWx1ZXMgdGhleSB3aWxsIGhhdmUKK2RubCBhdCB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgorQUNfREVGVU4oW0FDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWF0sCitbCisgIGFjbF9zYXZlX3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3NhdmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxfZXhlY19wcmVmaXgiCisgICQxCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKK10pCisjIGxvbmdkb3VibGUubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorZG5sIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlICdsb25nIGRvdWJsZScgdHlwZS4KK2RubCBQcmVyZXF1aXNpdGU6IEFDX1BST0dfQ0MKKworQUNfREVGVU4oW2d0X1RZUEVfTE9OR0RPVUJMRV0sCitbCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgbG9uZyBkb3VibGVdLCBndF9jdl9jX2xvbmdfZG91YmxlLAorICAgIFtpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgIGd0X2N2X2NfbG9uZ19kb3VibGU9eWVzCisgICAgIGVsc2UKKyAgICAgICBBQ19UUllfQ09NUElMRShbCisgICAgICAgICAvKiBUaGUgU3RhcmRlbnQgVmlzdHJhIGtub3dzIHNpemVvZihsb25nIGRvdWJsZSksIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGl0LiAgKi8KKyAgICAgICAgIGxvbmcgZG91YmxlIGZvbyA9IDAuMDsKKyAgICAgICAgIC8qIE9uIFVsdHJpeCA0LjMgY2MsIGxvbmcgZG91YmxlIGlzIDQgYW5kIGRvdWJsZSBpcyA4LiAgKi8KKyAgICAgICAgIGludCBhcnJheSBbMiooc2l6ZW9mKGxvbmcgZG91YmxlKSA+PSBzaXplb2YoZG91YmxlKSkgLSAxXTsKKyAgICAgICAgIF0sICwKKyAgICAgICAgIGd0X2N2X2NfbG9uZ19kb3VibGU9eWVzLCBndF9jdl9jX2xvbmdfZG91YmxlPW5vKQorICAgICBmaV0pCisgIGlmIHRlc3QgJGd0X2N2X2NfbG9uZ19kb3VibGUgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9MT05HX0RPVUJMRSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2xvbmcgZG91YmxlJyB0eXBlLl0pCisgIGZpCitdKQorIyBsb25nbG9uZy5tNCBzZXJpYWwgNAorZG5sIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKworIyBEZWZpbmUgSEFWRV9MT05HX0xPTkcgaWYgJ2xvbmcgbG9uZycgd29ya3MuCisKK0FDX0RFRlVOKFtqbV9BQ19UWVBFX0xPTkdfTE9OR10sCitbCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgbG9uZyBsb25nXSwgYWNfY3ZfdHlwZV9sb25nX2xvbmcsCisgIFtBQ19UUllfTElOSyhbbG9uZyBsb25nIGxsID0gMUxMOyBpbnQgaSA9IDYzO10sCisgICAgW2xvbmcgbG9uZyBsbG1heCA9IChsb25nIGxvbmcpIC0xOworICAgICByZXR1cm4gbGwgPDwgaSB8IGxsID4+IGkgfCBsbG1heCAvIGxsIHwgbGxtYXggJSBsbDtdLAorICAgIGFjX2N2X3R5cGVfbG9uZ19sb25nPXllcywKKyAgICBhY19jdl90eXBlX2xvbmdfbG9uZz1ubyldKQorICBpZiB0ZXN0ICRhY19jdl90eXBlX2xvbmdfbG9uZyA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0xPTkdfTE9ORywgMSwKKyAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdsb25nIGxvbmcnIHR5cGUuXSkKKyAgZmkKK10pCisjIG5scy5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUtMjAwMC4KK2RubCAgIEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPiwgMjAwMC0yMDAzLgorCitBQ19ERUZVTihbQU1fTkxTXSwKK1sKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQorICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUworICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKKyAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQorICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICBBQ19TVUJTVChVU0VfTkxTKQorXSkKKworQUNfREVGVU4oW0FNX01LSU5TVEFMTERJUlNdLAorWworICBkbmwgSWYgdGhlIEFDX0NPTkZJR19BVVhfRElSIG1hY3JvIGZvciBhdXRvY29uZiBpcyB1c2VkIHdlIHBvc3NpYmx5CisgIGRubCBmaW5kIHRoZSBta2luc3RhbGxkaXJzIHNjcmlwdCBpbiBhbm90aGVyIHN1YmRpciBidXQgJCh0b3Bfc3JjZGlyKS4KKyAgZG5sIFRyeSB0byBsb2NhdGUgaXQuCisgIE1LSU5TVEFMTERJUlM9CisgIGlmIHRlc3QgLW4gIiRhY19hdXhfZGlyIjsgdGhlbgorICAgIGNhc2UgIiRhY19hdXhfZGlyIiBpbgorICAgICAgLyopIE1LSU5TVEFMTERJUlM9IiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiIDs7CisgICAgICAqKSBNS0lOU1RBTExESVJTPSJcJCh0b3BfYnVpbGRkaXIpLyRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiIDs7CisgICAgZXNhYworICBmaQorICBpZiB0ZXN0IC16ICIkTUtJTlNUQUxMRElSUyI7IHRoZW4KKyAgICBNS0lOU1RBTExESVJTPSJcJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzIgorICBmaQorICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQorXSkKKyMgcG8ubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xNCkKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KK2RubAorZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKK2RubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorZG5sIGZ1bmN0aW9uYWxpdHkuCitkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAorZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorZG5sIGdldHRleHQgcGFja2FnZSBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorZG5sIFRoZXkgYXJlICpub3QqIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCitkbmwgQXV0aG9yczoKK2RubCAgIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LTIwMDAuCitkbmwgICBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4sIDIwMDAtMjAwMy4KKworZG5sIENoZWNrcyBmb3IgYWxsIHByZXJlcXVpc2l0ZXMgb2YgdGhlIHBvIHN1YmRpcmVjdG9yeS4KK0FDX0RFRlVOKFtBTV9QT19TVUJESVJTXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCisgIEFDX1JFUVVJUkUoW0FNX01LSU5TVEFMTERJUlNdKWRubAorICBBQ19SRVFVSVJFKFtBTV9OTFNdKWRubAorCisgIGRubCBQZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGVzdHMgYWxzbyBpZiAtLWRpc2FibGUtbmxzIGhhcyBiZWVuIGdpdmVuLAorICBkbmwgYmVjYXVzZSB0aGV5IGFyZSBuZWVkZWQgZm9yICJtYWtlIGRpc3QiIHRvIHdvcmsuCisKKyAgZG5sIFNlYXJjaCBmb3IgR05VIG1zZ2ZtdCBpbiB0aGUgUEFUSC4KKyAgZG5sIFRoZSBmaXJzdCB0ZXN0IGV4Y2x1ZGVzIFNvbGFyaXMgbXNnZm10IGFuZCBlYXJseSBHTlUgbXNnZm10IHZlcnNpb25zLgorICBkbmwgVGhlIHNlY29uZCB0ZXN0IGV4Y2x1ZGVzIEZyZWVCU0QgbXNnZm10LgorICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorICAgIFskYWNfZGlyLyRhY193b3JkIC0tc3RhdGlzdGljcyAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tc3RhdGlzdGljcyAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKV0sCisgICAgOikKKyAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisKKyAgZG5sIFNlYXJjaCBmb3IgR05VIHhnZXR0ZXh0IDAuMTIgb3IgbmV3ZXIgaW4gdGhlIFBBVEguCisgIGRubCBUaGUgZmlyc3QgdGVzdCBleGNsdWRlcyBTb2xhcmlzIHhnZXR0ZXh0IGFuZCBlYXJseSBHTlUgeGdldHRleHQgdmVyc2lvbnMuCisgIGRubCBUaGUgc2Vjb25kIHRlc3QgZXhjbHVkZXMgRnJlZUJTRCB4Z2V0dGV4dC4KKyAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisgICAgWyRhY19kaXIvJGFjX3dvcmQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC0tbXNnaWQtYnVncy1hZGRyZXNzPSAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSldLAorICAgIDopCisgIGRubCBSZW1vdmUgbGVmdG92ZXIgZnJvbSBGcmVlQlNEIHhnZXR0ZXh0IGNhbGwuCisgIHJtIC1mIG1lc3NhZ2VzLnBvCisKKyAgZG5sIFNlYXJjaCBmb3IgR05VIG1zZ21lcmdlIDAuMTEgb3IgbmV3ZXIgaW4gdGhlIFBBVEguCisgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHTUVSR0UsIG1zZ21lcmdlLAorICAgIFskYWNfZGlyLyRhY193b3JkIC0tdXBkYXRlIC1xIC9kZXYvbnVsbCAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxXSwgOikKKworICBkbmwgVGhpcyBjb3VsZCBnbyBhd2F5IHNvbWUgZGF5OyB0aGUgUEFUSF9QUk9HX1dJVEhfVEVTVCBhbHJlYWR5IGRvZXMgaXQuCisgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSBtc2dmbXQuCisgIGlmIHRlc3QgIiRHTVNHRk1UIiAhPSAiOiI7IHRoZW4KKyAgICBkbmwgSWYgaXQgaXMgbm8gR05VIG1zZ2ZtdCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQorICAgIGRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCisgICAgaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAoaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICA6IDsKKyAgICBlbHNlCisgICAgICBHTVNHRk1UPWBlY2hvICIkR01TR0ZNVCIgfCBzZWQgLWUgJ3MsXi4qLywsJ2AKKyAgICAgIEFDX01TR19SRVNVTFQoCisgICAgICAgIFtmb3VuZCAkR01TR0ZNVCBwcm9ncmFtIGlzIG5vdCBHTlUgbXNnZm10OyBpZ25vcmUgaXRdKQorICAgICAgR01TR0ZNVD0iOiIKKyAgICBmaQorICBmaQorCisgIGRubCBUaGlzIGNvdWxkIGdvIGF3YXkgc29tZSBkYXk7IHRoZSBQQVRIX1BST0dfV0lUSF9URVNUIGFscmVhZHkgZG9lcyBpdC4KKyAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgorICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorICAgIGRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKKyAgICBkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgorICAgIGlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAoaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSk7IHRoZW4KKyAgICAgIDogOworICAgIGVsc2UKKyAgICAgIEFDX01TR19SRVNVTFQoCisgICAgICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCisgICAgICBYR0VUVEVYVD0iOiIKKyAgICBmaQorICAgIGRubCBSZW1vdmUgbGVmdG92ZXIgZnJvbSBGcmVlQlNEIHhnZXR0ZXh0IGNhbGwuCisgICAgcm0gLWYgbWVzc2FnZXMucG8KKyAgZmkKKworICBBQ19PVVRQVVRfQ09NTUFORFMoWworICAgIGZvciBhY19maWxlIGluICRDT05GSUdfRklMRVM7IGRvCisgICAgICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iCisgICAgICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgICAgICAgKjoqKSBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgICAgIGVzYWMKKyAgICAgICMgUE8gZGlyZWN0b3JpZXMgaGF2ZSBhIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluLmluLgorICAgICAgY2FzZSAiJGFjX2ZpbGUiIGluICovTWFrZWZpbGUuaW4pCisgICAgICAgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLgorICAgICAgICBhY19kaXI9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAiJGFjX2RpciJ8c2VkICdzJV5cLi8lJSdgIgorICAgICAgICBhY19kb3RzPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCJ8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgICAgICAgICMgSW4gYXV0b2NvbmYtMi4xMyBpdCBpcyBjYWxsZWQgJGFjX2dpdmVuX3NyY2Rpci4KKyAgICAgICAgIyBJbiBhdXRvY29uZi0yLjUwIGl0IGlzIGNhbGxlZCAkc3JjZGlyLgorICAgICAgICB0ZXN0IC1uICIkYWNfZ2l2ZW5fc3JjZGlyIiB8fCBhY19naXZlbl9zcmNkaXI9IiRzcmNkaXIiCisgICAgICAgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgICAgICAgICAgLikgIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYCA7OworICAgICAgICAgIC8qKSB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAgICAgICAgICopICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgaWYgdGVzdCAtZiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL1BPVEZJTEVTLmluIjsgdGhlbgorICAgICAgICAgIHJtIC1mICIkYWNfZGlyL1BPVEZJTEVTIgorICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZGlyL1BPVEZJTEVTIiB8fCBlY2hvICJjcmVhdGluZyAkYWNfZGlyL1BPVEZJTEVTIgorICAgICAgICAgIGNhdCAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL1BPVEZJTEVTLmluIiB8IHNlZCAtZSAiL14jL2QiIC1lICIvXlsgCV0qXCQvZCIgLWUgInMsLiosICAgICAkdG9wX3NyY2Rpci8mIFxcXFwsIiB8IHNlZCAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgPiAiJGFjX2Rpci9QT1RGSUxFUyIKKyAgICAgICAgICBQT01BS0VGSUxFREVQUz0iUE9URklMRVMuaW4iCisgICAgICAgICAgIyBBTExfTElOR1VBUywgUE9GSUxFUywgVVBEQVRFUE9GSUxFUywgRFVNTVlQT0ZJTEVTLCBHTU9GSUxFUyBkZXBlbmQKKyAgICAgICAgICAjIG9uICRhY19kaXIgYnV0IGRvbid0IGRlcGVuZCBvbiB1c2VyLXNwZWNpZmllZCBjb25maWd1cmF0aW9uCisgICAgICAgICAgIyBwYXJhbWV0ZXJzLgorICAgICAgICAgIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTIjsgdGhlbgorICAgICAgICAgICAgIyBUaGUgTElOR1VBUyBmaWxlIGNvbnRhaW5zIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGxhbmd1YWdlcy4KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRPQlNPTEVURV9BTExfTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgICAgdGVzdCAtbiAiJGFzX21lIiAmJiBlY2hvICIkYXNfbWU6IHNldHRpbmcgQUxMX0xJTkdVQVMgaW4gY29uZmlndXJlLmluIGlzIG9ic29sZXRlIiB8fCBlY2hvICJzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBBTExfTElOR1VBU189YHNlZCAtZSAiL14jL2QiICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyJgCisgICAgICAgICAgICAjIEhpZGUgdGhlIEFMTF9MSU5HVUFTIGFzc2lnbWVudCBmcm9tIGF1dG9tYWtlLgorICAgICAgICAgICAgZXZhbCAnQUxMX0xJTkdVQVMnJz0kQUxMX0xJTkdVQVNfJworICAgICAgICAgICAgUE9NQUtFRklMRURFUFM9IiRQT01BS0VGSUxFREVQUyBMSU5HVUFTIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgVGhlIHNldCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzIHdhcyBnaXZlbiBpbiBjb25maWd1cmUuaW4uCisgICAgICAgICAgICBldmFsICdBTExfTElOR1VBUycnPSRPQlNPTEVURV9BTExfTElOR1VBUycKKyAgICAgICAgICBmaQorICAgICAgICAgICMgQ29tcHV0ZSBQT0ZJTEVTCisgICAgICAgICAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykucG8pCisgICAgICAgICAgIyBDb21wdXRlIFVQREFURVBPRklMRVMKKyAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLnBvLXVwZGF0ZSkKKyAgICAgICAgICAjIENvbXB1dGUgRFVNTVlQT0ZJTEVTCisgICAgICAgICAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChsYW5nKS5ub3ApCisgICAgICAgICAgIyBDb21wdXRlIEdNT0ZJTEVTCisgICAgICAgICAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykuZ21vKQorICAgICAgICAgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgICAgICAgICAgICAuKSBzcmNkaXJwcmU9IDs7CisgICAgICAgICAgICAqKSBzcmNkaXJwcmU9JyQoc3JjZGlyKS8nIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIFBPRklMRVM9CisgICAgICAgICAgVVBEQVRFUE9GSUxFUz0KKyAgICAgICAgICBEVU1NWVBPRklMRVM9CisgICAgICAgICAgR01PRklMRVM9CisgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJHNyY2RpcnByZSRsYW5nLnBvIgorICAgICAgICAgICAgVVBEQVRFUE9GSUxFUz0iJFVQREFURVBPRklMRVMgJGxhbmcucG8tdXBkYXRlIgorICAgICAgICAgICAgRFVNTVlQT0ZJTEVTPSIkRFVNTVlQT0ZJTEVTICRsYW5nLm5vcCIKKyAgICAgICAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJHNyY2RpcnByZSRsYW5nLmdtbyIKKyAgICAgICAgICBkb25lCisgICAgICAgICAgIyBDQVRBTE9HUyBkZXBlbmRzIG9uIGJvdGggJGFjX2RpciBhbmQgdGhlIHVzZXIncyBMSU5HVUFTCisgICAgICAgICAgIyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgICAgICBJTlNUX0xJTkdVQVM9CisgICAgICAgICAgaWYgdGVzdCAtbiAiJEFMTF9MSU5HVUFTIjsgdGhlbgorICAgICAgICAgICAgZm9yIHByZXNlbnRsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgICAgICAgICAgdXNlaXQ9bm8KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJVVOU0VUJSIgIT0gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgICAgICAgICAgIGRlc2lyZWRsYW5ndWFnZXM9IiRMSU5HVUFTIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJEFMTF9MSU5HVUFTIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmb3IgZGVzaXJlZGxhbmcgaW4gJGRlc2lyZWRsYW5ndWFnZXM7IGRvCisgICAgICAgICAgICAgICAgIyBVc2UgdGhlIHByZXNlbnRsYW5nIGNhdGFsb2cgaWYgZGVzaXJlZGxhbmcgaXMKKyAgICAgICAgICAgICAgICAjICAgYS4gZXF1YWwgdG8gcHJlc2VudGxhbmcsIG9yCisgICAgICAgICAgICAgICAgIyAgIGIuIGEgdmFyaWFudCBvZiBwcmVzZW50bGFuZyAoYmVjYXVzZSBpbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAgICAgIyAgICAgIHByZXNlbnRsYW5nIGNhbiBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgZm9yIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgIyAgICAgIHdoaWNoIGFyZSBub3QgdHJhbnNsYXRlZCBpbiB0aGUgZGVzaXJlZGxhbmcgY2F0YWxvZykuCisgICAgICAgICAgICAgICAgY2FzZSAiJGRlc2lyZWRsYW5nIiBpbgorICAgICAgICAgICAgICAgICAgIiRwcmVzZW50bGFuZyIqKSB1c2VpdD15ZXM7OworICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICBpZiB0ZXN0ICR1c2VpdCA9IHllczsgdGhlbgorICAgICAgICAgICAgICAgIElOU1RfTElOR1VBUz0iJElOU1RfTElOR1VBUyAkcHJlc2VudGxhbmciCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgZmkKKyAgICAgICAgICBDQVRBTE9HUz0KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkSU5TVF9MSU5HVUFTIjsgdGhlbgorICAgICAgICAgICAgZm9yIGxhbmcgaW4gJElOU1RfTElOR1VBUzsgZG8KKyAgICAgICAgICAgICAgQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZy5nbW8iCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2Rpci9NYWtlZmlsZSIgfHwgZWNobyAiY3JlYXRpbmcgJGFjX2Rpci9NYWtlZmlsZSIKKyAgICAgICAgICBzZWQgLWUgIi9eUE9URklMRVMgPS9yICRhY19kaXIvUE9URklMRVMiIC1lICIvXiMgTWFrZXZhcnMvciAkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTWFrZXZhcnMiIC1lICJzfEBQT0ZJTEVTQHwkUE9GSUxFU3xnIiAtZSAic3xAVVBEQVRFUE9GSUxFU0B8JFVQREFURVBPRklMRVN8ZyIgLWUgInN8QERVTU1ZUE9GSUxFU0B8JERVTU1ZUE9GSUxFU3xnIiAtZSAic3xAR01PRklMRVNAfCRHTU9GSUxFU3xnIiAtZSAic3xAQ0FUQUxPR1NAfCRDQVRBTE9HU3xnIiAtZSAic3xAUE9NQUtFRklMRURFUFNAfCRQT01BS0VGSUxFREVQU3xnIiAiJGFjX2Rpci9NYWtlZmlsZS5pbiIgPiAiJGFjX2Rpci9NYWtlZmlsZSIKKyAgICAgICAgICBmb3IgZiBpbiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyIi9SdWxlcy0qOyBkbworICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCisgICAgICAgICAgICAgIGNhc2UgIiRmIiBpbgorICAgICAgICAgICAgICAgICoub3JpZyB8ICouYmFrIHwgKn4pIDs7CisgICAgICAgICAgICAgICAgKikgY2F0ICIkZiIgPj4gIiRhY19kaXIvTWFrZWZpbGUiIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICBmaQorICAgICAgICA7OworICAgICAgZXNhYworICAgIGRvbmVdLAorICAgWyMgQ2FwdHVyZSB0aGUgdmFsdWUgb2Ygb2Jzb2xldGUgQUxMX0xJTkdVQVMgYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGNvbXB1dGUKKyAgICAjIFBPRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUywgR01PRklMRVMsIENBVEFMT0dTLiBCdXQgaGlkZSBpdAorICAgICMgZnJvbSBhdXRvbWFrZS4KKyAgICBldmFsICdPQlNPTEVURV9BTExfTElOR1VBUycnPSIkQUxMX0xJTkdVQVMiJworICAgICMgQ2FwdHVyZSB0aGUgdmFsdWUgb2YgTElOR1VBUyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gY29tcHV0ZSBDQVRBTE9HUy4KKyAgICBMSU5HVUFTPSIke0xJTkdVQVMtJVVOU0VUJX0iCisgICBdKQorXSkKKworZG5sIFBvc3Rwcm9jZXNzZXMgYSBNYWtlZmlsZSBpbiBhIGRpcmVjdG9yeSBjb250YWluaW5nIFBPIGZpbGVzLgorQUNfREVGVU4oW0FNX1BPU1RQUk9DRVNTX1BPX01BS0VGSUxFXSwKK1sKKyAgIyBXaGVuIHRoaXMgY29kZSBpcyBydW4sIGluIGNvbmZpZy5zdGF0dXMsIHR3byB2YXJpYWJsZXMgaGF2ZSBhbHJlYWR5IGJlZW4KKyAgIyBzZXQ6CisgICMgLSBPQlNPTEVURV9BTExfTElOR1VBUyBpcyB0aGUgdmFsdWUgb2YgTElOR1VBUyBzZXQgaW4gY29uZmlndXJlLmluLAorICAjIC0gTElOR1VBUyBpcyB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExJTkdVQVMgYXQgY29uZmlndXJlCisgICMgICB0aW1lLgorCitjaGFuZ2VxdW90ZSgsKWRubAorICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2Rpci4KKyAgYWNfZGlyPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBhY19kaXJfc3VmZml4PSIvYGVjaG8gIiRhY19kaXIifHNlZCAncyVeXC4vJSUnYCIKKyAgYWNfZG90cz1gZWNobyAiJGFjX2Rpcl9zdWZmaXgifHNlZCAncyUvW14vXSolLi4vJWcnYAorICAjIEluIGF1dG9jb25mLTIuMTMgaXQgaXMgY2FsbGVkICRhY19naXZlbl9zcmNkaXIuCisgICMgSW4gYXV0b2NvbmYtMi41MCBpdCBpcyBjYWxsZWQgJHNyY2Rpci4KKyAgdGVzdCAtbiAiJGFjX2dpdmVuX3NyY2RpciIgfHwgYWNfZ2l2ZW5fc3JjZGlyPSIkc3JjZGlyIgorICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAgIC4pICB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2AgOzsKKyAgICAvKikgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgICAqKSAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgIyBGaW5kIGEgd2F5IHRvIGVjaG8gc3RyaW5ncyB3aXRob3V0IGludGVycHJldGluZyBiYWNrc2xhc2guCisgIGlmIHRlc3QgIlhgKGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCisgICAgZ3RfZWNobz0nZWNobycKKyAgZWxzZQorICAgIGlmIHRlc3QgIlhgKHByaW50ZiAnJXNcbicgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCisgICAgICBndF9lY2hvPSdwcmludGYgJXNcbicKKyAgICBlbHNlCisgICAgICBlY2hvX2Z1bmMgKCkgeworICAgICAgICBjYXQgPDxFT1QKKyQqCitFT1QKKyAgICAgIH0KKyAgICAgIGd0X2VjaG89J2VjaG9fZnVuYycKKyAgICBmaQorICBmaQorCisgICMgQSBzZWQgc2NyaXB0IHRoYXQgZXh0cmFjdHMgdGhlIHZhbHVlIG9mIFZBUklBQkxFIGZyb20gYSBNYWtlZmlsZS4KKyAgc2VkX3hfdmFyaWFibGU9JworIyBUZXN0IGlmIHRoZSBob2xkIHNwYWNlIGlzIGVtcHR5LgoreAorcy9QL1AvCit4Cit0YQorIyBZZXMgaXQgd2FzIGVtcHR5LiBMb29rIGlmIHdlIGhhdmUgdGhlIGV4cGVjdGVkIHZhcmlhYmxlIGRlZmluaXRpb24uCisvXlsJIF0qVkFSSUFCTEVbCSBdKj0veworICAjIFNlZW4gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24uCisgIHMvXlsJIF0qVkFSSUFCTEVbCSBdKj0vLworICBiYQorfQorYmQKKzphCisjIEhlcmUgd2UgYXJlIHByb2Nlc3NpbmcgYSBsaW5lIGZyb20gdGhlIHZhcmlhYmxlIGRlZmluaXRpb24uCisjIFJlbW92ZSBjb21tZW50LCBtb3JlIHByZWNpc2VseSByZXBsYWNlIGl0IHdpdGggYSBzcGFjZS4KK3MvIy4qJC8gLworIyBTZWUgaWYgdGhlIGxpbmUgZW5kcyBpbiBhIGJhY2tzbGFzaC4KK3RiCis6Ygorcy9cXCQvLworIyBQcmludCB0aGUgbGluZSwgd2l0aG91dCB0aGUgdHJhaWxpbmcgYmFja3NsYXNoLgorcAordGMKKyMgVGhlcmUgd2FzIG5vIHRyYWlsaW5nIGJhY2tzbGFzaC4gVGhlIGVuZCBvZiB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbiBpcworIyByZWFjaGVkLiBDbGVhciB0aGUgaG9sZCBzcGFjZS4KK3MvXi4qJC8vCit4CitiZAorOmMKKyMgQSB0cmFpbGluZyBiYWNrc2xhc2ggbWVhbnMgdGhhdCB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbiBjb250aW51ZXMgaW4gdGhlCisjIG5leHQgbGluZS4gUHV0IGEgbm9uZW1wdHkgc3RyaW5nIGludG8gdGhlIGhvbGQgc3BhY2UgdG8gaW5kaWNhdGUgdGhpcy4KK3MvXi4qJC9QLworeAorOmQKKycKK2NoYW5nZXF1b3RlKFssXSlkbmwKKworICAjIFNldCBQT1RGSUxFUyB0byB0aGUgdmFsdWUgb2YgdGhlIE1ha2VmaWxlIHZhcmlhYmxlIFBPVEZJTEVTLgorICBzZWRfeF9QT1RGSUxFUz0iYCRndF9lY2hvIFwiJHNlZF94X3ZhcmlhYmxlXCIgfCBzZWQgLWUgJy9eICojL2QnIC1lICdzL1ZBUklBQkxFL1BPVEZJTEVTL2cnYCIKKyAgUE9URklMRVM9YHNlZCAtbiAtZSAiJHNlZF94X1BPVEZJTEVTIiA8ICIkYWNfZmlsZSJgCisgICMgQ29tcHV0ZSBQT1RGSUxFU19ERVBTIGFzCisgICMgICAkKGZvcmVhY2ggZmlsZSwgJChQT1RGSUxFUyksICQodG9wX3NyY2RpcikvJChmaWxlKSkKKyAgUE9URklMRVNfREVQUz0KKyAgZm9yIGZpbGUgaW4gJFBPVEZJTEVTOyBkbworICAgIFBPVEZJTEVTX0RFUFM9IiRQT1RGSUxFU19ERVBTICInJCh0b3Bfc3JjZGlyKS8nIiRmaWxlIgorICBkb25lCisgIFBPTUFLRUZJTEVERVBTPSIiCisKKyAgaWYgdGVzdCAtbiAiJE9CU09MRVRFX0FMTF9MSU5HVUFTIjsgdGhlbgorICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIgfHwgZWNobyAic2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiCisgIGZpCisgIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTIjsgdGhlbgorICAgICMgVGhlIExJTkdVQVMgZmlsZSBjb250YWlucyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCisgICAgQUxMX0xJTkdVQVNfPWBzZWQgLWUgIi9eIy9kIiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL0xJTkdVQVMiYAorICAgIFBPTUFLRUZJTEVERVBTPSIkUE9NQUtFRklMRURFUFMgTElOR1VBUyIKKyAgZWxzZQorICAgICMgU2V0IEFMTF9MSU5HVUFTIHRvIHRoZSB2YWx1ZSBvZiB0aGUgTWFrZWZpbGUgdmFyaWFibGUgTElOR1VBUy4KKyAgICBzZWRfeF9MSU5HVUFTPSJgJGd0X2VjaG8gXCIkc2VkX3hfdmFyaWFibGVcIiB8IHNlZCAtZSAnL14gKiMvZCcgLWUgJ3MvVkFSSUFCTEUvTElOR1VBUy9nJ2AiCisgICAgQUxMX0xJTkdVQVNfPWBzZWQgLW4gLWUgIiRzZWRfeF9MSU5HVUFTIiA8ICIkYWNfZmlsZSJgCisgIGZpCisgICMgSGlkZSB0aGUgQUxMX0xJTkdVQVMgYXNzaWdtZW50IGZyb20gYXV0b21ha2UuCisgIGV2YWwgJ0FMTF9MSU5HVUFTJyc9JEFMTF9MSU5HVUFTXycKKyAgIyBDb21wdXRlIFBPRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykucG8pCisgICMgQ29tcHV0ZSBVUERBVEVQT0ZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykucG8tdXBkYXRlKQorICAjIENvbXB1dGUgRFVNTVlQT0ZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykubm9wKQorICAjIENvbXB1dGUgR01PRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykuZ21vKQorICAjIENvbXB1dGUgUFJPUEVSVElFU0ZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQodG9wX3NyY2RpcikvJChET01BSU4pXyQobGFuZykucHJvcGVydGllcykKKyAgIyBDb21wdXRlIENMQVNTRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJCh0b3Bfc3JjZGlyKS8kKERPTUFJTilfJChsYW5nKS5jbGFzcykKKyAgIyBDb21wdXRlIFFNRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykucW0pCisgICMgQ29tcHV0ZSBNU0dGSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChmcm9iICQobGFuZykpLm1zZykKKyAgIyBDb21wdXRlIFJFU09VUkNFU0RMTEZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGZyb2IgJChsYW5nKSkvJChET01BSU4pLnJlc291cmNlcy5kbGwpCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgICAgLikgc3JjZGlycHJlPSA7OworICAgICopIHNyY2RpcnByZT0nJChzcmNkaXIpLycgOzsKKyAgZXNhYworICBQT0ZJTEVTPQorICBVUERBVEVQT0ZJTEVTPQorICBEVU1NWVBPRklMRVM9CisgIEdNT0ZJTEVTPQorICBQUk9QRVJUSUVTRklMRVM9CisgIENMQVNTRklMRVM9CisgIFFNRklMRVM9CisgIE1TR0ZJTEVTPQorICBSRVNPVVJDRVNETExGSUxFUz0KKyAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgIFBPRklMRVM9IiRQT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5wbyIKKyAgICBVUERBVEVQT0ZJTEVTPSIkVVBEQVRFUE9GSUxFUyAkbGFuZy5wby11cGRhdGUiCisgICAgRFVNTVlQT0ZJTEVTPSIkRFVNTVlQT0ZJTEVTICRsYW5nLm5vcCIKKyAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5nbW8iCisgICAgUFJPUEVSVElFU0ZJTEVTPSIkUFJPUEVSVElFU0ZJTEVTIFwkKHRvcF9zcmNkaXIpL1wkKERPTUFJTilfJGxhbmcucHJvcGVydGllcyIKKyAgICBDTEFTU0ZJTEVTPSIkQ0xBU1NGSUxFUyBcJCh0b3Bfc3JjZGlyKS9cJChET01BSU4pXyRsYW5nLmNsYXNzIgorICAgIFFNRklMRVM9IiRRTUZJTEVTICRzcmNkaXJwcmUkbGFuZy5xbSIKKyAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9cLi4qJC8vJyAtZSAneS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8nYAorICAgIE1TR0ZJTEVTPSIkTVNHRklMRVMgJHNyY2RpcnByZSRmcm9iYmVkbGFuZy5tc2ciCisgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXy8tL2cnYAorICAgIFJFU09VUkNFU0RMTEZJTEVTPSIkUkVTT1VSQ0VTRExMRklMRVMgJHNyY2RpcnByZSRmcm9iYmVkbGFuZy9cJChET01BSU4pLnJlc291cmNlcy5kbGwiCisgIGRvbmUKKyAgIyBDQVRBTE9HUyBkZXBlbmRzIG9uIGJvdGggJGFjX2RpciBhbmQgdGhlIHVzZXIncyBMSU5HVUFTCisgICMgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgIElOU1RfTElOR1VBUz0KKyAgaWYgdGVzdCAtbiAiJEFMTF9MSU5HVUFTIjsgdGhlbgorICAgIGZvciBwcmVzZW50bGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICB1c2VpdD1ubworICAgICAgaWYgdGVzdCAiJVVOU0VUJSIgIT0gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkTElOR1VBUyIKKyAgICAgIGVsc2UKKyAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJEFMTF9MSU5HVUFTIgorICAgICAgZmkKKyAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KKyAgICAgICAgIyBVc2UgdGhlIHByZXNlbnRsYW5nIGNhdGFsb2cgaWYgZGVzaXJlZGxhbmcgaXMKKyAgICAgICAgIyAgIGEuIGVxdWFsIHRvIHByZXNlbnRsYW5nLCBvcgorICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKKyAgICAgICAgIyAgICAgIHByZXNlbnRsYW5nIGNhbiBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgZm9yIG1lc3NhZ2VzCisgICAgICAgICMgICAgICB3aGljaCBhcmUgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGRlc2lyZWRsYW5nIGNhdGFsb2cpLgorICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCisgICAgICAgICAgIiRwcmVzZW50bGFuZyIqKSB1c2VpdD15ZXM7OworICAgICAgICBlc2FjCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0ICR1c2VpdCA9IHllczsgdGhlbgorICAgICAgICBJTlNUX0xJTkdVQVM9IiRJTlNUX0xJTkdVQVMgJHByZXNlbnRsYW5nIgorICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgIENBVEFMT0dTPQorICBKQVZBQ0FUQUxPR1M9CisgIFFUQ0FUQUxPR1M9CisgIFRDTENBVEFMT0dTPQorICBDU0hBUlBDQVRBTE9HUz0KKyAgaWYgdGVzdCAtbiAiJElOU1RfTElOR1VBUyI7IHRoZW4KKyAgICBmb3IgbGFuZyBpbiAkSU5TVF9MSU5HVUFTOyBkbworICAgICAgQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZy5nbW8iCisgICAgICBKQVZBQ0FUQUxPR1M9IiRKQVZBQ0FUQUxPR1MgXCQoRE9NQUlOKV8kbGFuZy5wcm9wZXJ0aWVzIgorICAgICAgUVRDQVRBTE9HUz0iJFFUQ0FUQUxPR1MgJGxhbmcucW0iCisgICAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9cLi4qJC8vJyAtZSAneS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8nYAorICAgICAgVENMQ0FUQUxPR1M9IiRUQ0xDQVRBTE9HUyAkZnJvYmJlZGxhbmcubXNnIgorICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXy8tL2cnYAorICAgICAgQ1NIQVJQQ0FUQUxPR1M9IiRDU0hBUlBDQVRBTE9HUyAkZnJvYmJlZGxhbmcvXCQoRE9NQUlOKS5yZXNvdXJjZXMuZGxsIgorICAgIGRvbmUKKyAgZmkKKworICBzZWQgLWUgInN8QFBPVEZJTEVTX0RFUFNAfCRQT1RGSUxFU19ERVBTfGciIC1lICJzfEBQT0ZJTEVTQHwkUE9GSUxFU3xnIiAtZSAic3xAVVBEQVRFUE9GSUxFU0B8JFVQREFURVBPRklMRVN8ZyIgLWUgInN8QERVTU1ZUE9GSUxFU0B8JERVTU1ZUE9GSUxFU3xnIiAtZSAic3xAR01PRklMRVNAfCRHTU9GSUxFU3xnIiAtZSAic3xAUFJPUEVSVElFU0ZJTEVTQHwkUFJPUEVSVElFU0ZJTEVTfGciIC1lICJzfEBDTEFTU0ZJTEVTQHwkQ0xBU1NGSUxFU3xnIiAtZSAic3xAUU1GSUxFU0B8JFFNRklMRVN8ZyIgLWUgInN8QE1TR0ZJTEVTQHwkTVNHRklMRVN8ZyIgLWUgInN8QFJFU09VUkNFU0RMTEZJTEVTQHwkUkVTT1VSQ0VTRExMRklMRVN8ZyIgLWUgInN8QENBVEFMT0dTQHwkQ0FUQUxPR1N8ZyIgLWUgInN8QEpBVkFDQVRBTE9HU0B8JEpBVkFDQVRBTE9HU3xnIiAtZSAic3xAUVRDQVRBTE9HU0B8JFFUQ0FUQUxPR1N8ZyIgLWUgInN8QFRDTENBVEFMT0dTQHwkVENMQ0FUQUxPR1N8ZyIgLWUgInN8QENTSEFSUENBVEFMT0dTQHwkQ1NIQVJQQ0FUQUxPR1N8ZyIgLWUgJ3MsXiNkaXN0ZGlyOixkaXN0ZGlyOiwnIDwgIiRhY19maWxlIiA+ICIkYWNfZmlsZS50bXAiCisgIGlmIGdyZXAgLWwgJ0BUQ0xDQVRBTE9HU0AnICIkYWNfZmlsZSIgPiAvZGV2L251bGw7IHRoZW4KKyAgICAjIEFkZCBkZXBlbmRlbmNpZXMgdGhhdCBjYW5ub3QgYmUgZm9ybXVsYXRlZCBhcyBhIHNpbXBsZSBzdWZmaXggcnVsZS4KKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9cLi4qJC8vJyAtZSAneS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8nYAorICAgICAgY2F0ID4+ICIkYWNfZmlsZS50bXAiIDw8RU9GCiskZnJvYmJlZGxhbmcubXNnOiAkbGFuZy5wbworCUBlY2hvICJcJChNU0dGTVQpIC1jIC0tdGNsIC1kIFwkKHNyY2RpcikgLWwgJGxhbmcgJHNyY2RpcnByZSRsYW5nLnBvIjsgXAorCVwkKE1TR0ZNVCkgLWMgLS10Y2wgLWQgIlwkKHNyY2RpcikiIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyB8fCB7IHJtIC1mICJcJChzcmNkaXIpLyRmcm9iYmVkbGFuZy5tc2ciOyBleGl0IDE7IH0KK0VPRgorICAgIGRvbmUKKyAgZmkKKyAgaWYgZ3JlcCAtbCAnQENTSEFSUENBVEFMT0dTQCcgIiRhY19maWxlIiA+IC9kZXYvbnVsbDsgdGhlbgorICAgICMgQWRkIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSBmb3JtdWxhdGVkIGFzIGEgc2ltcGxlIHN1ZmZpeCBydWxlLgorICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL18vLS9nJ2AKKyAgICAgIGNhdCA+PiAiJGFjX2ZpbGUudG1wIiA8PEVPRgorJGZyb2JiZWRsYW5nL1wkKERPTUFJTikucmVzb3VyY2VzLmRsbDogJGxhbmcucG8KKwlAZWNobyAiXCQoTVNHRk1UKSAtYyAtLWNzaGFycCAtZCBcJChzcmNkaXIpIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyAtciBcJChET01BSU4pIjsgXAorCVwkKE1TR0ZNVCkgLWMgLS1jc2hhcnAgLWQgIlwkKHNyY2RpcikiIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyAtciAiXCQoRE9NQUlOKSIgfHwgeyBybSAtZiAiXCQoc3JjZGlyKS8kZnJvYmJlZGxhbmcubXNnIjsgZXhpdCAxOyB9CitFT0YKKyAgICBkb25lCisgIGZpCisgIGlmIHRlc3QgLW4gIiRQT01BS0VGSUxFREVQUyI7IHRoZW4KKyAgICBjYXQgPj4gIiRhY19maWxlLnRtcCIgPDxFT0YKK01ha2VmaWxlOiAkUE9NQUtFRklMRURFUFMKK0VPRgorICBmaQorICBtdiAiJGFjX2ZpbGUudG1wIiAiJGFjX2ZpbGUiCitdKQorIyBwcmludGYtcG9zaXgubTQgc2VyaWFsIDIgKGdldHRleHQtMC4xMy4xKQorZG5sIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorZG5sIFRlc3Qgd2hldGhlciB0aGUgcHJpbnRmKCkgZnVuY3Rpb24gc3VwcG9ydHMgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzIHdpdGgKK2RubCBwb3NpdGlvbnMuCisKK0FDX0RFRlVOKFtndF9QUklOVEZfUE9TSVhdLAorWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgcHJpbnRmKCkgc3VwcG9ydHMgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzXSwKKyAgICBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCwKKyAgICBbCisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorLyogVGhlIHN0cmluZyAiJTIkZCAlMSRkIiwgd2l0aCBkb2xsYXIgY2hhcmFjdGVycyBwcm90ZWN0ZWQgZnJvbSB0aGUgc2hlbGwncworICAgZG9sbGFyIGV4cGFuc2lvbiAocG9zc2libHkgYW4gYXV0b2NvbmYgYnVnKS4gICovCitzdGF0aWMgY2hhciBmb3JtYXRbXSA9IHsgJyUnLCAnMicsICckJywgJ2QnLCAnICcsICclJywgJzEnLCAnJCcsICdkJywgJ1wwJyB9Oworc3RhdGljIGNoYXIgYnVmWzEwMF07CitpbnQgbWFpbiAoKQoreworICBzcHJpbnRmIChidWYsIGZvcm1hdCwgMzMsIDU1KTsKKyAgcmV0dXJuIChzdHJjbXAgKGJ1ZiwgIjU1IDMzIikgIT0gMCk7Cit9XSwgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9eWVzLCBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeD1ubywKKyAgICAgIFsKKyAgICAgICAgQUNfRUdSRVBfQ1BQKG5vdHBvc2l4LCBbCisjaWYgZGVmaW5lZCBfX05ldEJTRF9fIHx8IGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX01JTkdXMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18KKyAgbm90cG9zaXgKKyNlbmRpZgorICAgICAgICBdLCBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeD0iZ3Vlc3Npbmcgbm8iLAorICAgICAgICAgICBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeD0iZ3Vlc3NpbmcgeWVzIikKKyAgICAgIF0pCisgICAgXSkKKyAgY2FzZSAkZ3RfY3ZfZnVuY19wcmludGZfcG9zaXggaW4KKyAgICAqeWVzKQorICAgICAgQUNfREVGSU5FKEhBVkVfUE9TSVhfUFJJTlRGLCAxLAorICAgICAgICBbRGVmaW5lIGlmIHlvdXIgcHJpbnRmKCkgZnVuY3Rpb24gc3VwcG9ydHMgZm9ybWF0IHN0cmluZ3Mgd2l0aCBwb3NpdGlvbnMuXSkKKyAgICAgIDs7CisgIGVzYWMKK10pCisjIHByb2d0ZXN0Lm00IHNlcmlhbCAzIChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCitkbmwKK2RubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCitkbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKK2RubCBmdW5jdGlvbmFsaXR5LgorZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKK2RubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKK2RubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KK2RubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KKworZG5sIEF1dGhvcnM6CitkbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKworZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAorZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQorQUNfREVGVU4oW0FNX1BBVEhfUFJPR19XSVRIX1RFU1RdLAorWworIyBQcmVwYXJlIFBBVEhfU0VQQVJBVE9SLgorIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKKworIyBGaW5kIG91dCBob3cgdG8gdGVzdCBmb3IgZXhlY3V0YWJsZSBmaWxlcy4gRG9uJ3QgdXNlIGEgemVyby1ieXRlIGZpbGUsCisjIGFzIHN5c3RlbXMgbWF5IHVzZSBtZXRob2RzIG90aGVyIHRoYW4gbW9kZSBiaXRzIHRvIGRldGVybWluZSBleGVjdXRhYmlsaXR5LgorY2F0ID5jb25mJCQuZmlsZSA8PF9BU0VPRgorIyEgL2Jpbi9zaAorZXhpdCAwCitfQVNFT0YKK2NobW9kICt4IGNvbmYkJC5maWxlCitpZiB0ZXN0IC14IGNvbmYkJC5maWxlID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19leGVjdXRhYmxlX3A9InRlc3QgLXgiCitlbHNlCisgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKK2ZpCitybSAtZiBjb25mJCQuZmlsZQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKK1tjYXNlICJbJF0kMSIgaW4KKyAgW1tcXC9dXSogfCA/OltbXFwvXV0qKQorICAgIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgICA7OworICAqKQorICAgIGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbworICAgICAgSUZTPSIkYWNfc2F2ZV9JRlMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICAgIGlmICRhY19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgICAgICAgaWYgWyQzXTsgdGhlbgorICAgICAgICAgICAgYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAgICAgICAgIGJyZWFrIDIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICBJRlM9IiRhY19zYXZlX0lGUyIKK2RubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCitkbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KK2lmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCitdKWRubAorICAgIDs7Citlc2FjXSlkbmwKKyQxPSIkYWNfY3ZfcGF0aF8kMSIKK2lmIHRlc3QgaWZlbHNlKFskNF0sICwgWy1uICJbJF0kMSJdLCBbIlskXSQxIiAhPSAiJDQiXSk7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChbJF0kMSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitBQ19TVUJTVCgkMSlkbmwKK10pCisjIHNpZ25lZC5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjEwLjQwKQorZG5sIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK0FDX0RFRlVOKFtiaF9DX1NJR05FRF0sCitbCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3Igc2lnbmVkXSwgYmhfY3ZfY19zaWduZWQsCisgICBbQUNfVFJZX0NPTVBJTEUoLCBbc2lnbmVkIGNoYXIgeDtdLCBiaF9jdl9jX3NpZ25lZD15ZXMsIGJoX2N2X2Nfc2lnbmVkPW5vKV0pCisgIGlmIHRlc3QgJGJoX2N2X2Nfc2lnbmVkID0gbm87IHRoZW4KKyAgICBBQ19ERUZJTkUoc2lnbmVkLCAsCisgICAgICAgICAgICAgIFtEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIEMgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMga2V5d29yZC5dKQorICBmaQorXSkKKyMgc2l6ZV9tYXgubTQgc2VyaWFsIDIKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW2dsX1NJWkVfTUFYXSwKK1sKKyAgQUNfQ0hFQ0tfSEVBREVSUyhzdGRpbnQuaCkKKyAgZG5sIEZpcnN0IHRlc3Qgd2hldGhlciB0aGUgc3lzdGVtIGFscmVhZHkgaGFzIFNJWkVfTUFYLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBTSVpFX01BWF0pCisgIHJlc3VsdD0KKyAgQUNfRUdSRVBfQ1BQKFtGb3VuZCBpdF0sIFsKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBTSVpFX01BWAorRm91bmQgaXQKKyNlbmRpZgorXSwgcmVzdWx0PXllcykKKyAgaWYgdGVzdCAteiAiJHJlc3VsdCI7IHRoZW4KKyAgICBkbmwgRGVmaW5lIGl0IG91cnNlbHZlcy4gSGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgdHlwZSAnc2l6ZV90JyBpcyBub3Qgd2lkZXIKKyAgICBkbmwgdGhhbiB0aGUgdHlwZSAndW5zaWduZWQgbG9uZycuCisgICAgZG5sIFRoZSBfQUNfQ09NUFVURV9JTlQgbWFjcm8gd29ya3MgdXAgdG8gTE9OR19NQVgsIHNpbmNlIGl0IHVzZXMgJ2V4cHInLAorICAgIGRubCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHdvcmsgZnJvbSBMT05HX01JTiB0byBMT05HX01BWC4KKyAgICBfQUNfQ09NUFVURV9JTlQoW34oc2l6ZV90KTAgLyAxMF0sIHJlc19oaSwKKyAgICAgIFsjaW5jbHVkZSA8c3RkZGVmLmg+XSwgcmVzdWx0PT8pCisgICAgX0FDX0NPTVBVVEVfSU5UKFt+KHNpemVfdCkwICUgMTBdLCByZXNfbG8sCisgICAgICBbI2luY2x1ZGUgPHN0ZGRlZi5oPl0sIHJlc3VsdD0/KQorICAgIF9BQ19DT01QVVRFX0lOVChbc2l6ZW9mIChzaXplX3QpIDw9IHNpemVvZiAodW5zaWduZWQgaW50KV0sIGZpdHNfaW5fdWludCwKKyAgICAgIFsjaW5jbHVkZSA8c3RkZGVmLmg+XSwgcmVzdWx0PT8pCisgICAgaWYgdGVzdCAiJGZpdHNfaW5fdWludCIgPSAxOyB0aGVuCisgICAgICBkbmwgRXZlbiB0aG91Z2ggU0laRV9NQVggZml0cyBpbiBhbiB1bnNpZ25lZCBpbnQsIGl0IG11c3QgYmUgb2YgdHlwZQorICAgICAgZG5sICd1bnNpZ25lZCBsb25nJyBpZiB0aGUgdHlwZSAnc2l6ZV90JyBpcyB0aGUgc2FtZSBhcyAndW5zaWduZWQgbG9uZycuCisgICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGRlZi5oPgorICAgICAgICBleHRlcm4gc2l6ZV90IGZvbzsKKyAgICAgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZm9vOworICAgICAgICBdLCBbXSwgZml0c19pbl91aW50PTApCisgICAgZmkKKyAgICBpZiB0ZXN0IC16ICIkcmVzdWx0IjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGZpdHNfaW5fdWludCIgPSAxOyB0aGVuCisgICAgICAgIHJlc3VsdD0iJHJlc19oaSRyZXNfbG8iVQorICAgICAgZWxzZQorICAgICAgICByZXN1bHQ9IiRyZXNfaGkkcmVzX2xvIlVMCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGRubCBTaG91bGRuJ3QgaGFwcGVuLCBidXQgd2hvIGtub3dzLi4uCisgICAgICByZXN1bHQ9J34oc2l6ZV90KTAnCisgICAgZmkKKyAgZmkKKyAgQUNfTVNHX1JFU1VMVChbJHJlc3VsdF0pCisgIGlmIHRlc3QgIiRyZXN1bHQiICE9IHllczsgdGhlbgorICAgIEFDX0RFRklORV9VTlFVT1RFRChbU0laRV9NQVhdLCBbJHJlc3VsdF0sCisgICAgICBbRGVmaW5lIGFzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHR5cGUgJ3NpemVfdCcsIGlmIHRoZSBzeXN0ZW0gZG9lc24ndCBkZWZpbmUgaXQuXSkKKyAgZmkKK10pCisjIHN0ZGludF9oLm00IHNlcmlhbCAzIChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorCisjIERlZmluZSBIQVZFX1NURElOVF9IX1dJVEhfVUlOVE1BWCBpZiA8c3RkaW50Lmg+IGV4aXN0cywKKyMgZG9lc24ndCBjbGFzaCB3aXRoIDxzeXMvdHlwZXMuaD4sIGFuZCBkZWNsYXJlcyB1aW50bWF4X3QuCisKK0FDX0RFRlVOKFtqbV9BQ19IRUFERVJfU1RESU5UX0hdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIHN0ZGludC5oXSwgam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oLAorICBbQUNfVFJZX0NPTVBJTEUoCisgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD5dLAorICAgIFt1aW50bWF4X3QgaSA9ICh1aW50bWF4X3QpIC0xO10sCisgICAgam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oPXllcywKKyAgICBqbV9hY19jdl9oZWFkZXJfc3RkaW50X2g9bm8pXSkKKyAgaWYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYLCAxLAorICAgICAgW0RlZmluZSBpZiA8c3RkaW50Lmg+IGV4aXN0cywgZG9lc24ndCBjbGFzaCB3aXRoIDxzeXMvdHlwZXMuaD4sCisgICAgICAgYW5kIGRlY2xhcmVzIHVpbnRtYXhfdC4gXSkKKyAgZmkKK10pCisjIHVpbnRtYXhfdC5tNCBzZXJpYWwgNyAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKworQUNfUFJFUkVRKDIuMTMpCisKKyMgRGVmaW5lIHVpbnRtYXhfdCB0byAndW5zaWduZWQgbG9uZycgb3IgJ3Vuc2lnbmVkIGxvbmcgbG9uZycKKyMgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCBpbiA8c3RkaW50Lmg+IG9yIDxpbnR0eXBlcy5oPi4KKworQUNfREVGVU4oW2ptX0FDX1RZUEVfVUlOVE1BWF9UXSwKK1sKKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX0lOVFRZUEVTX0hdKQorICBBQ19SRVFVSVJFKFtqbV9BQ19IRUFERVJfU1RESU5UX0hdKQorICBpZiB0ZXN0ICRqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaCA9IG5vICYmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaCA9IG5vOyB0aGVuCisgICAgQUNfUkVRVUlSRShbam1fQUNfVFlQRV9VTlNJR05FRF9MT05HX0xPTkddKQorICAgIHRlc3QgJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nID0geWVzIFwKKyAgICAgICYmIGFjX3R5cGU9J3Vuc2lnbmVkIGxvbmcgbG9uZycgXAorICAgICAgfHwgYWNfdHlwZT0ndW5zaWduZWQgbG9uZycKKyAgICBBQ19ERUZJTkVfVU5RVU9URUQodWludG1heF90LCAkYWNfdHlwZSwKKyAgICAgIFtEZWZpbmUgdG8gdW5zaWduZWQgbG9uZyBvciB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICAgICBpZiA8c3RkaW50Lmg+IGFuZCA8aW50dHlwZXMuaD4gZG9uJ3QgZGVmaW5lLl0pCisgIGVsc2UKKyAgICBBQ19ERUZJTkUoSEFWRV9VSU5UTUFYX1QsIDEsCisgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAndWludG1heF90JyB0eXBlIGluIDxzdGRpbnQuaD4gb3IgPGludHR5cGVzLmg+Ll0pCisgIGZpCitdKQorIyB1bG9uZ2xvbmcubTQgc2VyaWFsIDMKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gUGF1bCBFZ2dlcnQuCisKKyMgRGVmaW5lIEhBVkVfVU5TSUdORURfTE9OR19MT05HIGlmICd1bnNpZ25lZCBsb25nIGxvbmcnIHdvcmtzLgorCitBQ19ERUZVTihbam1fQUNfVFlQRV9VTlNJR05FRF9MT05HX0xPTkddLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIHVuc2lnbmVkIGxvbmcgbG9uZ10sIGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nLAorICBbQUNfVFJZX0xJTksoW3Vuc2lnbmVkIGxvbmcgbG9uZyB1bGwgPSAxVUxMOyBpbnQgaSA9IDYzO10sCisgICAgW3Vuc2lnbmVkIGxvbmcgbG9uZyB1bGxtYXggPSAodW5zaWduZWQgbG9uZyBsb25nKSAtMTsKKyAgICAgcmV0dXJuIHVsbCA8PCBpIHwgdWxsID4+IGkgfCB1bGxtYXggLyB1bGwgfCB1bGxtYXggJSB1bGw7XSwKKyAgICBhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZz15ZXMsCisgICAgYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmc9bm8pXSkKKyAgaWYgdGVzdCAkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmcgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9VTlNJR05FRF9MT05HX0xPTkcsIDEsCisgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAndW5zaWduZWQgbG9uZyBsb25nJyB0eXBlLl0pCisgIGZpCitdKQorIyB3Y2hhcl90Lm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KK2RubCBUZXN0IHdoZXRoZXIgPHN0ZGRlZi5oPiBoYXMgdGhlICd3Y2hhcl90JyB0eXBlLgorZG5sIFByZXJlcXVpc2l0ZTogQUNfUFJPR19DQworCitBQ19ERUZVTihbZ3RfVFlQRV9XQ0hBUl9UXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3Y2hhcl90XSwgZ3RfY3ZfY193Y2hhcl90LAorICAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGRlZi5oPgorICAgICAgIHdjaGFyX3QgZm9vID0gKHdjaGFyX3QpJ1wwJztdLCAsCisgICAgICAgZ3RfY3ZfY193Y2hhcl90PXllcywgZ3RfY3ZfY193Y2hhcl90PW5vKV0pCisgIGlmIHRlc3QgJGd0X2N2X2Nfd2NoYXJfdCA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX1dDSEFSX1QsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICd3Y2hhcl90JyB0eXBlLl0pCisgIGZpCitdKQorIyB3aW50X3QubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KK2RubCBUZXN0IHdoZXRoZXIgPHdjaGFyLmg+IGhhcyB0aGUgJ3dpbnRfdCcgdHlwZS4KK2RubCBQcmVyZXF1aXNpdGU6IEFDX1BST0dfQ0MKKworQUNfREVGVU4oW2d0X1RZUEVfV0lOVF9UXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3aW50X3RdLCBndF9jdl9jX3dpbnRfdCwKKyAgICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgorICAgICAgIHdpbnRfdCBmb28gPSAod2NoYXJfdCknXDAnO10sICwKKyAgICAgICBndF9jdl9jX3dpbnRfdD15ZXMsIGd0X2N2X2Nfd2ludF90PW5vKV0pCisgIGlmIHRlc3QgJGd0X2N2X2Nfd2ludF90ID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfV0lOVF9ULCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnd2ludF90JyB0eXBlLl0pCisgIGZpCitdKQorIyB4c2l6ZS5tNCBzZXJpYWwgMgorZG5sIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworQUNfREVGVU4oW2dsX1hTSVpFXSwKK1sKKyAgZG5sIFByZXJlcXVpc2l0ZXMgb2YgbGliL3hzaXplLmguCisgIEFDX1JFUVVJUkUoW2dsX1NJWkVfTUFYXSkKKyAgQUNfQ0hFQ0tfSEVBREVSUyhzdGRpbnQuaCkKK10pCisKKyMgZnJvbSBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2F4X3Rscy5odG1sCisjCisjIFRoaXMgd2FzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQKKyMgb3duZXIgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZQorIyBjb25maWd1cmUgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZworIyB0aGUgTWFjcm8uIFlvdSBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSB3aGVuIHVzaW5nIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoCisjIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZSBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsCisjIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQKKyMgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUKKyMgQXV0b2NvbmYgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIE1hY3JvIEFyY2hpdmUuIFdoZW4geW91IG1ha2UKKyMgYW5kIGRpc3RyaWJ1dGUgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heQorIyBleHRlbmQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQKKyMgdmVyc2lvbiBhcyB3ZWxsLgorIworQUNfREVGVU4oW0FYX1RMU10sIFsKKyAgQUNfTVNHX0NIRUNLSU5HKGZvciB0aHJlYWQgbG9jYWwgc3RvcmFnZSAoVExTKSBjbGFzcykKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X3RscywgWworICAgIGF4X3Rsc19rZXl3b3Jkcz0iX190aHJlYWQgX19kZWNsc3BlYyh0aHJlYWQpIG5vbmUiCisgICAgZm9yIGF4X3Rsc19rZXl3b3JkIGluICRheF90bHNfa2V5d29yZHM7IGRvCisgICAgICAgY2FzZSAkYXhfdGxzX2tleXdvcmQgaW4KKyAgICAgICAgICBub25lKSBhY19jdl90bHM9bm9uZSA7IGJyZWFrIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgICBBQ19UUllfQ09NUElMRSgKKyAgICAgICAgICAgICAgICBbI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICAgICAgICAgICBmb28odm9pZCkgeworICAgICAgICAgICAgICAgICBzdGF0aWMgXSAkYXhfdGxzX2tleXdvcmQgWyBpbnQgYmFyOworICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgW10sCisgICAgICAgICAgICAgICAgIFthY19jdl90bHM9JGF4X3Rsc19rZXl3b3JkIDsgYnJlYWtdLAorICAgICAgICAgICAgICAgICBhY19jdl90bHM9bm9uZQorICAgICAgICAgICAgICkKKyAgICAgICAgICBlc2FjCisgICAgZG9uZQorXSkKKworICBpZiB0ZXN0ICIkYWNfY3ZfdGxzIiAhPSAibm9uZSI7IHRoZW4KKyAgICBkbmwgQUNfREVGSU5FKFtUTFNdLCBbXSwgW0lmIHRoZSBjb21waWxlciBzdXBwb3J0cyBhIFRMUyBzdG9yYWdlIGNsYXNzIGRlZmluZSBpdCB0byB0aGF0IGhlcmVdKQorICAgIEFDX0RFRklORV9VTlFVT1RFRChbVExTXSwgJGFjX2N2X3RscywgW0lmIHRoZSBjb21waWxlciBzdXBwb3J0cyBhIFRMUyBzdG9yYWdlIGNsYXNzIGRlZmluZSBpdCB0byB0aGF0IGhlcmVdKQorICBmaQorICBBQ19NU0dfUkVTVUxUKCRhY19jdl90bHMpCitdKQorCisjIEV4Y2VycHRlZCBmcm9tIHBrZy5tNCAtIE1hY3JvcyB0byBsb2NhdGUgYW5kIHV0aWxpc2UgcGtnLWNvbmZpZworIworIyBDb3B5cmlnaHQgw4LCqSAyMDA0IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQS0dfUFJPR19QS0dfQ09ORklHKFtNSU4tVkVSU0lPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfUFJPR19QS0dfQ09ORklHXSwKK1ttNF9wYXR0ZXJuX2ZvcmJpZChbXl8/UEtHX1tBLVpfXSskXSkKK200X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHKF9QQVRIKT8kXSkKK0FDX0FSR19WQVIoW1BLR19DT05GSUddLCBbcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHldKWRubAoraWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgorICAgICAgICBBQ19QQVRIX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCitmaQoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgICAgIF9wa2dfbWluX3ZlcnNpb249bTRfZGVmYXVsdChbJDFdLCBbMC45LjBdKQorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3BrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbl0pCisgICAgICAgIGlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICAgICAgUEtHX0NPTkZJRz0iIgorICAgICAgICBmaQorICAgICAgICAgICAgICAgCitmaVtdZG5sCitdKSMgUEtHX1BST0dfUEtHX0NPTkZJRworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICBodHRwOi8vd3d3Lm5vbmdudS5vcmcvYXV0b2NvbmYtYXJjaGl2ZS9jaGVja19nbnVfbWFrZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIENIRUNLX0dOVV9NQUtFKCkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUaGlzIG1hY3JvIHNlYXJjaGVzIGZvciBhIEdOVSB2ZXJzaW9uIG9mIG1ha2UuIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZQorIyAgIG1ha2VmaWxlIHZhcmlhYmxlIGBpZkdOVW1ha2UnIGlzIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nLCBvdGhlcndpc2UgaXQKKyMgICBpcyBzZXQgdG8gIiMiLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5jbHVkaW5nIGEgc3BlY2lhbCBmZWF0dXJlcyBpbiBhCisjICAgTWFrZWZpbGUsIHdoaWNoIGNhbm5vdCBiZSBoYW5kbGVkIGJ5IG90aGVyIHZlcnNpb25zIG9mIG1ha2UuIFRoZQorIyAgIHZhcmlhYmxlIF9jdl9nbnVfbWFrZV9jb21tYW5kIGlzIHNldCB0byB0aGUgY29tbWFuZCB0byBpbnZva2UgR05VIG1ha2UKKyMgICBpZiBpdCBleGlzdHMsIHRoZSBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlLgorIworIyAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpdHMgdXNlOgorIworIyAgIE1ha2VmaWxlLmluIG1pZ2h0IGNvbnRhaW46CisjCisjICAgICAgICMgQSBmYWlsc2FmZSB3YXkgb2YgcHV0dGluZyBhIGRlcGVuZGVuY3kgcnVsZSBpbnRvIGEgbWFrZWZpbGUKKyMgICAgICAgJChERVBFTkQpOgorIyAgICAgICAgICAgICAgICQoQ0MpIC1NTSAkKHNyY2RpcikvKi5jID4gJChERVBFTkQpCisjCisjICAgICAgIEBpZkdOVW1ha2VAIGlmZXEgKCQoREVQRU5EKSwkKHdpbGRjYXJkICQoREVQRU5EKSkpCisjICAgICAgIEBpZkdOVW1ha2VAIGluY2x1ZGUgJChERVBFTkQpCisjICAgICAgIEBpZkdOVW1ha2VAIGVuZGlmCisjCisjICAgVGhlbiBjb25maWd1cmUuaW4gd291bGQgbm9ybWFsbHkgY29udGFpbjoKKyMKKyMgICAgICAgQ0hFQ0tfR05VX01BS0UoKQorIyAgICAgICBBQ19PVVRQVVQoTWFrZWZpbGUpCisjCisjICAgVGhlbiBwZXJoYXBzIHRvIGNhdXNlIGdudSBtYWtlIHRvIG92ZXJyaWRlIGFueSBvdGhlciBtYWtlLCB3ZSBjb3VsZCBkbworIyAgIHNvbWV0aGluZyBsaWtlIHRoaXMgKG5vdGUgdGhhdCBHTlUgbWFrZSBhbHdheXMgbG9va3MgZm9yIEdOVW1ha2VmaWxlCisjICAgZmlyc3QpOgorIworIyAgICAgICBpZiAgISB0ZXN0IHgkX2N2X2dudV9tYWtlX2NvbW1hbmQgPSB4IDsgdGhlbgorIyAgICAgICAgICAgICAgIG12IE1ha2VmaWxlIEdOVW1ha2VmaWxlCisjICAgICAgICAgICAgICAgZWNobyAuREVGQVVMVDogPiBNYWtlZmlsZSA7CisjICAgICAgICAgICAgICAgZWNobyBcICAkX2N2X2dudV9tYWtlX2NvbW1hbmQgXCRAID4+IE1ha2VmaWxlOworIyAgICAgICBmaQorIworIyAgIFRoZW4sIGlmIGFueSAod2VsbCBhbG1vc3QgYW55KSBvdGhlciBtYWtlIGlzIGNhbGxlZCwgYW5kIEdOVSBtYWtlIGFsc28KKyMgICBleGlzdHMsIHRoZW4gdGhlIG90aGVyIG1ha2Ugd3JhcHMgdGhlIEdOVSBtYWtlLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEpvaG4gRGFycmluZ3RvbiA8ai5kYXJyaW5ndG9uQGVsdmlzLm11cmRvY2guZWR1LmF1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorIworIyBOb3RlOiBNb2RpZmllZCBieSBUZWQgVHMnbyB0byBhZGQgQGlmTm90R05VTWFrZUAKKworQUNfREVGVU4oCisgICAgICAgIFtDSEVDS19HTlVfTUFLRV0sIFsgQUNfQ0FDSEVfQ0hFQ0soIGZvciBHTlUgbWFrZSxfY3ZfZ251X21ha2VfY29tbWFuZCwKKyAgICAgICAgICAgICAgICBfY3ZfZ251X21ha2VfY29tbWFuZD0nJyA7CitkbmwgU2VhcmNoIGFsbCB0aGUgY29tbW9uIG5hbWVzIGZvciBHTlUgbWFrZQorICAgICAgICAgICAgICAgIGZvciBhIGluICIkTUFLRSIgbWFrZSBnbWFrZSBnbnVtYWtlIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRhIiA7IHRoZW4gY29udGludWUgOyBmaSA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAgKCBzaCAtYyAiJGEgLS12ZXJzaW9uIiAyPiAvZGV2L251bGwgfCBncmVwIEdOVSAgMj4mMSA+IC9kZXYvbnVsbCApIDsgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N2X2dudV9tYWtlX2NvbW1hbmQ9JGEgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZSA7CisgICAgICAgICkgOworZG5sIElmIHRoZXJlIHdhcyBhIEdOVSB2ZXJzaW9uLCB0aGVuIHNldCBAaWZHTlVtYWtlQCB0byB0aGUgZW1wdHkgc3RyaW5nLCAnIycgb3RoZXJ3aXNlCisgICAgICAgIGlmIHRlc3QgICJ4JF9jdl9nbnVfbWFrZV9jb21tYW5kIiAhPSAieCIgIDsgdGhlbgorICAgICAgICAgICAgICAgIGlmR05VbWFrZT0nJyA7CisgICAgICAgICAgICAgICAgaWZOb3RHTlVtYWtlPScjJyA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZkdOVW1ha2U9JyMnIDsKKyAgICAgICAgICAgICAgICBpZk5vdEdOVW1ha2U9JycgOworICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoIk5vdCBmb3VuZCIpOworICAgICAgICBmaQorICAgICAgICBBQ19TVUJTVChpZkdOVW1ha2UpCisgICAgICAgIEFDX1NVQlNUKGlmTm90R05VbWFrZSkKK10gKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWcvY29uZmlnLmd1ZXNzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWcvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhODMzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2NvbmZpZy9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNTYxIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA5LTA0LTI3JworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgorIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91CisjIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgYnVpbGQgc3lzdGVtIHR5cGUuCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAorCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkgICAgICAgIG9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpPcGVuQlNEOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvT3BlbkJTRC4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6U29saWRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXNvbGlkYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJICAgICAgICBVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJZXhpdCA7OworICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAorCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPworCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgOzsKKyAgICAqOk9TLzM5MDoqOiopCisJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgorCWV4aXQgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDs7CisgICAgKjpPUzQwMDoqOiopCisgICAgICAgIGVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtOnJpc2NvczoqOip8YXJtOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlTVU5fQVJDSD0iaTM4NiIKKwkjIElmIHRoZXJlIGlzIGEgY29tcGlsZXIsIHNlZSBpZiBpdCBpcyBjb25maWd1cmVkIGZvciA2NC1iaXQgb2JqZWN0cy4KKwkjIE5vdGUgdGhhdCB0aGUgU3VuIGNjIGRvZXMgbm90IHR1cm4gX19MUDY0X18gaW50byAxIGxpa2UgZ2NjIGRvZXMuCisJIyBUaGlzIHRlc3Qgd29ya3MgZm9yIGJvdGggY29tcGlsZXJzLgorCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fYW1kNjQnOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAorCQkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQlncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCVNVTl9BUkNIPSJ4ODZfNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7U1VOX0FSQ0h9LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAorCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKKwljYXNlICJgL2Jpbi9hcmNoYCIgaW4KKwkgICAgc3VuMykKKwkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwkgICAgc3VuNCkKKwkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJZXNhYworCWV4aXQgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCisgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CisgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgorICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKKyAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQorICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90CisgICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCisgICAgIyBiZSBubyBwcm9ibGVtLgorICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgbTY4azptYWNodGVuOio6KikKKwllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQorCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCisJICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgorCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCisJICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCA7OworICAgIG04OGs6Q1gvVVg6Nyo6KikKKwllY2hvIG04OGstaGFycmlzLWN4dXg3CisJZXhpdCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIEFWaWlPTjpkZ3V4Oio6KikKKyAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgCWV4aXQgOzsKKyAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQorCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCisJZXhpdCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQorCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKKwlleGl0IDs7CisgICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKKwllY2hvIG02OGstdGVrdHJvbml4LWJzZAorCWV4aXQgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCA7OworICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKyAgICBpKjg2OkFJWDoqOiopCisJZWNobyBpMzg2LWlibS1haXgKKwlleGl0IDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgOzsKKyAgICAqOkFJWDoyOjMpCisJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKKwkJdGhlbgorCQkJZWNobyAiJFNZU1RFTV9OQU1FIgorCQllbHNlCisJCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwkJZmkKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgOzsKKyAgICAqOkFJWDoqOls0NTZdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKKworICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQorICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICAgICAgICAgICAgICBpbnQgbWFpbiAoKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKKyAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQorICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJCX0gYnJlYWs7CisgICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisgICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgICAgICAgfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCisJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpGcmVlQlNEOio6KikKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgcGM5OCkKKwkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCA7OworICAgICo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgOzsKKyAgICAqOkludGVyaXgqOlszNDU2XSopCisgICAgCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIEVNNjRUIHwgYXV0aGVudGljYW1kIHwgZ2VudWluZWludGVsKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgSUE2NCkKKwkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCWVzYWMgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlpZiBlY2hvIF9fQVJNX0VBQklfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJICAgIHwgZ3JlcCAtcSBfX0FSTV9FQUJJX18KKwl0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQorCWZpCisJZXhpdCA7OworICAgIGF2cjMyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzdjMyOkxpbnV4Oio6KikKKwllY2hvIGNyaXN2MzItYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgZnJ2OkxpbnV4Oio6KikKKyAgICAJZWNobyBmcnYtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG0zMnIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTY4KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG1pcHM6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwcworCSN1bmRlZiBtaXBzZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHMKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKKwkgICAgL15DUFUveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzNjQKKwkjdW5kZWYgbWlwczY0ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzNjRlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwczY0CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eQ1BVL3sKKwkJczogOjpnCisJCXAKKwkgICAgfSdgIgorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9CisJOzsKKyAgICBvcjMyOkxpbnV4Oio6KikKKwllY2hvIG9yMzItdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcHBjNjQ6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgOzsKKyAgICBwYWRyZTpMaW51eDoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OworCWVzYWMKKwlleGl0IDs7CisgICAgcGFyaXNjNjQ6TGludXg6KjoqIHwgaHBwYTY0OkxpbnV4Oio6KikKKwllY2hvIGhwcGE2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNoKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB2YXg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251CisJZXhpdCA7OworICAgIHg4Nl82NDpMaW51eDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeHRlbnNhKjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKKwkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCisJIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KKwlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAorCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAorCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKKwkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KKwkJCQkgICAgcy8gLiovLworCQkJCSAgICBwJ2AKKyAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgorCSAgZWxmMzItaTM4NikKKwkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKKwkJOzsKKwkgIGEub3V0LWkzODYtbGludXgpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKKwkJZXhpdCA7OworCSAgIiIpCisJCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgorCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKKwkJZXhpdCA7OworCWVzYWMKKwkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZmRlZiBfX0VMRl9fCisJIyBpZmRlZiBfX0dMSUJDX18KKwkjICBpZiBfX0dMSUJDX18gPj0gMgorCUxJQkM9Z251CisJIyAgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjICBlbmRpZgorCSMgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjIGVuZGlmCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fUEdJKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eTElCQy97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiB7CisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKKwkJZXhpdAorCX0KKwl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIHsgZWNobyAiJHtURU5UQVRJVkV9IjsgZXhpdDsgfQorCTs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDs7CisgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCisJZXhpdCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDs7CisgICAgaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC4wKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDs7CisgICAgaSo4NjoqOjU6WzY3OF0qKQorICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTU4Ni4KKwkjIE5vdGU6IHdoYXRldmVyIHRoaXMgaXMsIGl0IE1VU1QgYmUgdGhlIHNhbWUgYXMgd2hhdCBjb25maWcuc3ViCisJIyBwcmludHMgZm9yIHRoZSAiZGpncHAiIGhvc3QsIG9yIGVsc2UgR0RCIGNvbmZpZ3VyeSB3aWxsIGRlY2lkZSB0aGF0CisJIyB0aGlzIGlzIGEgY3Jvc3MtYnVpbGQuCisJZWNobyBpNTg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7CisgICAgTkNSKjoqOjQuMjoqIHwgTVBSQVMqOio6NC4yOiopCisJT1NfUkVMPScuMycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkgICAgJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIHB0ZXJvbiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDs7CisgICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCisJZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOio6KjpGVFgqKQorCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgorCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgKjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgOzsKKyAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpIYWlrdToqOiopCSMgSGFpa3UgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1oYWlrdQorCWV4aXQgOzsKKyAgICBTWC00OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC03OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ny1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtODpTVVBFUi1VWDoqOiopCisJZWNobyBzeDgtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLThSOlNVUEVSLVVYOio6KikKKwllY2hvIHN4OHItbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlJoYXBzb2R5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RGFyd2luOio6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgorCWNhc2UgJFVOQU1FX1BST0NFU1NPUiBpbgorCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6Tm9uU3RvcC1VWDoqOiopCisJZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKKwlleGl0IDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UGxhbjk6KjoqKQorCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgorCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2CisJIyBvcGVyYXRpbmcgc3lzdGVtcy4KKwlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgorCSAgICBVTkFNRV9NQUNISU5FPWkzODYKKwllbHNlCisJICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKKwlleGl0IDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgOzsKKyAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAorCWV4aXQgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDs7CisgICAgKjpJVFM6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKKwlleGl0IDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKyAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworICAgIGkqODY6QVJPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKKwlleGl0IDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgaWYgKHZlcnNpb24gPCA0KQorICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGVsc2UKKyAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyMgaWYgIWRlZmluZWQgKHVsdHJpeCkKKyMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgaWYgZGVmaW5lZCAoQlNEKQorIyAgIGlmIEJTRCA9PSA0MworICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKKyMgICBlbHNlCisjICAgIGlmIEJTRCA9PSAxOTkwMDYKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOworIyAgICBlbHNlCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiskQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKK2FuZAorICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgorCitleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWcvY29uZmlnLnJwYXRoIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWcvY29uZmlnLnJwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlYWQ3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2NvbmZpZy9jb25maWcucnBhdGgKQEAgLTAsMCArMSw1MTMgQEAKKyMhIC9iaW4vc2gKKyMgT3V0cHV0IGEgc3lzdGVtIGRlcGVuZGVudCBzZXQgb2YgdmFyaWFibGVzLCBkZXNjcmliaW5nIGhvdyB0byBzZXQgdGhlCisjIHJ1biB0aW1lIHNlYXJjaCBwYXRoIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW4gYW4gZXhlY3V0YWJsZS4KKyMKKyMgICBDb3B5cmlnaHQgMTk5Ni0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFRha2VuIGZyb20gR05VIGxpYnRvb2wsIDIwMDEKKyMgICBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjICAgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjICAgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgICB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIFRoZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gdGhpcyBmaWxlIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzcGVjaWZpY2F0aW9uLAorIyAgICBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvcgorIyAgICBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBDQywgR0NDLCBMREZMQUdTLCBMRCwgd2l0aF9nbnVfbGQKKyMgc2hvdWxkIGJlIHNldCBieSB0aGUgY2FsbGVyLgorIworIyBUaGUgc2V0IG9mIGRlZmluZWQgdmFyaWFibGVzIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBzY3JpcHQuCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNJFZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKK3NobGliZXh0PQorCitob3N0PSIkMSIKK2hvc3RfY3B1PWBlY2hvICIkaG9zdCIgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gIiRob3N0IiB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICIkaG9zdCIgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCit3bD0KK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHdsPSctV2wsJworZWxzZQorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgaXJpeDUqIHwgaXJpeDYqKQorICAgICAgd2w9Jy1XbCwnCisgICAgICA7OworICAgIGxpbnV4KikKKyAgICAgIGVjaG8gJ19fSU5URUxfQ09NUElMRVInID4gY29uZnRlc3QuJGFjX2V4dAorICAgICAgaWYgJENDIC1FIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCB8IGdyZXAgX19JTlRFTF9DT01QSUxFUiA+L2Rldi9udWxsCisgICAgICB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgIyBJbnRlbCBpY2MKKyAgICAgICAgd2w9Jy1Rb3B0aW9uLGxkLCcKKyAgICAgIGZpCisgICAgICA7OworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBzb2xhcmlzKikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBzdW5vczQqKQorICAgICAgd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIDs7CisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c25pOyB0aGVuCisgICAgICAgIHdsPSctTEQnCisgICAgICBlbHNlCisgICAgICAgIHdsPSctV2wsJworICAgICAgZmkKKyAgICAgIDs7CisgIGVzYWMKK2ZpCisKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQoraGFyZGNvZGVfZGlyZWN0PW5vCitoYXJkY29kZV9taW51c19MPW5vCisKK2Nhc2UgIiRob3N0X29zIiBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7Citlc2FjCisKK2xkX3NobGlicz15ZXMKK2lmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQorICAgICAgIyBPbiBBSVgsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgYW1pZ2FvcyopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4gdXNlCisgICAgICAjIHRoZW0uCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgOzsKKyAgICBzb2xhcmlzKiB8IHN5c3Y1KikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgZWdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICA6CisgICAgICBlbHNlCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgc3Vub3M0KikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgOgorICAgICAgZWxzZQorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICBlc2FjCisgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICBmaQorZWxzZQorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBhaXgzKikKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisgICAgICAgICMgYnJva2VuIGNvbGxlY3QyLgorICAgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBlbHNlCisgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKKyAgICAgICAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgICAgICAgICAgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgICAgICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorICAgICAgICAgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKyAgICAgICAgICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisgICAgICAgICAgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisgICAgICAgICAgdGhlbgorICAgICAgICAgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKyAgICAgICAgICBmaQorICAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6L3Vzci9saWI6L2xpYicKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKyAgICAgICAgZWxzZQorICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJub2xpYnBhdGggJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjovdXNyL2xpYjovbGliJworICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIDs7CisgICAgYW1pZ2FvcyopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisgICAgICBsaWJleHQ9bGliCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICA7OworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIDs7CisgICAgZnJlZWJzZDIqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIDs7CisgICAgZnJlZWJzZCopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICA7OworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwgYnV0IGFzIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgOzsKKyAgICBpcml4NSogfCBpcml4NiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisgICAgbmV0YnNkKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIDs7CisgICAgbmV3c29zNikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKyAgICBvcGVuYnNkKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZWxzZQorICAgICAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgICAgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworICAgIG9zMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgOzsKKyAgICBvc2YzKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKyAgICBvc2Y0KiB8IG9zZjUqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorICAgICAgICAjIEJvdGggY2MgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisgICAgc2NvMy4ydjUqKQorICAgICAgOzsKKyAgICBzb2xhcmlzKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIDs7CisgICAgc3Vub3M0KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICA7OworICAgIHN5c3Y0KQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c25vOyB0aGVuCisgICAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisgICAgICBlbHNlCisgICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubyAjIE1vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorICAgICAgZmkKKyAgICAgIDs7CisgICAgc3lzdjQuMyopCisgICAgICA7OworICAgIHN5c3Y1KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgICAgICA7OworICAgIHV0czQqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgOzsKKyAgICBkZ3V4KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorICAgICAgICBsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKyAgICBzeXN2NC4ydXcyKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgICAgIDs7CisgICAgc3lzdjV1dzcqIHwgdW5peHdhcmU3KikKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgZXNhYworZmkKKworIyBDaGVjayBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MKK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2Nhc2UgIiRob3N0X29zIiBpbgorICBhaXgzKikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIGFpeDQqIHwgYWl4NSopCisgICAgc2hsaWJleHQ9c28KKyAgICA7OworICBhbWlnYW9zKikKKyAgICBzaGxpYmV4dD1peGxpYnJhcnkKKyAgICA7OworICBiZW9zKikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIGJzZGk0KikKKyAgICBzaGxpYmV4dD1zbworICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgICAgICB5ZXMsY3lnd2luKikKKyAgICAgICAgc2hsaWJleHQ9ZGxsLmEKKyAgICAgICAgOzsKKyAgICAgIHllcyxtaW5ndyopCisgICAgICAgIHNobGliZXh0PWRsbAorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMvOy8gL2ciYAorICAgICAgICA7OworICAgICAgeWVzLHB3MzIqKQorICAgICAgICBzaGxpYmV4dD1kbGwKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIHNobGliZXh0PWRsbAorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgIHNobGliZXh0PWR5bGliCisgICAgOzsKKyAgZnJlZWJzZDEqKQorICAgIDs7CisgIGZyZWVic2QqKQorICAgIHNobGliZXh0PXNvCisgICAgOzsKKyAgZ251KikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgIHNobGliZXh0PXNsCisgICAgOzsKKyAgaXJpeDUqIHwgaXJpeDYqKQorICAgIHNobGliZXh0PXNvCisgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICBpcml4NSopCisgICAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGNhc2UgJExEIGluCisgICAgICAgICAgKi0zMnwqIi0zMiAiKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IDs7CisgICAgICAgICAgKi1uMzJ8KiItbjMyICIpIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiA7OworICAgICAgICAgICotNjR8KiItNjQgIikgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgOzsKKyAgICAgICAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgICAgOzsKKyAgbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKKyAgICA7OworICBsaW51eC1nbnUqKQorICAgIHNobGliZXh0PXNvCisgICAgOzsKKyAgbmV0YnNkKikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIG5ld3NvczYpCisgICAgc2hsaWJleHQ9c28KKyAgICA7OworICBvcGVuYnNkKikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIG9zMiopCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzaGxpYmV4dD1kbGwKKyAgICA7OworICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgc2hsaWJleHQ9c28KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIHNobGliZXh0PXNvCisgICAgOzsKKyAgc3Vub3M0KikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgICBzaGxpYmV4dD1zbworICAgIGNhc2UgIiRob3N0X3ZlbmRvciIgaW4KKyAgICAgIG1vdG9yb2xhKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICB1dHM0KikKKyAgICBzaGxpYmV4dD1zbworICAgIDs7CisgIGRndXgqKQorICAgIHNobGliZXh0PXNvCisgICAgOzsKKyAgc3lzdjQqTVAqKQorICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKyAgICAgIHNobGliZXh0PXNvCisgICAgZmkKKyAgICA7OworZXNhYworCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbImAkXFxdXCkvXFxcMS9nJworZXNjYXBlZF93bD1gZWNobyAiWCR3bCIgfCBzZWQgLWUgJ3MvXlgvLycgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorZXNjYXBlZF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPWBlY2hvICJYJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHwgc2VkIC1lICdzL15YLy8nIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKK2VzY2FwZWRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICJYJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3MvXlgvLycgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorZXNjYXBlZF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiWCRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3MvXlgvLycgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCitzZWQgLWUgJ3MvXlwoW2EtekEtWjAtOV9dKlwpPS9hY2xfY3ZfXDE9LycgPDxFT0YKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9IiRlc2NhcGVkX3dsIgorCisjIFN0YXRpYyBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICJzbyIpLgorc2hsaWJleHQ9IiRzaGxpYmV4dCIKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSIkZXNjYXBlZF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0iJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9IiRoYXJkY29kZV9kaXJlY3QiCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSIkaGFyZGNvZGVfbWludXNfTCIKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGVzY2FwZWRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJGVzY2FwZWRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCisKK0VPRgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWcvY29uZmlnLnN1YiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlnL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTM5NDM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlnL2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNjg2IEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOAorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMDktMDQtMTcnCisKKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KKyMKKyMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCisjIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KKyMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCisjIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKzIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKKyAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworIAktY2hvcnVzcmRiKQorIAkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisgCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCTE3NTBhIHwgNTgwIFwKKwl8IGEyOWsgXAorCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKKwl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAorCXwgYW0zM18yLjAgXAorCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmaWRvIHwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCisJfCBpcDJrIHwgaXEyMDAwIFwKKwl8IGxtMzIgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbW94aWUgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5pb3MgfCBuaW9zMiBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKKwl8IHB5cmFtaWQgXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSB8IHN0cm9uZ2FybSBcCisJfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAorCXwgdjg1MCB8IHY4NTBlIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhjMTZ4IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKwltczEpCisJCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgorCQk7OworCisJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKKwkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKKwkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCisJaSo4NiB8IHg4Nl82NCkKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJNTgwLSogXAorCXwgYTI5ay0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKKwl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCisJfCBhdnItKiB8IGF2cjMyLSogXAorCXwgYmZpbi0qIHwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAorCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmaWRvLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCisJfCBoODMwMC0qIHwgaDg1MDAtKiBcCisJfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IGxtMzItKiBcCisJfCBtMzJjLSogfCBtMzJyLSogfCBtMzJybGUtKiBcCisJfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAorCXwgbTg4MTEwLSogfCBtODhrLSogfCBtYXhxLSogfCBtY29yZS0qIHwgbWV0YWctKiBcCisJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCisJfCBtaXBzMTYtKiBcCisJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAorCXwgbWlwczY0b2N0ZW9uLSogfCBtaXBzNjRvY3Rlb25lbC0qIFwKKwl8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAorCXwgbWlwczY0cjU5MDAtKiB8IG1pcHM2NHI1OTAwZWwtKiBcCisJfCBtaXBzNjR2ci0qIHwgbWlwczY0dnJlbC0qIFwKKwl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCisJfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAorCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAorCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCisJfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAorCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCisJfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwl8IG1taXgtKiBcCisJfCBtdC0qIFwKKwl8IG1zcDQzMC0qIFwKKwl8IG5pb3MtKiB8IG5pb3MyLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCisJfCBvcmlvbi0qIFwKKwl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAorCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKKwl8IHB5cmFtaWQtKiBcCisJfCByb21wLSogfCByczYwMDAtKiBcCisJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzI0XWFlYi0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKKwl8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKKwl8IHRhaG9lLSogfCB0aHVtYi0qIFwKKwl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIHwgdGlsZS0qIFwKKwl8IHRyb24tKiBcCisJfCB2ODUwLSogfCB2ODUwZS0qIHwgdmF4LSogXAorCXwgd2UzMmstKiBcCisJfCB4ODYtKiB8IHg4Nl82NC0qIHwgeGMxNngtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogfCB4c2NhbGVlW2JsXS0qIFwKKwl8IHhzdG9ybXkxNi0qIHwgeHRlbnNhKi0qIFwKKwl8IHltcC0qIFwKKwl8IHo4ay0qIHwgejgwLSopCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZSwgd2l0aCBnbG9iIG1hdGNoLgorCXh0ZW5zYSopCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTM4NmJzZCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LWJzZAorCQk7OworCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYTI5a2hpZikKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisgICAgCWFiYWN1cykKKwkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWFwb2xsbzY4YnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhcm9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWFyb3MKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWJsYWNrZmluKQorCQliYXNpY19tYWNoaW5lPWJmaW4tdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlibGFja2Zpbi0qKQorCQliYXNpY19tYWNoaW5lPWJmaW4tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKyAgICAgICAgY2VnY2MpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LWNlZ2NjCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTYpCisJCWJhc2ljX21hY2hpbmU9Y3IxNi11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRpY29zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LWRpY29zCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmd3MzJjZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tbWluZ3czMmNlCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGlsZSopCisJCWJhc2ljX21hY2hpbmU9dGlsZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCisJICAgICAgfCAta29wZW5zb2xhcmlzKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiB8IC1hcm9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCisJICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIHwgLWNlZ2NjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtbGludXgtbmV3bGliKiB8IC1saW51eC11Y2xpYmMqIFwKKwkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKKwkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50by1xbngqKQorCQk7OworCS1udG8qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKKwkJOzsKKwktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiB8IC1oYWlrdSogXAorCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCisJCTs7CisJLW1hYyopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKKwkJOzsKKwktbGludXgtZGlldGxpYmMpCisJCW9zPS1saW51eC1kaWV0bGliYworCQk7OworCS1saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworICAgICAgICAtb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisgICAgICAgIC10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLWRpY29zKikKKwkJb3M9LWRpY29zCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKyAgICAgICAgc2NvcmUtKikKKwkJb3M9LWVsZgorCQk7OworICAgICAgICBzcHUtKikKKwkJb3M9LWVsZgorCQk7OworCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIGM0eC0qIHwgdGljNHgtKikKKyAgICAgICAgCW9zPS1jb2ZmCisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgorCXBkcDEwLSopCisJCW9zPS10b3BzMjAKKwkJOzsKKwlwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKyAgICAJKi1rbnV0aCkKKwkJb3M9LW1taXh3YXJlCisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCSotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworCSotc2dpKQorCQlvcz0taXJpeAorCQk7OworCSotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqLXJvbTY4aykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLSpidWcpCisJCW9zPS1jb2ZmCisJCTs7CisJKi1hcHBsZSkKKwkJb3M9LW1hY29zCisJCTs7CisJKi1hdGFyaSopCisJCW9zPS1taW50CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqIHwgLW9wZW5lZCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktb3M0MDAqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXRwZiopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS1obXMqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS1tcHcqIHwgLW1hY29zKikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJCQl2ZW5kb3I9YXRhcmkKKwkJCQk7OworCQkJLXZvcyopCisJCQkJdmVuZG9yPXN0cmF0dXMKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKK2V4aXQKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWcvaW5zdGFsbC1zaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlnL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODlmYzliMAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlnL2luc3RhbGwtc2gKQEAgLTAsMCArMSwyMzggQEAKKyMhIC9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guCisjCisKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKwordHJhbmZvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlnL21raW5zdGFsbGRpcnMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2NvbmZpZy9ta2luc3RhbGxkaXJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmNTg1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2NvbmZpZy9ta2luc3RhbGxkaXJzCkBAIC0wLDAgKzEsNDAgQEAKKyMhIC9iaW4vc2gKKyMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5CisjIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgorIyBDcmVhdGVkOiAxOTkzLTA1LTE2CisjIFB1YmxpYyBkb21haW4KKworIyAkSWQ6IG1raW5zdGFsbGRpcnMsdiAxLjEzIDE5OTkvMDEvMDUgMDM6MTg6NTUgYmplIEV4cCAkCisKK2VycnN0YXR1cz0wCisKK2ZvciBmaWxlCitkbworICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKKyAgIHNoaWZ0CisKKyAgIHBhdGhjb21wPQorICAgZm9yIGQKKyAgIGRvCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKKyAgICAgY2FzZSAiJHBhdGhjb21wIiBpbgorICAgICAgIC0qICkgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKyAgICAgZXNhYworCisgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiCisKKyAgICAgICAgbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisgICAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAJICBlcnJzdGF0dXM9JGxhc3RlcnIKKyAgICAgICAgZmkKKyAgICAgZmkKKworICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKKyAgIGRvbmUKK2RvbmUKKworZXhpdCAkZXJyc3RhdHVzCisKKyMgbWtpbnN0YWxsZGlycyBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlnL3BhcnNlLXR5cGVzLnNoIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWcvcGFyc2UtdHlwZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDdjYjljYwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlnL3BhcnNlLXR5cGVzLnNoCkBAIC0wLDAgKzEsMTE4IEBACisjIS9iaW4vc2gKKworY2F0ID4gc2VkLnNjcmlwdCA8PCAiRU9GIgorL14jL2QKKy9eJC9kCitzL19fZXh0ZW5zaW9uX18gLy8KK3MvdHlwZWRlZiBcKC4qXCkgX191XChbMS05XSpcKTsvI2RlZmluZSBfX1VcMl9UWVBFREVGIFwxLworcy90eXBlZGVmIFwoLipcKSBfX3NcKFsxLTldKlwpOy8jZGVmaW5lIF9fU1wyX1RZUEVERUYgXDEvCitFT0YKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIENDPWdjYworZmkKKworaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgICBDUFA9IiRDQyAtRSIKK2ZpCisKK2VjaG8gJyNpbmNsdWRlIDxhc20vdHlwZXMuaD4nIHwgJENQUCAtIHwgXAorICAgIHNlZCAtZiBzZWQuc2NyaXB0IHwgZ3JlcCAnXiMnID4gYXNtX3R5cGVzLmgKKworcm0gc2VkLnNjcmlwdAorCitjcCBhc21fdHlwZXMuaCBhc21fdHlwZXMuYworCitjYXQgPj4gYXNtX3R5cGVzLmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgX19VOF9UWVBFREVGCisJaWYgKHNpemVvZihfX1U4X1RZUEVERUYpICE9IDEpIHsKKwkJcHJpbnRmKCJTaXplb2YoX19VOF9fVFlQRURFRikgaXMgJWQgc2hvdWxkIGJlIDFcbiIsIAorCQkgICAgICAgc2l6ZW9mKF9fVThfVFlQRURFRikpOworCQlleGl0KDEpOworCX0KKyNlbHNlCisjd2FybmluZyBfX1U4X1RZUEVERUYgbm90IGRlZmluZWQKKyNlbmRpZgorI2lmZGVmIF9fUzhfVFlQRURFRgorCWlmIChzaXplb2YoX19TOF9UWVBFREVGKSAhPSAxKSB7CisJCXByaW50ZigiU2l6ZW9mKF9TOF9fVFlQRURFRikgaXMgJWQgc2hvdWxkIGJlIDFcbiIsIAorCQkgICAgICAgc2l6ZW9mKF9fUzhfVFlQRURFRikpOworCQlleGl0KDEpOworCX0KKyNlbHNlCisjd2FybmluZyBfX1M4X1RZUEVERUYgbm90IGRlZmluZWQKKyNlbmRpZgorI2lmZGVmIF9fVTE2X1RZUEVERUYKKwlpZiAoc2l6ZW9mKF9fVTE2X1RZUEVERUYpICE9IDIpIHsKKwkJcHJpbnRmKCJTaXplb2YoX19VMTZfX1RZUEVERUYpIGlzICVkIHNob3VsZCBiZSAyXG4iLCAKKwkJICAgICAgIHNpemVvZihfX1UxNl9UWVBFREVGKSk7CisJCWV4aXQoMSk7CisJfQorI2Vsc2UKKyN3YXJuaW5nIF9fVTE2X1RZUEVERUYgbm90IGRlZmluZWQKKyNlbmRpZgorI2lmZGVmIF9fUzE2X1RZUEVERUYKKwlpZiAoc2l6ZW9mKF9fUzE2X1RZUEVERUYpICE9IDIpIHsKKwkJcHJpbnRmKCJTaXplb2YoX19TMTZfX1RZUEVERUYpIGlzICVkIHNob3VsZCBiZSAyXG4iLCAKKwkJICAgICAgIHNpemVvZihfX1MxNl9UWVBFREVGKSk7CisJCWV4aXQoMSk7CisJfQorI2Vsc2UKKyN3YXJuaW5nIF9fUzE2X1RZUEVERUYgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgX19VMzJfVFlQRURFRgorCWlmIChzaXplb2YoX19VMzJfVFlQRURFRikgIT0gNCkgeworCQlwcmludGYoIlNpemVvZihfX1UzMl9fVFlQRURFRikgaXMgJWQgc2hvdWxkIGJlIDRcbiIsIAorCQkgICAgICAgc2l6ZW9mKF9fVTMyX1RZUEVERUYpKTsKKwkJZXhpdCgxKTsKKwl9CisjZWxzZQorI3dhcm5pbmcgX19VMzJfVFlQRURFRiBub3QgZGVmaW5lZAorI2VuZGlmCisjaWZkZWYgX19TMzJfVFlQRURFRgorCWlmIChzaXplb2YoX19TMzJfVFlQRURFRikgIT0gNCkgeworCQlwcmludGYoIlNpemVvZihfX1MzMl9fVFlQRURFRikgaXMgJWQgc2hvdWxkIGJlIDRcbiIsIAorCQkgICAgICAgc2l6ZW9mKF9fUzMyX1RZUEVERUYpKTsKKwkJZXhpdCgxKTsKKwl9CisjZWxzZQorI3dhcm5pbmcgX19TMzJfVFlQRURFRiBub3QgZGVmaW5lZAorI2VuZGlmCisKKyNpZmRlZiBfX1U2NF9UWVBFREVGCisJaWYgKHNpemVvZihfX1U2NF9UWVBFREVGKSAhPSA4KSB7CisJCXByaW50ZigiU2l6ZW9mKF9fVTY0X19UWVBFREVGKSBpcyAlZCBzaG91bGQgYmUgOFxuIiwgCisJCSAgICAgICBzaXplb2YoX19VNjRfVFlQRURFRikpOworCQlleGl0KDEpOworCX0KKyNlbHNlCisjd2FybmluZyBfX1U2NF9UWVBFREVGIG5vdCBkZWZpbmVkCisjZW5kaWYKKyNpZmRlZiBfX1M2NF9UWVBFREVGCisJaWYgKHNpemVvZihfX1M2NF9UWVBFREVGKSAhPSA4KSB7CisJCXByaW50ZigiU2l6ZW9mKF9fUzY0X19UWVBFREVGKSBpcyAlZCBzaG91bGQgYmUgOFxuIiwgCisJCSAgICAgICBzaXplb2YoX19TNjRfVFlQRURFRikpOworCQlleGl0KDEpOworCX0KKyNlbHNlCisjd2FybmluZyBfX1M2NF9UWVBFREVGIG5vdCBkZWZpbmVkCisjZW5kaWYKKwlleGl0KDApOworfQorRU9GCisKKyR7QlVJTERfQ0MtJHtDQy1nY2N9fSAtbyBhc21fdHlwZXMgYXNtX3R5cGVzLmMKK2lmIC4vYXNtX3R5cGVzCit0aGVuCisgICAgdHJ1ZQorZWxzZQorICAgIGVjaG8gIlByb2JsZW0gZGV0ZWN0ZWQgd2l0aCBhc21fdHlwZXMuaCIKKyAgICBlY2hvICIiID4gYXNtX3R5cGVzLmgKK2ZpCitybSBhc21fdHlwZXMuYyBhc21fdHlwZXMKKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWd1cmUgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNTYzYThkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWd1cmUKQEAgLTAsMCArMSwxMjM2NSBAQAorIyEgL2Jpbi9zaAorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjQuCisjCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisiCisgIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Cithc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KK2FzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQorCitleGl0Y29kZT0wCithc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9CitpZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6CisKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorCitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2ZvdW5kPWZhbHNlCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGFzX2ZvdW5kPToKKyAgY2FzZSAkYXNfZGlyIGluICMoCisJIC8qKQorCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KKwkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCisJCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGJyZWFrIDIKK2ZpCitmaQorCSAgIGRvbmU7OworICAgICAgIGVzYWMKKyAgYXNfZm91bmQ9ZmFsc2UKK2RvbmUKKyRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcworZmk7IH0KK0lGUz0kYXNfc2F2ZV9JRlMKKworCisgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6CisgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisJIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKwkjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorCUJBU0hfRU5WPS9kZXYvbnVsbAorCUVOVj0vZGV2L251bGwKKwkodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQorZmkKKworICAgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geG5vOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiQwOiBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIgorICAkYXNfZWNobyAiJDA6IHRoZSBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiIKKyAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KKyAgICAkYXNfZWNobyAiJDA6IEluIHBhcnRpY3VsYXIsIHpzaCAkWlNIX1ZFUlNJT04gaGFzIGJ1Z3MgYW5kIHNob3VsZCIKKyAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCisgIGVsc2UKKyAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAorJDA6IGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCiskMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KKyQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgorICBmaQorICBleGl0IDEKK2ZpCitmaQorZmkKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitleHBvcnQgU0hFTEwKKyMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgorQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KK3Vuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKKyMgYXNfZm5fZXJyb3IgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBzdGF0dXMgJD8sIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kPzsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQzIjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDIifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDEiID4mJDMKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQxIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKworICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KKyAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKKyAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisgIC4gIi4vJGFzX21lLmxpbmVubyIKKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wJworICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9bG4KKyAgZWxzZQorICAgIGFzX2xuX3M9J2NwIC1wJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKKworIyBOYW1lIG9mIHRoZSBob3N0LgorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0KK1BBQ0tBR0VfVEFSTkFNRT0KK1BBQ0tBR0VfVkVSU0lPTj0KK1BBQ0tBR0VfU1RSSU5HPQorUEFDS0FHRV9CVUdSRVBPUlQ9CitQQUNLQUdFX1VSTD0KKworYWNfdW5pcXVlX2ZpbGU9InZlcnNpb24uaCIKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpTCitMSUJPQkpTCitCVUlMRF9MREZMQUdTCitCVUlMRF9DRkxBR1MKK0lOVExfRkxBR1MKK0RPX1RFU1RfU1VJVEUKK0VUX0RJUgorU1NfRElSCitMREZMQUdfU1RBVElDCityb290X3N5c2NvbmZkaXIKK3Jvb3RfbGliZGlyCityb290X3NiaW5kaXIKK3Jvb3RfYmluZGlyCityb290X3ByZWZpeAorVU5JWF9DTVQKK0NZR1dJTl9DTVQKK0xJTlVYX0NNVAorVU5JX0RJRkZfT1BUUworU0VNX0lOSVRfTElCCitTT0NLRVRfTElCCitTSVpFT0ZfTE9OR19MT05HCitTSVpFT0ZfTE9ORworU0laRU9GX0lOVAorU0laRU9GX1NIT1JUCitCVUlMRF9DQworTUFLRUlORk8KK1NUUklQCitBUgorTERDT05GSUcKK1BFUkwKK1NFRAorQVdLCitDSE1PRAorUk0KK0NQCitNVgorTE5fUworTE4KK2lmTm90R05VbWFrZQoraWZHTlVtYWtlCitCSU5BUllfVFlQRQorUE9TVUIKK0xUTElCSU5UTAorTElCSU5UTAorSU5UTExJQlMKK0lOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYCitJTlRMT0JKUworR0VOQ0FUCitJTlNUT0JKRVhUCitEQVRBRElSTkFNRQorQ0FUT0JKRVhUCitVU0VfSU5DTFVERURfTElCSU5UTAorQlVJTERfSU5DTFVERURfTElCSU5UTAorSU5UTEJJU09OCitMVExJQklDT05WCitMSUJJQ09OVgorSEFWRV9XUFJJTlRGCitIQVZFX1NOUFJJTlRGCitIQVZFX0FTUFJJTlRGCitIQVZFX1BPU0lYX1BSSU5URgorR0xJQkMyMQorQUxMT0NBCitSQU5MSUIKK01TR01FUkdFCitYR0VUVEVYVAorR01TR0ZNVAorTVNHRk1UCitVU0VfTkxTCitNS0lOU1RBTExESVJTCitJTlNUQUxMX0RBVEEKK0lOU1RBTExfU0NSSVBUCitJTlNUQUxMX1BST0dSQU0KK1NFVF9NQUtFCitWRVJTSU9OCitQQUNLQUdFCitHRVRURVhUX1BBQ0tBR0UKK1VVSUREX0NNVAorRTJJTklUUkRfTUFOCitFMklOSVRSRF9QUk9HCitGU0NLX01BTgorRlNDS19QUk9HCitSRVNJWkVSX0NNVAorSU1BR0VSX0NNVAorREVCVUdGU19DTVQKK0JMS0lEX0NNVAorREVQUFJPRklMRURfTElCQkxLSUQKK1BST0ZJTEVEX0xJQkJMS0lECitERVBTVEFUSUNfTElCQkxLSUQKK1NUQVRJQ19MSUJCTEtJRAorREVQTElCQkxLSUQKK0xJQkJMS0lECitVVUlEX0NNVAorREVQUFJPRklMRURfTElCVVVJRAorUFJPRklMRURfTElCVVVJRAorREVQU1RBVElDX0xJQlVVSUQKK1NUQVRJQ19MSUJVVUlECitERVBMSUJVVUlECitMSUJVVUlECitQS0dfQ09ORklHCitURVNUX0lPX0NNVAorUFJJVkFURV9MSUJTX0NNVAorTERGTEFHX0RZTkFNSUMKK1BST0ZJTEVEX0xJQl9FWFQKK1NUQVRJQ19MSUJfRVhUCitMSUJfRVhUCitDSEVDS0VSX0NNVAorUFJPRklMRV9DTVQKK0JTRExJQl9DTVQKK0VMRl9DTVQKK0hUUkVFX0NNVAorUQorRQorTElOS19CVUlMRF9GTEFHUworTElOS19JTlNUQUxMX0ZMQUdTCitNQUlOVEFJTkVSX0NNVAorTElOVVhfSU5DTFVERQorRUdSRVAKK0dSRVAKK0NQUAorRExPUEVOX0xJQgorT0JKRVhUCitFWEVFWFQKK2FjX2N0X0NDCitDUFBGTEFHUworTERGTEFHUworQ0ZMQUdTCitDQworaG9zdF9vcworaG9zdF92ZW5kb3IKK2hvc3RfY3B1Citob3N0CitidWlsZF9vcworYnVpbGRfdmVuZG9yCitidWlsZF9jcHUKK2J1aWxkCitFMkZTUFJPR1NfUEtHVkVSCitFMkZTUFJPR1NfVkVSU0lPTgorRTJGU1BST0dTX0RBWQorRTJGU1BST0dTX01PTlRICitFMkZTUFJPR1NfWUVBUgordGFyZ2V0X2FsaWFzCitob3N0X2FsaWFzCitidWlsZF9hbGlhcworTElCUworRUNIT19UCitFQ0hPX04KK0VDSE9fQworREVGUworbWFuZGlyCitsb2NhbGVkaXIKK2xpYmRpcgorcHNkaXIKK3BkZmRpcgorZHZpZGlyCitodG1sZGlyCitpbmZvZGlyCitkb2NkaXIKK29sZGluY2x1ZGVkaXIKK2luY2x1ZGVkaXIKK2xvY2Fsc3RhdGVkaXIKK3NoYXJlZHN0YXRlZGlyCitzeXNjb25mZGlyCitkYXRhZGlyCitkYXRhcm9vdGRpcgorbGliZXhlY2Rpcgorc2JpbmRpcgorYmluZGlyCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCitwcmVmaXgKK2V4ZWNfcHJlZml4CitQQUNLQUdFX1VSTAorUEFDS0FHRV9CVUdSRVBPUlQKK1BBQ0tBR0VfU1RSSU5HCitQQUNLQUdFX1ZFUlNJT04KK1BBQ0tBR0VfVEFSTkFNRQorUEFDS0FHRV9OQU1FCitQQVRIX1NFUEFSQVRPUgorU0hFTEwnCithY19zdWJzdF9maWxlcz0nTUNPTkZJRworTUFLRUZJTEVfRUxGCitNQUtFRklMRV9CU0RMSUIKK01BS0VGSUxFX1BST0ZJTEUKK01BS0VGSUxFX0NIRUNLRVIKK01BS0VGSUxFX0xJQlJBUlkKK0FTTV9UWVBFU19IRUFERVIKK1BVQkxJQ19DT05GSUdfSEVBREVSJworYWNfdXNlcl9vcHRzPScKK2VuYWJsZV9vcHRpb25fY2hlY2tpbmcKK3dpdGhfZGlldF9saWJjCit3aXRoX2NjCit3aXRoX2Njb3B0cword2l0aF9sZG9wdHMKK3dpdGhfcm9vdF9wcmVmaXgKK2VuYWJsZV9tYWludGFpbmVyX21vZGUKK2VuYWJsZV9zeW1saW5rX2luc3RhbGwKK2VuYWJsZV9zeW1saW5rX2J1aWxkCitlbmFibGVfdmVyYm9zZV9tYWtlY21kcworZW5hYmxlX2NvbXByZXNzaW9uCitlbmFibGVfaHRyZWUKK2VuYWJsZV9lbGZfc2hsaWJzCitlbmFibGVfYnNkX3NobGlicworZW5hYmxlX3Byb2ZpbGUKK2VuYWJsZV9jaGVja2VyCitlbmFibGVfamJkX2RlYnVnCitlbmFibGVfYmxraWRfZGVidWcKK2VuYWJsZV90ZXN0aW9fZGVidWcKK2VuYWJsZV9saWJ1dWlkCitlbmFibGVfbGliYmxraWQKK2VuYWJsZV9kZWJ1Z2ZzCitlbmFibGVfaW1hZ2VyCitlbmFibGVfcmVzaXplcgorZW5hYmxlX2ZzY2sKK2VuYWJsZV9lMmluaXRyZF9oZWxwZXIKK2VuYWJsZV90bHMKK2VuYWJsZV91dWlkZAorZW5hYmxlX25scword2l0aF9nbnVfbGQKK2VuYWJsZV9ycGF0aAord2l0aF9saWJpY29udl9wcmVmaXgKK3dpdGhfaW5jbHVkZWRfZ2V0dGV4dAord2l0aF9saWJpbnRsX3ByZWZpeAorJworICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworQ0MKK0NGTEFHUworTERGTEFHUworTElCUworQ1BQRkxBR1MKK0NQUAorUEtHX0NPTkZJRycKKworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKK2FjX3VucmVjb2duaXplZF9vcHRzPQorYWNfdW5yZWNvZ25pemVkX3NlcD0KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCisjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKK2RhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFfScKK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCitodG1sZGlyPScke2RvY2Rpcn0nCitkdmlkaXI9JyR7ZG9jZGlyfScKK3BkZmRpcj0nJHtkb2NkaXJ9JworcHNkaXI9JyR7ZG9jZGlyfScKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCittYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKworYWNfcHJldj0KK2FjX2Rhc2hkYXNoPQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKKyAgKikJYWNfb3B0YXJnPXllcyA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisgIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQorICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQorICAgIGFjX3ByZXY9ZG9jZGlyIDs7CisgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKyAgICBhY19wcmV2PWR2aWRpciA7OworICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKyAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCisgIHwgLS1odD0qKQorICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCisgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKyAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCisgICAgYWNfcHJldj1wZGZkaXIgOzsKKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKyAgICBwZGZkaXI9JGFjX29wdGFyZyA7OworCisgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisgICAgYWNfcHJldj1wc2RpciA7OworICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSBhc19mbl9lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKKyAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKKyAgICAgIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7CisgICAgZXNhYworICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZworICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7CisKKyAgKikKKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICBhc19mbl9lcnJvciAibWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIgorZmkKKworaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgorICBjYXNlICRlbmFibGVfb3B0aW9uX2NoZWNraW5nIGluCisgICAgbm8pIDs7CisgICAgZmF0YWwpIGFzX2ZuX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA7OworICAgICopICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjIgOzsKKyAgZXNhYworZmkKKworIyBDaGVjayBhbGwgZGlyZWN0b3J5IGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kuCitmb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKKwkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCisJCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKKwkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKK2RvCisgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAjIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICAqLyApCisgICAgICBhY192YWw9YGV4cHIgIlgkYWNfdmFsIiA6ICdYXCguKlteL11cKScgXHwgIlgkYWNfdmFsIiA6ICdYXCguKlwpJ2AKKyAgICAgIGV2YWwgJGFjX3Zhcj1cJGFjX3ZhbDs7CisgIGVzYWMKKyAgIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKKyAgZXNhYworICBhc19mbl9lcnJvciAiZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIKK2RvbmUKKworIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitidWlsZD0kYnVpbGRfYWxpYXMKK2hvc3Q9JGhvc3RfYWxpYXMKK3RhcmdldD0kdGFyZ2V0X2FsaWFzCisKKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2lmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgorYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CisgIGFzX2ZuX2Vycm9yICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKK3Rlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorICBhc19mbl9lcnJvciAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8CiskYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKKyAgYXNfZm5fZXJyb3IgImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKK2ZpCithY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCithY19hYnNfY29uZmRpcj1gKAorCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgIiRhY19tc2ciCisJcHdkKWAKKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCitpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisgIHNyY2Rpcj0uCitmaQorIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKyMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCitjYXNlICRzcmNkaXIgaW4KKyovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworZXNhYworZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KK2RvbmUKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL1BBQ0tBR0VdCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCitfQUNFT0YKKworICBjYXQgPDxcX0FDRU9GCisKK1N5c3RlbSB0eXBlczoKKyAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKyAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCisKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlZmlsZSBydWxlcyB1c2VmdWwgZm9yIG1haW50YWluZXJzCisgIC0tZW5hYmxlLXN5bWxpbmstaW5zdGFsbCB1c2Ugc3ltbGlua3Mgd2hlbiBpbnN0YWxsaW5nIGluc3RlYWQgb2YgaGFyZCBsaW5rcworICAtLWVuYWJsZS1zeW1saW5rLWJ1aWxkICB1c2Ugc3ltbGlua3Mgd2hpbGUgYnVpbGRpbmcgaW5zdGVhZCBvZiBoYXJkIGxpbmtzCisgIC0tZW5hYmxlLXZlcmJvc2UtbWFrZWNtZHMgZW5hYmxlIHZlcmJvc2UgbWFrZSBjb21tYW5kIG91dHB1dAorICAtLWVuYWJsZS1jb21wcmVzc2lvbgkgIGVuYWJsZSBFWFBFUklNRU5UQUwgY29tcHJlc3Npb24gc3VwcG9ydAorICAtLWVuYWJsZS1odHJlZSAgICAgIAkgIGVuYWJsZSBFWFBFUklNRU5UQUwgaHRyZWUgZGlyZWN0b3J5IHN1cHBvcnQKKyAgLS1lbmFibGUtZWxmLXNobGlicwkgIHNlbGVjdCBFTEYgc2hhcmVkIGxpYnJhcmllcworICAtLWVuYWJsZS1ic2Qtc2hsaWJzCSAgc2VsZWN0IEJTRCBzaGFyZWQgbGlicmFyaWVzCisgIC0tZW5hYmxlLXByb2ZpbGUJICBidWlsZCBwcm9maWxpbmcgbGlicmFyaWVzCisgIC0tZW5hYmxlLWNoZWNrZXIJICBidWlsZCBjaGVja2VyIGxpYnJhcmllcworICAtLWVuYWJsZS1qYmQtZGVidWcgIAkgIGVuYWJsZSBqb3VybmFsIGRlYnVnZ2luZworICAtLWVuYWJsZS1ibGtpZC1kZWJ1ZyAgICBlbmFibGUgYmxraWQgZGVidWdnaW5nCisgIC0tZGlzYWJsZS10ZXN0aW8tZGVidWcgIGRpc2FibGUgdGhlIHVzZSBvZiB0aGUgdGVzdCBJL08gbWFuYWdlciBmb3IgZGVidWdnaW5nCisgIC0tZGlzYWJsZS1saWJ1dWlkCSAgZG8gbm90IGJ1aWxkIHByaXZhdGUgdXVpZCBsaWJyYXJ5CisgIC0tZGlzYWJsZS1saWJibGtpZAkgIGRvIG5vdCBidWlsZCBwcml2YXRlIGJsa2lkIGxpYnJhcnkKKyAgLS1kaXNhYmxlLWRlYnVnZnMgICAJICBkaXNhYmxlIHN1cHBvcnQgb2YgZGVidWdmcyBwcm9ncmFtCisgIC0tZGlzYWJsZS1pbWFnZXIgICAJICBkaXNhYmxlIHN1cHBvcnQgb2YgZTJpbWFnZSBwcm9ncmFtCisgIC0tZGlzYWJsZS1yZXNpemVyICAgCSAgZGlzYWJsZSBzdXBwb3J0IG9mIGUycmVzaXplIHByb2dyYW0KKyAgLS1lbmFibGUtZnNjayAgICAgICAgICAgYnVpbGQgZnNjayB3cmFwcGVyIHByb2dyYW0KKyAgLS1lbmFibGUtZTJpbml0cmQtaGVscGVyIGJ1aWxkIGUyaW5pdHJkLWhlbHBlciBwcm9ncmFtCisgIC0tZGlzYWJsZS10bHMgICAgICAgICAgIGRpc2FibGUgdXNlIG9mIHRocmVhZCBsb2NhbCBzdXBwb3J0CisgIC0tZGlzYWJsZS11dWlkZCAgICAgICAgIGRpc2FibGUgYnVpbGRpbmcgdGhlIHV1aWQgZGFlbW9uCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAgLS1kaXNhYmxlLXJwYXRoICAgICAgICAgZG8gbm90IGhhcmRjb2RlIHJ1bnRpbWUgbGlicmFyeSBwYXRocworCitPcHRpb25hbCBQYWNrYWdlczoKKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS13aXRoLWRpZXQtbGliYyAgICAgICAgdXNlIGRpZXQgbGliYworICAtLXdpdGgtY2MgICAgICAgICAgICAgICBubyBsb25nZXIgc3VwcG9ydGVkLCB1c2UgQ0M9IGluc3RlYWQKKyAgLS13aXRoLWNjb3B0cyAgICAgICAgICAgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdXNlIENGTEFHUz0gaW5zdGVhZAorICAtLXdpdGgtbGRvcHRzICAgICAgICAgICBubyBsb25nZXIgc3VwcG9ydGVkLCB1c2UgTERGTEFHUz0gaW5zdGVhZAorICAtLXdpdGgtcm9vdC1wcmVmaXg9UFJFRklYIG92ZXJyaWRlIHByZWZpeCB2YXJpYWJsZSBmb3IgZmlsZXMgdG8gYmUgcGxhY2VkIGluIHRoZSByb290CisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBkZWZhdWx0PW5vCisgIC0td2l0aC1saWJpY29udi1wcmVmaXhbPURJUl0gIHNlYXJjaCBmb3IgbGliaWNvbnYgaW4gRElSL2luY2x1ZGUgYW5kIERJUi9saWIKKyAgLS13aXRob3V0LWxpYmljb252LXByZWZpeCAgICAgZG9uJ3Qgc2VhcmNoIGZvciBsaWJpY29udiBpbiBpbmNsdWRlZGlyIGFuZCBsaWJkaXIKKyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUKKyAgLS13aXRoLWxpYmludGwtcHJlZml4Wz1ESVJdICBzZWFyY2ggZm9yIGxpYmludGwgaW4gRElSL2luY2x1ZGUgYW5kIERJUi9saWIKKyAgLS13aXRob3V0LWxpYmludGwtcHJlZml4ICAgICBkb24ndCBzZWFyY2ggZm9yIGxpYmludGwgaW4gaW5jbHVkZWRpciBhbmQgbGliZGlyCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisgIFBLR19DT05GSUcgIHBhdGggdG8gcGtnLWNvbmZpZyB1dGlsaXR5CisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLgorX0FDRU9GCithY19zdGF0dXM9JD8KK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorY29uZmlndXJlCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjQKKworQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KK19BQ0VPRgorICBleGl0CitmaQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEF1dG9jb25mIGluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgYWNfZm5fY190cnlfY29tcGlsZSBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgcmV0dXJuICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIHJldHVybiAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9saW5rCisKKyMgYWNfZm5fY190cnlfY3BwIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NwcCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgcmV0dXJuICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NwcAorCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMsIGdpdmluZyBhIHdhcm5pbmcgaWYgaXQgY2Fubm90IGJlIGNvbXBpbGVkIHVzaW5nCisjIHRoZSBpbmNsdWRlIGZpbGVzIGluIElOQ0xVREVTIGFuZCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIKKyMgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyBhc192YXI9JDM7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHVzYWJpbGl0eSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkMiB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHByZXNlbmNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHByZXNlbmNlLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CiskYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAorICB5ZXM6bm86ICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7Citlc2FjCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgeyBhc192YXI9JDM7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsCisKKyMgYWNfZm5fY190cnlfcnVuIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcworIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KK2FjX2ZuX2NfdHJ5X3J1biAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisgICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cworZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICByZXR1cm4gJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfcnVuCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cyBhbmQgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluCisjIElOQ0xVREVTLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUKKworIyBhY19mbl9jX2NoZWNrX3R5cGUgTElORU5PIFRZUEUgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUKKyMgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja190eXBlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kMzsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPW5vIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgkMikpCisJIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCgkMikpKQorCSAgICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGV2YWwgIiQzPXllcyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKworfSAjIGFjX2ZuX2NfY2hlY2tfdHlwZQorCisjIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgeyBhc192YXI9JDM7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorCit9ICMgYWNfZm5fY19jaGVja19mdW5jCisKKyMgYWNfZm5fY19jb21wdXRlX2ludCBMSU5FTk8gRVhQUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJpZXMgdG8gZmluZCB0aGUgY29tcGlsZS10aW1lIHZhbHVlIG9mIEVYUFIgaW4gYSBwcm9ncmFtIHRoYXQgaW5jbHVkZXMKKyMgSU5DTFVERVMsIHNldHRpbmcgVkFSIGFjY29yZGluZ2x5LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIGNvdWxkIGJlCisjIGNvbXB1dGVkCithY19mbl9jX2NvbXB1dGVfaW50ICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgYXNfZm5fYXJpdGggJGFjX21pZCArIDEgJiYgYWNfbG89JGFzX3ZhbAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFzX2ZuX2FyaXRoIDIgJyonICRhY19taWQgKyAxICYmIGFjX21pZD0kYXNfdmFsCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2xvPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGFzX2ZuX2FyaXRoICcoJyAkYWNfbWlkICcpJyAtIDEgJiYgYWNfaGk9JGFzX3ZhbAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFzX2ZuX2FyaXRoIDIgJyonICRhY19taWQgJiYgYWNfbWlkPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBhY19sbz0gYWNfaGk9CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgord2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbworICBhc19mbl9hcml0aCAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG8gJiYgYWNfbWlkPSRhc192YWwKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgYXNfZm5fYXJpdGggJygnICRhY19taWQgJyknICsgMSAmJiBhY19sbz0kYXNfdmFsCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitjYXNlICRhY19sbyBpbiAjKCgKKz8qKSBldmFsICIkMz1cJGFjX2xvIjsgYWNfcmV0dmFsPTAgOzsKKycnKSBhY19yZXR2YWw9MSA7OworZXNhYworICBlbHNlCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CisKKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKKyAgaWYgKCEgZikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgkMikgPCAwKQorICAgIHsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKCQyKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbGQiLCBpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoJDIpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsdSIsIGkpOworICAgIH0KKyAgLyogRG8gbm90IG91dHB1dCBhIHRyYWlsaW5nIG5ld2xpbmUsIGFzIHRoaXMgY2F1c2VzIFxyXG4gY29uZnVzaW9uCisgICAgIG9uIHNvbWUgcGxhdGZvcm1zLiAgKi8KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBlY2hvID4+Y29uZnRlc3QudmFsOyByZWFkICQzIDxjb25mdGVzdC52YWw7IGFjX3JldHZhbD0wCitlbHNlCisgIGFjX3JldHZhbD0xCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29uZnRlc3QudmFsCisKKyAgZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgcmV0dXJuICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfY29tcHV0ZV9pbnQKKworIyBhY19mbl9jX2NoZWNrX21lbWJlciBMSU5FTk8gQUdHUiBNRU1CRVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJpZXMgdG8gZmluZCBpZiB0aGUgZmllbGQgTUVNQkVSIGV4aXN0cyBpbiB0eXBlIEFHR1IsIGFmdGVyIGluY2x1ZGluZworIyBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX21lbWJlciAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyLiQzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4kMy4uLiAiID4mNjsgfQoraWYgeyBhc192YXI9JDQ7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNQoraW50CittYWluICgpCit7CitzdGF0aWMgJDIgYWNfYWdncjsKK2lmIChhY19hZ2dyLiQzKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDQ9eWVzIgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNQoraW50CittYWluICgpCit7CitzdGF0aWMgJDIgYWNfYWdncjsKK2lmIChzaXplb2YgYWNfYWdnci4kMykKK3JldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQ0PXllcyIKK2Vsc2UKKyAgZXZhbCAiJDQ9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkNAorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisKK30gIyBhY19mbl9jX2NoZWNrX21lbWJlcgorCisjIGFjX2ZuX2NfY2hlY2tfZGVjbCBMSU5FTk8gU1lNQk9MIFZBUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBTWU1CT0wgaXMgZGVjbGFyZWQsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19kZWNsICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICQyIGlzIGRlY2xhcmVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJDIgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSQzOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiAkMgorICAodm9pZCkgJDI7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisKK30gIyBhY19mbl9jX2NoZWNrX2RlY2wKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjQuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCit7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Cit7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgorIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisgICAgICBlc2FjCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIGNhdCBjb25mZGVmcy5oCisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCithY19zaXRlX2ZpbGUxPU5PTkUKK2FjX3NpdGVfZmlsZTI9Tk9ORQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURQorZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQorICAgIHNlZCAncy9eL3wgLycgIiRhY19zaXRlX2ZpbGUiID4mNQorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbAorICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKyAgaWYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisgIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCisJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCisJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKwllbHNlCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAorCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CitmaQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBjb25maWcgIiRzcmNkaXIiL2NvbmZpZzsgZG8KKyAgZm9yIGFjX3QgaW4gaW5zdGFsbC1zaCBpbnN0YWxsLnNoIHNodG9vbDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY190IjsgdGhlbgorICAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci8kYWNfdCAtYyIKKyAgICAgIGJyZWFrIDIKKyAgICBmaQorICBkb25lCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBjb25maWcgXCIkc3JjZGlyXCIvY29uZmlnIiAiJExJTkVOTyIgNQorZmkKKworIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCisjIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCisjIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKKyMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorCisKK01DT05GSUc9Li9NQ09ORklHCisKK0JJTkFSWV9UWVBFPWJpbgorRTJGU1BST0dTX1ZFUlNJT049YGdyZXAgRTJGU1BST0dTX1ZFUlNJT04gJHtzcmNkaXJ9L3ZlcnNpb24uaCAgXAorCXwgYXdrICd7cHJpbnQgJDN9JyB8IHRyIFwiICIgIiB8IGF3ayAne3ByaW50ICQxfSdgCitEQVRFPWBncmVwIEUyRlNQUk9HU19EQVRFICR7c3JjZGlyfS92ZXJzaW9uLmggfCBhd2sgJ3twcmludCAkM30nIFwKKwl8IHRyIFwiICIgImAKK0UyRlNQUk9HU19EQVk9YGVjaG8gJERBVEUgfCBhd2sgLUYtICd7cHJpbnQgJDF9J2AKK01PTlRIPWBlY2hvICREQVRFIHwgYXdrIC1GLSAne3ByaW50ICQyfSdgCitZRUFSPWBlY2hvICREQVRFIHwgYXdrIC1GLSAne3ByaW50ICQzfSdgCisKK2lmIGV4cHIgJFlFQVIgIj4iIDE5MDAgPiAvZGV2L251bGwgOyB0aGVuCisJRTJGU1BST0dTX1lFQVI9JFlFQVIKK2VsaWYgZXhwciAkWUVBUiAiPiIgOTAgPi9kZXYvbnVsbCA7IHRoZW4KKwlFMkZTUFJPR1NfWUVBUj0xOSRZRUFSCitlbHNlCisJRTJGU1BST0dTX1lFQVI9MjAkWUVBUgorZmkKKworY2FzZSAkTU9OVEggaW4KK0phbikJTU9OVEhfTlVNPTAxOyBFMkZTUFJPR1NfTU9OVEg9IkphbnVhcnkiIDs7CitGZWIpCU1PTlRIX05VTT0wMjsgRTJGU1BST0dTX01PTlRIPSJGZWJydWFyeSIgOzsKK01hcikJTU9OVEhfTlVNPTAzOyBFMkZTUFJPR1NfTU9OVEg9Ik1hcmNoIiA7OworQXByKQlNT05USF9OVU09MDQ7IEUyRlNQUk9HU19NT05USD0iQXByaWwiIDs7CitNYXkpCU1PTlRIX05VTT0wNTsgRTJGU1BST0dTX01PTlRIPSJNYXkiIDs7CitKdW4pCU1PTlRIX05VTT0wNjsgRTJGU1BST0dTX01PTlRIPSJKdW5lIiA7OworSnVsKQlNT05USF9OVU09MDc7IEUyRlNQUk9HU19NT05USD0iSnVseSIgOzsKK0F1ZykJTU9OVEhfTlVNPTA4OyBFMkZTUFJPR1NfTU9OVEg9IkF1Z3VzdCIgOzsKK1NlcCkJTU9OVEhfTlVNPTA5OyBFMkZTUFJPR1NfTU9OVEg9IlNlcHRlbWJlciIgOzsKK09jdCkJTU9OVEhfTlVNPTEwOyBFMkZTUFJPR1NfTU9OVEg9Ik9jdG9iZXIiIDs7CitOb3YpCU1PTlRIX05VTT0xMTsgRTJGU1BST0dTX01PTlRIPSJOb3ZlbWJlciIgOzsKK0RlYykJTU9OVEhfTlVNPTEyOyBFMkZTUFJPR1NfTU9OVEg9IkRlY2VtYmVyIiA7OworKikJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBVbmtub3duIG1vbnRoICRNT05USD8/IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFVua25vd24gbW9udGggJE1PTlRIPz8iID4mMjt9IDs7Citlc2FjCisKK2Jhc2VfdmVyPWBlY2hvICRFMkZTUFJPR1NfVkVSU0lPTiB8IFwKKwkgICAgICAgc2VkIC1lICdzLy1XSVAvLycgLWUgJ3MvcHJlLS8vJyAtZSAncy8tUExVUy8vJ2AKKworZGF0ZV9zcGVjPSR7RTJGU1BST0dTX1lFQVJ9LiR7TU9OVEhfTlVNfS4ke0UyRlNQUk9HU19EQVl9CisKK2Nhc2UgJEUyRlNQUk9HU19WRVJTSU9OIGluCisqLVdJUHxwcmUtKikKKwlFMkZTUFJPR1NfUEtHVkVSPSIkYmFzZV92ZXJ+V0lQLSRFMkZTUFJPR1NfWUVBUi0kTU9OVEhfTlVNLSRFMkZTUFJPR1NfREFZIgorCTs7CisqKQorCUUyRlNQUk9HU19QS0dWRVI9IiRiYXNlX3ZlciIKKwk7OworZXNhYworCit1bnNldCBEQVRFIE1PTlRIIFlFQVIgYmFzZV92ZXIgcHJlX3ZlcnMgZGF0ZV9zcGVjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogR2VuZXJhdGluZyBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGUyZnNwcm9ncyB2ZXJzaW9uICRFMkZTUFJPR1NfVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiR2VuZXJhdGluZyBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGUyZnNwcm9ncyB2ZXJzaW9uICRFMkZTUFJPR1NfVkVSU0lPTiIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogUmVsZWFzZSBkYXRlIGlzICR7RTJGU1BST0dTX01PTlRIfSwgJHtFMkZTUFJPR1NfWUVBUn0iID4mNQorJGFzX2VjaG8gIlJlbGVhc2UgZGF0ZSBpcyAke0UyRlNQUk9HU19NT05USH0sICR7RTJGU1BST0dTX1lFQVJ9IiA+JjY7IH0KKworCisKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIGFzX2ZuX2Vycm9yICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhc19mbl9lcnJvciAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQorYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorICBhc19mbl9lcnJvciAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9CitjYXNlICRhY19jdl9idWlsZCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKK2VzYWMKK2J1aWxkPSRhY19jdl9idWlsZAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2J1aWxkCitzaGlmdAorYnVpbGRfY3B1PSQxCitidWlsZF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CitidWlsZF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKK2Vsc2UKKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorY2FzZSAkYWNfY3ZfaG9zdCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK0RMT1BFTl9MSUI9JycKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIGZpCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KK2RvbmUKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKK0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7CisgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEub3V0LmRTWU0gYS5leGUgYi5vdXQgY29uZnRlc3Qub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisKKyMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKK2FjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCisKK2FjX3JtZmlsZXM9Citmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKK2RvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisgIGVzYWMKK2RvbmUKK3JtIC1mICRhY19ybWZpbGVzCisKK2lmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworIyBBdXRvY29uZi4KK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKwl0aGVuIDo7IGVsc2UKKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwlmaQorCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAorCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJworCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgorCSMgYWN0dWFsbHkgd29ya2luZy4KKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCit0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KKworZWxzZQorICBhY19maWxlPScnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9CitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cit7IGFzX2ZuX3NldF9zdGF0dXMgNzcKK2FzX2ZuX2Vycm9yICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfTsgfQorZmkKK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CisKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICBpZiB7IGFjX3RyeT0nLi8kYWNfZmlsZScKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorICAgIGZpCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQgY29uZnRlc3Qub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQoraWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagoraWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7CisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gKSA7OworICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAorICAgICAgIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2NjX2c9bm8KKyAgIENGTEFHUz0iLWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBDRkxBR1M9IiIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworCSBDRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19jODk9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCisvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZpbmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisJLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCitkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKKyAgKikKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OworZXNhYworaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKKworZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHgiInllczsgdGhlbiA6CisgIERMT1BFTl9MSUI9LWxkbAorJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9ETE9QRU4gMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworV0lUSF9ESUVUX0xJQkM9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGlldC1saWJjIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kaWV0X2xpYmMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2RpZXRfbGliYzsgQ0M9ImRpZXQgY2MgLW5vc3RkaW5jIgorV0lUSF9ESUVUX0xJQkM9eWVzCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogQ0M9JENDIiA+JjUKKyRhc19lY2hvICJDQz0kQ0MiID4mNjsgfQorZmkKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY2Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2NjOyBhc19mbl9lcnJvciAiLS13aXRoLWNjIG5vIGxvbmdlciBzdXBwb3J0ZWQ7IHVzZSBDQz0gaW5zdGVhZCIgIiRMSU5FTk8iIDUKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jY29wdHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2Njb3B0cytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfY2NvcHRzOyBhc19mbl9lcnJvciAiLS13aXRoLWNjb3B0cyBubyBsb25nZXIgc3VwcG9ydGVkOyB1c2UgQ0ZMQUdTPSBpbnN0ZWFkIiAiJExJTkVOTyIgNQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxkb3B0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbGRvcHRzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9sZG9wdHM7IGFzX2ZuX2Vycm9yICItLXdpdGgtbGRvcHRzIG5vIGxvbmdlciBzdXBwb3J0ZWQ7IHVzZSBMREZMQUdTPSBpbnN0ZWFkIiAiJExJTkVOTyIgNQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZmkKKworZmkKKworCit0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIHNlZCAnMTBhXAorLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgorICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQoraWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZworICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY2NfZz1ubworICAgQ0ZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIENGTEFHUz0iIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCisJIENGTEFHUz0iLWciCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfZyIgPiY2OyB9CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9wcm9nX2NjX2M4OT1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCitzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CitGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworc3RhdGljIGNoYXIgKmUgKHAsIGkpCisgICAgIGNoYXIgKipwOworICAgICBpbnQgaTsKK3sKKyAgcmV0dXJuIHBbaV07Cit9CitzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCit7CisgIGNoYXIgKnM7CisgIHZhX2xpc3QgdjsKKyAgdmFfc3RhcnQgKHYscCk7CisgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisgIHZhX2VuZCAodik7CisgIHJldHVybiBzOworfQorCisvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCisgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CisgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCisgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLworI2RlZmluZSBGT08oeCkgJ3gnCitpbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKKworaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CitzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKK3N0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OworaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7CitpbnQgYXJnYzsKK2NoYXIgKiphcmd2OworaW50CittYWluICgpCit7CityZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKKwktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorZG8KKyAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCisgIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisjIEFDX0NBQ0hFX1ZBTAorY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KKyAgeCkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorJGFzX2VjaG8gIm5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKKyAgeG5vKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1CiskYXNfZWNobyAidW5zdXBwb3J0ZWQiID4mNjsgfSA7OworICAqKQorICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Citlc2FjCitpZiB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSB4bm87IHRoZW4gOgorCitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorICAgIGRvCisgICAgICBhY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCisKKyAgICBkb25lCisgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorCitmaQorICBDUFA9JGFjX2N2X3Byb2dfQ1BQCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQUCIgPiY1CiskYXNfZWNobyAiJENQUCIgPiY2OyB9CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKKworZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICJDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9HUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKK2Nhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgorICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQorIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC9mcy5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X2ZzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2ZzX2giID0geCIieWVzOyB0aGVuIDoKKyAgbGludXhfaGVhZGVycz15ZXMKK2Vsc2UKKyAgbGludXhfaGVhZGVycz1ubworZmkKKworCitpZiB0ZXN0ICIkbGludXhfaGVhZGVycyIgIT0geWVzOyB0aGVuCisgIExJTlVYX0lOQ0xVREU9Jy1JJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUnCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhZGRpdGlvbmFsIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGFkZGl0aW9uYWwgc3BlY2lhbCBjb21waWxlciBmbGFncy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJEdDQyIgPSB5ZXMKK3RoZW4KKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisJYWxwaGEpCQlhZGRjZmxhZ3M9Ii1taWVlZSIgOzsKKyAgICBlc2FjCitmaQoraWYgdGVzdCAieCRhZGRjZmxhZ3MiICE9IHgKK3RoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFkZGNmbGFncyIgPiY1CiskYXNfZWNobyAiJGFkZGNmbGFncyIgPiY2OyB9CisgICAgQ0ZMQUdTPSIkYWRkY2ZsYWdzICRDRkxBR1MiCitlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IChub25lKSIgPiY1CiskYXNfZWNobyAiKG5vbmUpIiA+JjY7IH0KK2ZpCitMSUJfRVhUPS5hCitTVEFUSUNfTElCX0VYVD0uYQorUFJPRklMRURfTElCX0VYVD0uYQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXJvb3QtcHJlZml4IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9yb290X3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcm9vdF9wcmVmaXg7IHJvb3RfcHJlZml4PSR3aXRodmFsCitlbHNlCisgIHJvb3RfcHJlZml4PU5PTkUKK2ZpCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX21haW50YWluZXJfbW9kZTsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJTUFJTlRBSU5FUl9DTVQ9IworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgbWFpbnRhaW5lciBtb2RlIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgbWFpbnRhaW5lciBtb2RlIiA+JjY7IH0KK2Vsc2UKKwlNQUlOVEFJTkVSX0NNVD0KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgbWFpbnRhaW5lciBtb2RlIiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBtYWludGFpbmVyIG1vZGUiID4mNjsgfQorZmkKKworZWxzZQorICBNQUlOVEFJTkVSX0NNVD0jCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIG1haW50YWluZXIgbW9kZSBieSBkZWZhdWx0IiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgbWFpbnRhaW5lciBtb2RlIGJ5IGRlZmF1bHQiID4mNjsgfQorCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zeW1saW5rLWluc3RhbGwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3ltbGlua19pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc3ltbGlua19pbnN0YWxsOyBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlMSU5LX0lOU1RBTExfRkxBR1M9LWYKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIHN5bWxpbmtzIGZvciBpbnN0YWxsIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGluc3RhbGwiID4mNjsgfQorZWxzZQorCUxJTktfSU5TVEFMTF9GTEFHUz0tc2YKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgc3ltbGlua3MgZm9yIGluc3RhbGwiID4mNQorJGFzX2VjaG8gIkVuYWJsaW5nIHN5bWxpbmtzIGZvciBpbnN0YWxsIiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgTElOS19JTlNUQUxMX0ZMQUdTPS1mCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIHN5bWxpbmtzIGZvciBpbnN0YWxsIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGluc3RhbGwiID4mNjsgfQorCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zeW1saW5rLWJ1aWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N5bWxpbmtfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zeW1saW5rX2J1aWxkOyBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlMSU5LX0JVSUxEX0ZMQUdTPQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGJ1aWxkIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGJ1aWxkIiA+JjY7IH0KK2Vsc2UKKwlMSU5LX0JVSUxEX0ZMQUdTPS1zCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIHN5bWxpbmtzIGZvciBidWlsZCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgc3ltbGlua3MgZm9yIGJ1aWxkIiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgTElOS19CVUlMRF9GTEFHUz0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGJ1aWxkIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGJ1aWxkIiA+JjY7IH0KKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdmVyYm9zZS1tYWtlY21kcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV92ZXJib3NlX21ha2VjbWRzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdmVyYm9zZV9tYWtlY21kczsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IERpc2FibGluZyB2ZXJib3NlIG1ha2UgY29tbWFuZHMiID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyB2ZXJib3NlIG1ha2UgY29tbWFuZHMiID4mNjsgfQorCUU9QGVjaG8KKwlRPUAKK2Vsc2UKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgdmVyYm9zZSBtYWtlIGNvbW1hbmRzIiA+JjUKKyRhc19lY2hvICJFbmFibGluZyB2ZXJib3NlIG1ha2UgY29tbWFuZHMiID4mNjsgfQorCUU9QFxcIworCVE9CitmaQorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgdmVyYm9zZSBtYWtlIGNvbW1hbmRzIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgdmVyYm9zZSBtYWtlIGNvbW1hbmRzIiA+JjY7IH0KK0U9QGVjaG8KK1E9QAorCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbXByZXNzaW9uIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NvbXByZXNzaW9uK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfY29tcHJlc3Npb247IGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgY29tcHJlc3Npb24gc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIGNvbXByZXNzaW9uIHN1cHBvcnQiID4mNjsgfQorZWxzZQorCSRhc19lY2hvICIjZGVmaW5lIEVOQUJMRV9DT01QUkVTU0lPTiAxIiA+PmNvbmZkZWZzLmgKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyBjb21wcmVzc2lvbiBzdXBwb3J0IiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBjb21wcmVzc2lvbiBzdXBwb3J0IiA+JjY7IH0KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IENvbXByZXNzaW9uIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENvbXByZXNzaW9uIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsIiA+JjI7fQorZmkKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIGNvbXByZXNzaW9uIHN1cHBvcnQgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIGNvbXByZXNzaW9uIHN1cHBvcnQgYnkgZGVmYXVsdCIgPiY2OyB9CisKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1odHJlZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9odHJlZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2h0cmVlOyBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlIVFJFRV9DTVQ9IworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgaHRyZWUgZGlyZWN0b3J5IHN1cHBvcnQiID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyBodHJlZSBkaXJlY3Rvcnkgc3VwcG9ydCIgPiY2OyB9CitlbHNlCisJSFRSRUVfQ01UPQorCSRhc19lY2hvICIjZGVmaW5lIEVOQUJMRV9IVFJFRSAxIiA+PmNvbmZkZWZzLmgKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyBodHJlZSBkaXJlY3Rvcnkgc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgaHRyZWUgZGlyZWN0b3J5IHN1cHBvcnQiID4mNjsgfQorZmkKKworZWxzZQorICBIVFJFRV9DTVQ9CiskYXNfZWNobyAiI2RlZmluZSBFTkFCTEVfSFRSRUUgMSIgPj5jb25mZGVmcy5oCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyBodHJlZSBkaXJlY3Rvcnkgc3VwcG9ydCBieSBkZWZhdWx0IiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBodHJlZSBkaXJlY3Rvcnkgc3VwcG9ydCBieSBkZWZhdWx0IiA+JjY7IH0KKworZmkKKworCitFMl9QS0dfQ09ORklHX1NUQVRJQz0tLXN0YXRpYworTERGTEFHX0RZTkFNSUM9CitQUklWQVRFX0xJQlNfQ01UPQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWVsZi1zaGxpYnMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZWxmX3NobGlicytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2VsZl9zaGxpYnM7IGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUVMRl9DTVQ9IworCU1BS0VGSUxFX0VMRj0vZGV2L251bGwKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIEVMRiBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgRUxGIHNoYXJlZCBsaWJyYXJpZXMiID4mNjsgfQorZWxzZQorCUUyX1BLR19DT05GSUdfU1RBVElDPQorCUVMRl9DTVQ9CisJTUFLRUZJTEVfRUxGPSRzcmNkaXIvbGliL01ha2VmaWxlLmVsZi1saWIKKwljYXNlICIkaG9zdF9vcyIgaW4KKwlzb2xhcmlzMi4qKQorCQlNQUtFRklMRV9FTEY9JHNyY2Rpci9saWIvTWFrZWZpbGUuc29sYXJpcy1saWIKKwk7OworCWVzYWMKKwlCSU5BUllfVFlQRT1lbGZiaW4KKwlMSUJfRVhUPS5zbworCVBSSVZBVEVfTElCU19DTVQ9IworCUxERkxBR19EWU5BTUlDPSctV2wsLXJwYXRoLWxpbmssJCh0b3BfYnVpbGRkaXIpL2xpYicKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgRUxGIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG8gIkVuYWJsaW5nIEVMRiBzaGFyZWQgbGlicmFyaWVzIiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgTUFLRUZJTEVfRUxGPS9kZXYvbnVsbAorRUxGX0NNVD0jCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIEVMRiBzaGFyZWQgbGlicmFyaWVzIGJ5IGRlZmF1bHQiID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyBFTEYgc2hhcmVkIGxpYnJhcmllcyBieSBkZWZhdWx0IiA+JjY7IH0KKworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ic2Qtc2hsaWJzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2JzZF9zaGxpYnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9ic2Rfc2hsaWJzOyBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlCU0RMSUJfQ01UPSMKKwlNQUtFRklMRV9CU0RMSUI9L2Rldi9udWxsCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IERpc2FibGluZyBCU0Qgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIEJTRCBzaGFyZWQgbGlicmFyaWVzIiA+JjY7IH0KK2Vsc2UKKwlFMl9QS0dfQ09ORklHX1NUQVRJQz0KKwlCU0RMSUJfQ01UPQorCU1BS0VGSUxFX0JTRExJQj0kc3JjZGlyL2xpYi9NYWtlZmlsZS5ic2QtbGliCisJTElCX0VYVD0uc28KKwljYXNlICIkaG9zdF9vcyIgaW4KKwlkYXJ3aW4qKQorCQlNQUtFRklMRV9CU0RMSUI9JHNyY2Rpci9saWIvTWFrZWZpbGUuZGFyd2luLWxpYgorCQlMSUJfRVhUPS5keWxpYgorCTs7CisJZXNhYworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyBCU0Qgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgQlNEIHNoYXJlZCBsaWJyYXJpZXMiID4mNjsgfQorZmkKKworZWxzZQorICBNQUtFRklMRV9CU0RMSUI9L2Rldi9udWxsCitCU0RMSUJfQ01UPSMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgQlNEIHNoYXJlZCBsaWJyYXJpZXMgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIEJTRCBzaGFyZWQgbGlicmFyaWVzIGJ5IGRlZmF1bHQiID4mNjsgfQorCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcHJvZmlsZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3Byb2ZpbGU7IGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCVBST0ZJTEVfQ01UPSMKKwlNQUtFRklMRV9QUk9GSUxFPS9kZXYvbnVsbAorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgcHJvZmlsaW5nIGxpYnJhcmllcyIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIHByb2ZpbGluZyBsaWJyYXJpZXMiID4mNjsgfQorZWxzZQorCVBST0ZJTEVfQ01UPQorCU1BS0VGSUxFX1BST0ZJTEU9JHNyY2Rpci9saWIvTWFrZWZpbGUucHJvZmlsZQorCVBST0ZJTEVEX0xJQl9FWFQ9X3AuYQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBCdWlsZGluZyBwcm9maWxpbmcgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvICJCdWlsZGluZyBwcm9maWxpbmcgbGlicmFyaWVzIiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgUFJPRklMRV9DTVQ9IworTUFLRUZJTEVfUFJPRklMRT0vZGV2L251bGwKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgcHJvZmlsaW5nIGxpYnJhcmllcyBieSBkZWZhdWx0IiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgcHJvZmlsaW5nIGxpYnJhcmllcyBieSBkZWZhdWx0IiA+JjY7IH0KKworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jaGVja2VyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NoZWNrZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9jaGVja2VyOyBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlDSEVDS0VSX0NNVD0jCisJTUFLRUZJTEVfQ0hFQ0tFUj0vZGV2L251bGwKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIGNoZWNrZXIgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgY2hlY2tlciBsaWJyYXJpZXMiID4mNjsgfQorZWxzZQorCUNIRUNLRVJfQ01UPQorCU1BS0VGSUxFX0NIRUNLRVI9JHNyY2Rpci9saWIvTWFrZWZpbGUuY2hlY2tlcgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBCdWlsZGluZyBjaGVja2VyIGxpYnJhcmllcyIgPiY1CiskYXNfZWNobyAiQnVpbGRpbmcgY2hlY2tlciBsaWJyYXJpZXMiID4mNjsgfQorZmkKKworZWxzZQorICBDSEVDS0VSX0NNVD0jCitNQUtFRklMRV9DSEVDS0VSPS9kZXYvbnVsbAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IERpc2FibGluZyBjaGVja2VyIGxpYnJhcmllcyBieSBkZWZhdWx0IiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgY2hlY2tlciBsaWJyYXJpZXMgYnkgZGVmYXVsdCIgPiY2OyB9CisKK2ZpCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWpiZC1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9qYmRfZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9qYmRfZGVidWc7IGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgam91cm5hbCBkZWJ1Z2dpbmciID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyBqb3VybmFsIGRlYnVnZ2luZyIgPiY2OyB9CitlbHNlCisJJGFzX2VjaG8gIiNkZWZpbmUgQ09ORklHX0pCRF9ERUJVRyAxIiA+PmNvbmZkZWZzLmgKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyBqb3VybmFsIGRlYnVnZ2luZyIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgam91cm5hbCBkZWJ1Z2dpbmciID4mNjsgfQorZmkKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIGpvdXJuYWwgZGVidWdnaW5nIGJ5IGRlZmF1bHQiID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyBqb3VybmFsIGRlYnVnZ2luZyBieSBkZWZhdWx0IiA+JjY7IH0KKworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJsa2lkLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Jsa2lkX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfYmxraWRfZGVidWc7IGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgYmxraWQgZGVidWdnaW5nIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgYmxraWQgZGVidWdnaW5nIiA+JjY7IH0KK2Vsc2UKKwkkYXNfZWNobyAiI2RlZmluZSBDT05GSUdfQkxLSURfREVCVUcgMSIgPj5jb25mZGVmcy5oCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgYmxraWQgZGVidWdnaW5nIiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBibGtpZCBkZWJ1Z2dpbmciID4mNjsgfQorZmkKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIGJsa2lkIGRlYnVnZ2luZyBieSBkZWZhdWx0IiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgYmxraWQgZGVidWdnaW5nIGJ5IGRlZmF1bHQiID4mNjsgfQorCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGVzdGlvLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3Rlc3Rpb19kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3Rlc3Rpb19kZWJ1ZzsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IERpc2FibGluZyB0ZXN0aW8gZGVidWdnaW5nIiA+JjUKKyRhc19lY2hvICJEaXNhYmxpbmcgdGVzdGlvIGRlYnVnZ2luZyIgPiY2OyB9CisJVEVTVF9JT19DTVQ9IiMiCitlbHNlCisJVEVTVF9JT19DTVQ9CisJJGFzX2VjaG8gIiNkZWZpbmUgQ09ORklHX1RFU1RJT19ERUJVRyAxIiA+PmNvbmZkZWZzLmgKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyB0ZXN0aW8gZGVidWdnaW5nIiA+JjUKKyRhc19lY2hvICJFbmFibGluZyB0ZXN0aW8gZGVidWdnaW5nIiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIHRlc3RpbyBkZWJ1Z2dpbmcgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgdGVzdGlvIGRlYnVnZ2luZyBieSBkZWZhdWx0IiA+JjY7IH0KKyRhc19lY2hvICIjZGVmaW5lIENPTkZJR19URVNUSU9fREVCVUcgMSIgPj5jb25mZGVmcy5oCisKK1RFU1RfSU9fQ01UPQorCitmaQorCisKKworCitpZiB0ZXN0ICJ4JGFjX2N2X2Vudl9QS0dfQ09ORklHX3NldCIgIT0gInhzZXQiOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfUEtHX0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBLR19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJFBLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQS0dfQ09ORklHPSRhY19jdl9wYXRoX1BLR19DT05GSUcKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBLR19DT05GSUciID4mNQorJGFzX2VjaG8gIiRQS0dfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIjsgdGhlbgorICBhY19wdF9QS0dfQ09ORklHPSRQS0dfQ09ORklHCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X1BLR19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRz0iJGFjX3B0X1BLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9QS0dfQ09ORklHPSRhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcKK2lmIHRlc3QgLW4gIiRhY19wdF9QS0dfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X1BLR19DT05GSUciID4mNQorJGFzX2VjaG8gIiRhY19wdF9QS0dfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfUEtHX0NPTkZJRyIgPSB4OyB0aGVuCisgICAgUEtHX0NPTkZJRz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBLR19DT05GSUc9JGFjX3B0X1BLR19DT05GSUcKKyAgZmkKK2Vsc2UKKyAgUEtHX0NPTkZJRz0iJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyIKK2ZpCisKK2ZpCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICAgICAgX3BrZ19taW5fdmVyc2lvbj0wLjkuMAorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24uLi4gIiA+JjY7IH0KKyAgICAgICAgaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgICAgICAgICAgICAgIFBLR19DT05GSUc9IiIKKyAgICAgICAgZmkKKworZmkKK0xJQlVVSUQ9CitERVBMSUJVVUlEPQorU1RBVElDX0xJQlVVSUQ9CitERVBTVEFUSUNfTElCVVVJRD0KK1BST0ZJTEVEX0xJQlVVSUQ9CitERVBQUk9GSUxFRF9MSUJVVUlEPQorVVVJRF9DTVQ9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidXVpZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ1dWlkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGlidXVpZDsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJaWYgdGVzdCAteiAiJFBLR19DT05GSUciOyB0aGVuCisJCWFzX2ZuX2Vycm9yICJwa2ctY29uZmlnIG5vdCBpbnN0YWxsZWQ7IHBsZWFzZSBpbnN0YWxsIGl0LiIgIiRMSU5FTk8iIDUKKwlmaQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXVpZF9nZW5lcmF0ZSBpbiAtbHV1aWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHV1aWRfZ2VuZXJhdGUgaW4gLWx1dWlkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl91dWlkX3V1aWRfZ2VuZXJhdGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHV1aWQgJExJQlVVSUQgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgdXVpZF9nZW5lcmF0ZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHV1aWRfZ2VuZXJhdGUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3V1aWRfdXVpZF9nZW5lcmF0ZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3V1aWRfdXVpZF9nZW5lcmF0ZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfdXVpZF91dWlkX2dlbmVyYXRlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3V1aWRfdXVpZF9nZW5lcmF0ZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl91dWlkX3V1aWRfZ2VuZXJhdGUiID0geCIieWVzOyB0aGVuIDoKKyAgTElCVVVJRD1gJFBLR19DT05GSUcgLS1saWJzIHV1aWRgOworCQkgU1RBVElDX0xJQlVVSUQ9YCRQS0dfQ09ORklHIC0tc3RhdGljIC0tbGlicyB1dWlkYAorZWxzZQorICBhc19mbl9lcnJvciAiZXh0ZXJuYWwgdXVpZCBsaWJyYXJ5IG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKK2ZpCisKKwlVVUlEX0NNVD0jCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IERpc2FibGluZyBwcml2YXRlIHV1aWQgbGlicmFyeSIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIHByaXZhdGUgdXVpZCBsaWJyYXJ5IiA+JjY7IH0KK2Vsc2UKKwlMSUJVVUlEPSckKExJQikvbGlidXVpZCckTElCX0VYVAorCURFUExJQlVVSUQ9JExJQlVVSUQKKwlTVEFUSUNfTElCVVVJRD0nJChMSUIpL2xpYnV1aWQnJFNUQVRJQ19MSUJfRVhUCisJREVQU1RBVElDX0xJQlVVSUQ9JFNUQVRJQ19MSUJVVUlECisJUFJPRklMRURfTElCVVVJRD0nJChMSUIpL2xpYnV1aWQnJFBST0ZJTEVEX0xJQl9FWFQKKwlERVBQUk9GSUxFRF9MSUJVVUlEPSRQUk9GSUxFRF9MSUJVVUlECisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIHByaXZhdGUgdXVpZCBsaWJyYXJ5IiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBwcml2YXRlIHV1aWQgbGlicmFyeSIgPiY2OyB9CitmaQorCitlbHNlCisgIExJQlVVSUQ9JyQoTElCKS9saWJ1dWlkJyRMSUJfRVhUCitERVBMSUJVVUlEPSRMSUJVVUlECitTVEFUSUNfTElCVVVJRD0nJChMSUIpL2xpYnV1aWQnJFNUQVRJQ19MSUJfRVhUCitERVBTVEFUSUNfTElCVVVJRD0kU1RBVElDX0xJQlVVSUQKK1BST0ZJTEVEX0xJQlVVSUQ9JyQoTElCKS9saWJ1dWlkJyRQUk9GSUxFRF9MSUJfRVhUCitERVBQUk9GSUxFRF9MSUJVVUlEPSRQUk9GSUxFRF9MSUJVVUlECit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgcHJpdmF0ZSB1dWlkIGxpYnJhcnkgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgcHJpdmF0ZSB1dWlkIGxpYnJhcnkgYnkgZGVmYXVsdCIgPiY2OyB9CisKK2ZpCisKKworCisKKworCisKKworCisKK2lmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QS0dfQ09ORklHK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUEtHX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1BLR19DT05GSUc9JGFjX2N2X3BhdGhfUEtHX0NPTkZJRworaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUEtHX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJFBLR19DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX1BLR19DT05GSUciOyB0aGVuCisgIGFjX3B0X1BLR19DT05GSUc9JFBLR19DT05GSUcKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwa2ctY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfUEtHX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYWNfcHRfUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X1BLR19DT05GSUc9JGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRworaWYgdGVzdCAtbiAiJGFjX3B0X1BLR19DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfUEtHX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJGFjX3B0X1BLR19DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9QS0dfQ09ORklHIiA9IHg7IHRoZW4KKyAgICBQS0dfQ09ORklHPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUEtHX0NPTkZJRz0kYWNfcHRfUEtHX0NPTkZJRworICBmaQorZWxzZQorICBQS0dfQ09ORklHPSIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIgorZmkKKworZmkKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgICAgICBfcGtnX21pbl92ZXJzaW9uPTAuOS4wCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICBpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb247IHRoZW4KKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgICAgICAgICAgUEtHX0NPTkZJRz0iIgorICAgICAgICBmaQorCitmaQorTElCQkxLSUQ9CitERVBMSUJCTEtJRD0KK1NUQVRJQ19MSUJCTEtJRD0KK0RFUFNUQVRJQ19MSUJCTEtJRD0KK1BST0ZJTEVEX0xJQkJMS0lEPQorREVQUFJPRklMRURfTElCQkxLSUQ9CitCTEtJRF9DTVQ9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGliYmxraWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGliYmxraWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9saWJibGtpZDsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJaWYgdGVzdCAteiAiJFBLR19DT05GSUciOyB0aGVuCisJCWFzX2ZuX2Vycm9yICJwa2ctY29uZmlnIG5vdCBpbnN0YWxsZWQ7IHBsZWFzZSBpbnN0YWxsIGl0LiIgIiRMSU5FTk8iIDUKKwlmaQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYmxraWRfZ2V0X2NhY2hlIGluIC1sYmxraWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGJsa2lkX2dldF9jYWNoZSBpbiAtbGJsa2lkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9ibGtpZF9ibGtpZF9nZXRfY2FjaGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGJsa2lkICRMSUJCTEtJRCAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBibGtpZF9nZXRfY2FjaGUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBibGtpZF9nZXRfY2FjaGUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2Jsa2lkX2Jsa2lkX2dldF9jYWNoZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2Jsa2lkX2Jsa2lkX2dldF9jYWNoZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfYmxraWRfYmxraWRfZ2V0X2NhY2hlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2Jsa2lkX2Jsa2lkX2dldF9jYWNoZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ibGtpZF9ibGtpZF9nZXRfY2FjaGUiID0geCIieWVzOyB0aGVuIDoKKyAgTElCQkxLSUQ9YCRQS0dfQ09ORklHIC0tbGlicyBibGtpZGA7CisJCSBTVEFUSUNfTElCQkxLSUQ9YCRQS0dfQ09ORklHIC0tc3RhdGljIC0tbGlicyBibGtpZGAKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgImV4dGVybmFsIGJsa2lkIGxpYnJhcnkgbm90IGZvdW5kIiAiJExJTkVOTyIgNQorZmkKKworCUJMS0lEX0NNVD0jCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IERpc2FibGluZyBwcml2YXRlIGJsa2lkIGxpYnJhcnkiID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyBwcml2YXRlIGJsa2lkIGxpYnJhcnkiID4mNjsgfQorZWxzZQorCUxJQkJMS0lEPSckKExJQikvbGliYmxraWQnJExJQl9FWFQKKwlERVBMSUJCTEtJRD0kTElCQkxLSUQKKwlTVEFUSUNfTElCQkxLSUQ9JyQoTElCKS9saWJibGtpZCckU1RBVElDX0xJQl9FWFQKKwlERVBTVEFUSUNfTElCQkxLSUQ9JFNUQVRJQ19MSUJCTEtJRAorCVBST0ZJTEVEX0xJQkJMS0lEPSckKExJQikvbGliYmxraWQnJFBST0ZJTEVEX0xJQl9FWFQKKwlERVBQUk9GSUxFRF9MSUJCTEtJRD0kUFJPRklMRURfTElCQkxLSUQKKwkkYXNfZWNobyAiI2RlZmluZSBDT05GSUdfQlVJTERfRklOREZTIDEiID4+Y29uZmRlZnMuaAorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIHByaXZhdGUgYmxraWQgbGlicmFyeSIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgcHJpdmF0ZSBibGtpZCBsaWJyYXJ5IiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgTElCQkxLSUQ9JyQoTElCKS9saWJibGtpZCckTElCX0VYVAorREVQTElCQkxLSUQ9JExJQkJMS0lECitTVEFUSUNfTElCQkxLSUQ9JyQoTElCKS9saWJibGtpZCckU1RBVElDX0xJQl9FWFQKK0RFUFNUQVRJQ19MSUJCTEtJRD0kU1RBVElDX0xJQkJMS0lECitQUk9GSUxFRF9MSUJCTEtJRD0nJChMSUIpL2xpYmJsa2lkJyRQUk9GSUxFRF9MSUJfRVhUCitERVBQUk9GSUxFRF9MSUJCTEtJRD0kUFJPRklMRURfTElCQkxLSUQKKyRhc19lY2hvICIjZGVmaW5lIENPTkZJR19CVUlMRF9GSU5ERlMgMSIgPj5jb25mZGVmcy5oCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyBwcml2YXRlIGJsa2lkIGxpYnJhcnkgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgcHJpdmF0ZSBibGtpZCBsaWJyYXJ5IGJ5IGRlZmF1bHQiID4mNjsgfQorCitmaQorCisKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZWJ1Z2ZzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnZnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kZWJ1Z2ZzOyBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRGlzYWJsaW5nIGRlYnVnZnMgc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIGRlYnVnZnMgc3VwcG9ydCIgPiY2OyB9CisJREVCVUdGU19DTVQ9IiMiCitlbHNlCisJREVCVUdGU19DTVQ9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIGRlYnVnZnMgc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgZGVidWdmcyBzdXBwb3J0IiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIGRlYnVnZnMgc3VwcG9ydCBieSBkZWZhdWx0IiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBkZWJ1Z2ZzIHN1cHBvcnQgYnkgZGVmYXVsdCIgPiY2OyB9CitERUJVR0ZTX0NNVD0KKworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtaW1hZ2VyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2ltYWdlcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2ltYWdlcjsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IERpc2FibGluZyBlMmltYWdlIHN1cHBvcnQiID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyBlMmltYWdlIHN1cHBvcnQiID4mNjsgfQorCUlNQUdFUl9DTVQ9IiMiCitlbHNlCisJSU1BR0VSX0NNVD0KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgZTJpbWFnZSBzdXBwb3J0IiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBlMmltYWdlIHN1cHBvcnQiID4mNjsgfQorZmkKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgZTJpbWFnZSBzdXBwb3J0IGJ5IGRlZmF1bHQiID4mNQorJGFzX2VjaG8gIkVuYWJsaW5nIGUyaW1hZ2Ugc3VwcG9ydCBieSBkZWZhdWx0IiA+JjY7IH0KK0lNQUdFUl9DTVQ9CisKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXJlc2l6ZXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcmVzaXplcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3Jlc2l6ZXI7IGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgZTJyZXNpemUgc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiRGlzYWJsaW5nIGUycmVzaXplIHN1cHBvcnQiID4mNjsgfQorCVJFU0laRVJfQ01UPSIjIgorZWxzZQorCVJFU0laRVJfQ01UPQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyBlMnJlc2l6ZSBzdXBwb3J0IiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBlMnJlc2l6ZSBzdXBwb3J0IiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIGUycmVzaXplIHN1cHBvcnQgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgZTJyZXNpemUgc3VwcG9ydCBieSBkZWZhdWx0IiA+JjY7IH0KK1JFU0laRVJfQ01UPQorCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mc2NrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2ZzY2src2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9mc2NrOyBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlGU0NLX1BST0c9JycgRlNDS19NQU49JycKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogTm90IGJ1aWxkaW5nIGZzY2sgd3JhcHBlciIgPiY1CiskYXNfZWNobyAiTm90IGJ1aWxkaW5nIGZzY2sgd3JhcHBlciIgPiY2OyB9CitlbHNlCisJRlNDS19QUk9HPWZzY2sgRlNDS19NQU49ZnNjay44CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEJ1aWxkaW5nIGZzY2sgd3JhcHBlciIgPiY1CiskYXNfZWNobyAiQnVpbGRpbmcgZnNjayB3cmFwcGVyIiA+JjY7IH0KK2ZpCisKK2Vsc2UKKyAgY2FzZSAiJGhvc3Rfb3MiIGluCisgIGdudSopCisgICAgRlNDS19QUk9HPScnIEZTQ0tfTUFOPScnCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE5vdCBidWlsZGluZyBmc2NrIHdyYXBwZXIgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiTm90IGJ1aWxkaW5nIGZzY2sgd3JhcHBlciBieSBkZWZhdWx0IiA+JjY7IH0KKyAgICA7OworICAqKQorICAgIEZTQ0tfUFJPRz1mc2NrIEZTQ0tfTUFOPWZzY2suOAorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBCdWlsZGluZyBmc2NrIHdyYXBwZXIgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiQnVpbGRpbmcgZnNjayB3cmFwcGVyIGJ5IGRlZmF1bHQiID4mNjsgfQorZXNhYworCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWUyaW5pdHJkLWhlbHBlciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9lMmluaXRyZF9oZWxwZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9lMmluaXRyZF9oZWxwZXI7IGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUUySU5JVFJEX1BST0c9JycgRTJJTklUUkRfTUFOPScnCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE5vdCBidWlsZGluZyBlMmluaXRyZCBoZWxwZXIiID4mNQorJGFzX2VjaG8gIk5vdCBidWlsZGluZyBlMmluaXRyZCBoZWxwZXIiID4mNjsgfQorZWxzZQorCUUySU5JVFJEX1BST0c9ZTJpbml0cmRfaGVscGVyIEUySU5JVFJEX01BTj1lMmluaXRyZF9oZWxwZXIuOAorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBCdWlsZGluZyBlMmluaXRyZCBoZWxwZXIiID4mNQorJGFzX2VjaG8gIkJ1aWxkaW5nIGUyaW5pdHJkIGhlbHBlciIgPiY2OyB9CitmaQorCitlbHNlCisgIEUySU5JVFJEX1BST0c9ZTJpbml0cmRfaGVscGVyIEUySU5JVFJEX01BTj1lMmluaXRyZF9oZWxwZXIuOAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEJ1aWxkaW5nIGUyaW5pdHJkIGhlbHBlciBieSBkZWZhdWx0IiA+JjUKKyRhc19lY2hvICJCdWlsZGluZyBlMmluaXRyZCBoZWxwZXIgYnkgZGVmYXVsdCIgPiY2OyB9CisKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3RscytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3RsczsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJdHJ5X3Rscz0iIgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgdGhyZWFkIGxvY2FsIHN1cHBvcnQiID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyB0aHJlYWQgbG9jYWwgc3VwcG9ydCIgPiY2OyB9CitlbHNlCisJdHJ5X3Rscz0ieWVzIgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBFbmFibGluZyB0aHJlYWQgbG9jYWwgc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgdGhyZWFkIGxvY2FsIHN1cHBvcnQiID4mNjsgfQorZmkKKworZWxzZQorICBpZiB0ZXN0IC1uICIkV0lUSF9ESUVUX0xJQkMiCit0aGVuCisJdHJ5X3Rscz0iIgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaWV0IGxpYmMgZG9lcyBub3Qgc3VwcG9ydCB0aHJlYWQgbG9jYWwgc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiRGlldCBsaWJjIGRvZXMgbm90IHN1cHBvcnQgdGhyZWFkIGxvY2FsIHN1cHBvcnQiID4mNjsgfQorZWxzZQorCXRyeV90bHM9InllcyIKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogVHJ5IHVzaW5nIHRocmVhZCBsb2NhbCBzdXBwb3J0IGJ5IGRlZmF1bHQiID4mNQorJGFzX2VjaG8gIlRyeSB1c2luZyB0aHJlYWQgbG9jYWwgc3VwcG9ydCBieSBkZWZhdWx0IiA+JjY7IH0KK2ZpCisKK2ZpCisKK2lmIHRlc3QgIiR0cnlfdGxzIiA9ICJ5ZXMiCit0aGVuCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykgY2xhc3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRocmVhZCBsb2NhbCBzdG9yYWdlIChUTFMpIGNsYXNzLi4uICIgPiY2OyB9CisgIGlmIHRlc3QgIiR7YWNfY3ZfdGxzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgIGF4X3Rsc19rZXl3b3Jkcz0iX190aHJlYWQgX19kZWNsc3BlYyh0aHJlYWQpIG5vbmUiCisgICAgZm9yIGF4X3Rsc19rZXl3b3JkIGluICRheF90bHNfa2V5d29yZHM7IGRvCisgICAgICAgY2FzZSAkYXhfdGxzX2tleXdvcmQgaW4KKyAgICAgICAgICBub25lKSBhY19jdl90bHM9bm9uZSA7IGJyZWFrIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgICAgICAgICAgIGZvbyh2b2lkKSB7CisgICAgICAgICAgICAgICAgIHN0YXRpYyAgJGF4X3Rsc19rZXl3b3JkICBpbnQgYmFyOworICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICB9CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Rscz0kYXhfdGxzX2tleXdvcmQgOyBicmVhaworZWxzZQorICBhY19jdl90bHM9bm9uZQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgICAgZXNhYworICAgIGRvbmUKKworZmkKKworCisgIGlmIHRlc3QgIiRhY19jdl90bHMiICE9ICJub25lIjsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFRMUyAkYWNfY3ZfdGxzCitfQUNFT0YKKworICBmaQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3RscyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3RscyIgPiY2OyB9CisKK2ZpCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdXVpZGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdXVpZGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV91dWlkZDsgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE5vdCBidWlsZGluZyB1dWlkZCIgPiY1CiskYXNfZWNobyAiTm90IGJ1aWxkaW5nIHV1aWRkIiA+JjY7IH0KKwlVVUlERF9DTVQ9IiMiCitlbHNlCisJJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1VVSUREIDEiID4+Y29uZmRlZnMuaAorCisJVVVJRERfQ01UPSIiCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEJ1aWxkaW5nIHV1aWRkIiA+JjUKKyRhc19lY2hvICJCdWlsZGluZyB1dWlkZCIgPiY2OyB9CitmaQorCitlbHNlCisgICRhc19lY2hvICIjZGVmaW5lIFVTRV9VVUlERCAxIiA+PmNvbmZkZWZzLmgKKworVVVJRERfQ01UPSIiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogQnVpbGRpbmcgdXVpZGQgYnkgZGVmYXVsdCIgPiY1CiskYXNfZWNobyAiQnVpbGRpbmcgdXVpZGQgYnkgZGVmYXVsdCIgPiY2OyB9CisKK2ZpCisKKworTUFLRUZJTEVfTElCUkFSWT0kc3JjZGlyL2xpYi9NYWtlZmlsZS5saWJyYXJ5CisKK0dFVFRFWFRfUEFDS0FHRT1lMmZzcHJvZ3MKK1BBQ0tBR0U9ZTJmc3Byb2dzCitWRVJTSU9OPSIkRTJGU1BST0dTX1ZFUlNJT04iCitWRVJTSU9OPTAuMTQuMQorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorX0FDRU9GCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KK3NldCB4ICR7TUFLRS1tYWtlfQorYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCitpZiB7IGFzX3Zhcj1hY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCitTSEVMTCA9IC9iaW4vc2gKK2FsbDoKKwlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJworX0FDRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2Nhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgorICAqQEBAJSUlPT8qPUBAQCUlJSopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKKyAgKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Citlc2FjCitybSAtZiBjb25mdGVzdC5tYWtlCitmaQoraWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgIFNFVF9NQUtFPQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorIyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZpbGVzLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCitjYXNlICRhc19kaXIvIGluICMoKAorICAuLyB8IC4vLyB8IC9bY0NdLyogfCBcCisgIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAorICA/OltcXC9db3MyW1xcL11pbnN0YWxsW1xcL10qIHwgPzpbXFwvXU9TMltcXC9dSU5TVEFMTFtcXC9dKiB8IFwKKyAgL3Vzci91Y2IvKiApIDs7CisgICopCisgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAjIGJ5IGRlZmF1bHQuCisgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisJaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKwkgICAgZWNobyBvbmUgPiBjb25mdGVzdC5vbmUKKwkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKwkgICAgbWtkaXIgY29uZnRlc3QuZGlyCisJICAgIGlmICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtYyBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvICJgcHdkYC9jb25mdGVzdC5kaXIiICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC5vbmUgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC50d28KKwkgICAgdGhlbgorCSAgICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKKwkgICAgICBicmVhayAzCisJICAgIGZpCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIDs7Citlc2FjCisKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSU5TVEFMTCIgPiY1CiskYXNfZWNobyAiJElOU1RBTEwiID4mNjsgfQorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyAgICAgICAgTUtJTlNUQUxMRElSUz0KKyAgaWYgdGVzdCAtbiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgICAgY2FzZSAiJGFjX2F1eF9kaXIiIGluCisgICAgICAvKikgTUtJTlNUQUxMRElSUz0iJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICAgICopIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9idWlsZGRpcikvJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICBlc2FjCisgIGZpCisgIGlmIHRlc3QgLXogIiRNS0lOU1RBTExESVJTIjsgdGhlbgorICAgIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMiCisgIGZpCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZC4uLiAiID4mNjsgfQorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbmxzOyBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVU0VfTkxTIiA+JjUKKyRhc19lY2hvICIkVVNFX05MUyIgPiY2OyB9CisKKworCisKKworCisjIFByZXBhcmUgUEFUSF9TRVBBUkFUT1IuCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisjIEZpbmQgb3V0IGhvdyB0byB0ZXN0IGZvciBleGVjdXRhYmxlIGZpbGVzLiBEb24ndCB1c2UgYSB6ZXJvLWJ5dGUgZmlsZSwKKyMgYXMgc3lzdGVtcyBtYXkgdXNlIG1ldGhvZHMgb3RoZXIgdGhhbiBtb2RlIGJpdHMgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFiaWxpdHkuCitjYXQgPmNvbmYkJC5maWxlIDw8X0FTRU9GCisjISAvYmluL3NoCitleGl0IDAKK19BU0VPRgorY2htb2QgK3ggY29uZiQkLmZpbGUKK2lmIHRlc3QgLXggY29uZiQkLmZpbGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAteCIKK2Vsc2UKKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorZmkKK3JtIC1mIGNvbmYkJC5maWxlCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX01TR0ZNVCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICAgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgICA7OworICAqKQorICAgIGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgICBJRlM9IiRhY19zYXZlX0lGUyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgICAgaWYgJGFjX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgICBpZiAkYWNfZGlyLyRhY193b3JkIC0tc3RhdGlzdGljcyAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tc3RhdGlzdGljcyAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKTsgdGhlbgorICAgICAgICAgICAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgICAgICAgICBicmVhayAyCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgSUZTPSIkYWNfc2F2ZV9JRlMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9IjoiCisgICAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgIiRNU0dGTVQiICE9ICI6IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1TR0ZNVCIgPiY1CiskYXNfZWNobyAiJE1TR0ZNVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0dNU0dGTVQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRHTVNHRk1UIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSRhY19jdl9wYXRoX0dNU0dGTVQKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEdNU0dGTVQiID4mNQorJGFzX2VjaG8gIiRHTVNHRk1UIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworCisjIFByZXBhcmUgUEFUSF9TRVBBUkFUT1IuCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisjIEZpbmQgb3V0IGhvdyB0byB0ZXN0IGZvciBleGVjdXRhYmxlIGZpbGVzLiBEb24ndCB1c2UgYSB6ZXJvLWJ5dGUgZmlsZSwKKyMgYXMgc3lzdGVtcyBtYXkgdXNlIG1ldGhvZHMgb3RoZXIgdGhhbiBtb2RlIGJpdHMgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFiaWxpdHkuCitjYXQgPmNvbmYkJC5maWxlIDw8X0FTRU9GCisjISAvYmluL3NoCitleGl0IDAKK19BU0VPRgorY2htb2QgK3ggY29uZiQkLmZpbGUKK2lmIHRlc3QgLXggY29uZiQkLmZpbGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAteCIKK2Vsc2UKKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorZmkKK3JtIC1mIGNvbmYkJC5maWxlCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YR0VUVEVYVCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgICA7OworICAqKQorICAgIGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgICBJRlM9IiRhY19zYXZlX0lGUyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgICAgaWYgJGFjX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgICBpZiAkYWNfZGlyLyRhY193b3JkIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAoaWYgJGFjX2Rpci8kYWNfd29yZCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICAgICAgICBhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICAgICAgICAgYnJlYWsgMgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIElGUz0iJGFjX3NhdmVfSUZTIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkWEdFVFRFWFQiID4mNQorJGFzX2VjaG8gIiRYR0VUVEVYVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICAgIHJtIC1mIG1lc3NhZ2VzLnBvCisKKworIyBQcmVwYXJlIFBBVEhfU0VQQVJBVE9SLgorIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKKworIyBGaW5kIG91dCBob3cgdG8gdGVzdCBmb3IgZXhlY3V0YWJsZSBmaWxlcy4gRG9uJ3QgdXNlIGEgemVyby1ieXRlIGZpbGUsCisjIGFzIHN5c3RlbXMgbWF5IHVzZSBtZXRob2RzIG90aGVyIHRoYW4gbW9kZSBiaXRzIHRvIGRldGVybWluZSBleGVjdXRhYmlsaXR5LgorY2F0ID5jb25mJCQuZmlsZSA8PF9BU0VPRgorIyEgL2Jpbi9zaAorZXhpdCAwCitfQVNFT0YKK2NobW9kICt4IGNvbmYkJC5maWxlCitpZiB0ZXN0IC14IGNvbmYkJC5maWxlID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19leGVjdXRhYmxlX3A9InRlc3QgLXgiCitlbHNlCisgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKK2ZpCitybSAtZiBjb25mJCQuZmlsZQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ21lcmdlIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dtZXJnZTsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTVNHTUVSR0Urc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICIkTVNHTUVSR0UiIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICAgIGFjX2N2X3BhdGhfTVNHTUVSR0U9IiRNU0dNRVJHRSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgICAgOzsKKyAgKikKKyAgICBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICAgSUZTPSIkYWNfc2F2ZV9JRlMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICAgIGlmICRhY19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgICAgICAgaWYgJGFjX2Rpci8kYWNfd29yZCAtLXVwZGF0ZSAtcSAvZGV2L251bGwgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICAgICAgYWNfY3ZfcGF0aF9NU0dNRVJHRT0iJGFjX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAgICAgICAgIGJyZWFrIDIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICBJRlM9IiRhY19zYXZlX0lGUyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHTUVSR0UiICYmIGFjX2N2X3BhdGhfTVNHTUVSR0U9IjoiCisgICAgOzsKK2VzYWMKK2ZpCitNU0dNRVJHRT0iJGFjX2N2X3BhdGhfTVNHTUVSR0UiCitpZiB0ZXN0ICIkTVNHTUVSR0UiICE9ICI6IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1TR01FUkdFIiA+JjUKKyRhc19lY2hvICIkTVNHTUVSR0UiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgICAgaWYgdGVzdCAiJEdNU0dGTVQiICE9ICI6IjsgdGhlbgorICAgICAgICAgICAgaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAoaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICA6IDsKKyAgICBlbHNlCisgICAgICBHTVNHRk1UPWBlY2hvICIkR01TR0ZNVCIgfCBzZWQgLWUgJ3MsXi4qLywsJ2AKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmb3VuZCAkR01TR0ZNVCBwcm9ncmFtIGlzIG5vdCBHTlUgbXNnZm10OyBpZ25vcmUgaXQiID4mNQorJGFzX2VjaG8gImZvdW5kICRHTVNHRk1UIHByb2dyYW0gaXMgbm90IEdOVSBtc2dmbXQ7IGlnbm9yZSBpdCIgPiY2OyB9CisgICAgICBHTVNHRk1UPSI6IgorICAgIGZpCisgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisgICAgICAgICAgICBpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC0tbXNnaWQtYnVncy1hZGRyZXNzPSAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgKGlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICA6IDsKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZm91bmQgeGdldHRleHQgcHJvZ3JhbSBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiID4mNQorJGFzX2VjaG8gImZvdW5kIHhnZXR0ZXh0IHByb2dyYW0gaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiA+JjY7IH0KKyAgICAgIFhHRVRURVhUPSI6IgorICAgIGZpCisgICAgICAgIHJtIC1mIG1lc3NhZ2VzLnBvCisgIGZpCisKKyAgYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlZmF1bHQtMSIKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQorJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCitpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCisgICAgUkFOTElCPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisgIGZpCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKworCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cmVycm9yIGluIC1sY3Bvc2l4IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJlcnJvciBpbiAtbGNwb3NpeC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfY3Bvc2l4X3N0cmVycm9yK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxjcG9zaXggICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHN0cmVycm9yICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc3RyZXJyb3IgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2Nwb3NpeF9zdHJlcnJvcj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2Nwb3NpeF9zdHJlcnJvcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3Bvc2l4X3N0cmVycm9yIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2Nwb3NpeF9zdHJlcnJvciIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jcG9zaXhfc3RyZXJyb3IiID0geCIieWVzOyB0aGVuIDoKKyAgTElCUz0iJExJQlMgLWxjcG9zaXgiCitmaQorCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2NfY29uc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworLyogRklYTUU6IEluY2x1ZGUgdGhlIGNvbW1lbnRzIHN1Z2dlc3RlZCBieSBQYXVsLiAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOworICBjb25zdCBjaGFyc2V0IGNzOworICAvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyIGNvbnN0ICpjb25zdCAqcGNwY2M7CisgIGNoYXIgKipwcGM7CisgIC8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCisgIHN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKKyAgc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisgIC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4KKyAgICAgYW4gYXJtIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudAorICAgICBleHByZXNzaW9uICovCisgIGNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKKyAgcGNwY2MgPSAmZyArIChnID8gZy1nIDogMCk7CisgIC8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisgICsrcGNwY2M7CisgIHBwYyA9IChjaGFyKiopIHBjcGNjOworICBwY3BjYyA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwcGM7CisgIHsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgICAgY2hhciAqdDsKKyAgICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICAgKnQrKyA9IDA7CisgICAgaWYgKHMpIHJldHVybiAwOworICB9CisgIHsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgICAgaW50IHhbXSA9IHsyNSwgMTd9OworICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICAgKytmb287CisgIH0KKyAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgICAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgICAgaXB0ciBwID0gMDsKKyAgICArK3A7CisgIH0KKyAgeyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICAgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgICAgc3RydWN0IHMgKmI7IGItPmogPSA1OworICB9CisgIHsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgICAgY29uc3QgaW50IGZvbyA9IDEwOworICAgIGlmICghZm9vKSByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gIWNzWzBdICYmICF6ZXJvLng7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29uc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbnN0IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBjb25zdCAvKiovIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNpZ25lZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2lnbmVkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2JoX2N2X2Nfc2lnbmVkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3NpZ25lZCBjaGFyIHg7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYmhfY3ZfY19zaWduZWQ9eWVzCitlbHNlCisgIGJoX2N2X2Nfc2lnbmVkPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRiaF9jdl9jX3NpZ25lZCIgPiY1CiskYXNfZWNobyAiJGJoX2N2X2Nfc2lnbmVkIiA+JjY7IH0KKyAgaWYgdGVzdCAkYmhfY3ZfY19zaWduZWQgPSBubzsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBzaWduZWQgLyoqLyIgPj5jb25mZGVmcy5oCisKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGludCBmb29fdDsKK3N0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KKyRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9CisjZW5kaWYKKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfaW5saW5lPSRhY19rdworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICB0ZXN0ICIkYWNfY3ZfY19pbmxpbmUiICE9IG5vICYmIGJyZWFrCitkb25lCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfaW5saW5lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19pbmxpbmUiID4mNjsgfQorCitjYXNlICRhY19jdl9jX2lubGluZSBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgICopCisgICAgY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KKyAgICAgIG5vKSBhY192YWw9OzsKKyAgICAgICopIGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7OworICAgIGVzYWMKKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIGlubGluZSAkYWNfdmFsCisjZW5kaWYKK19BQ0VPRgorICAgIDs7Citlc2FjCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgIm9mZl90IiAiYWNfY3ZfdHlwZV9vZmZfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX29mZl90IiA9IHgiInllczsgdGhlbiA6CisKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBvZmZfdCBsb25nIGludAorX0FDRU9GCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInNpemVfdCIgImFjX2N2X3R5cGVfc2l6ZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc2l6ZV90IiA9IHgiInllczsgdGhlbiA6CisKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQgaW50CitfQUNFT0YKKworZmkKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworbG9uZyBsb25nIGxsID0gMUxMOyBpbnQgaSA9IDYzOworaW50CittYWluICgpCit7Citsb25nIGxvbmcgbGxtYXggPSAobG9uZyBsb25nKSAtMTsKKyAgICAgcmV0dXJuIGxsIDw8IGkgfCBsbCA+PiBpIHwgbGxtYXggLyBsbCB8IGxsbWF4ICUgbGw7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfdHlwZV9sb25nX2xvbmc9eWVzCitlbHNlCisgIGFjX2N2X3R5cGVfbG9uZ19sb25nPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNjsgfQorICBpZiB0ZXN0ICRhY19jdl90eXBlX2xvbmdfbG9uZyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xPTkdfTE9ORyAxIiA+PmNvbmZkZWZzLmgKKworICBmaQorCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2d0X2N2X2NfbG9uZ19kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgIGd0X2N2X2NfbG9uZ19kb3VibGU9eWVzCisgICAgIGVsc2UKKyAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyAgICAgICAgIC8qIFRoZSBTdGFyZGVudCBWaXN0cmEga25vd3Mgc2l6ZW9mKGxvbmcgZG91YmxlKSwgYnV0IGRvZXMgbm90IHN1cHBvcnQgaXQuICAqLworICAgICAgICAgbG9uZyBkb3VibGUgZm9vID0gMC4wOworICAgICAgICAgLyogT24gVWx0cml4IDQuMyBjYywgbG9uZyBkb3VibGUgaXMgNCBhbmQgZG91YmxlIGlzIDguICAqLworICAgICAgICAgaW50IGFycmF5IFsyKihzaXplb2YobG9uZyBkb3VibGUpID49IHNpemVvZihkb3VibGUpKSAtIDFdOworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGd0X2N2X2NfbG9uZ19kb3VibGU9eWVzCitlbHNlCisgIGd0X2N2X2NfbG9uZ19kb3VibGU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGd0X2N2X2NfbG9uZ19kb3VibGUiID4mNQorJGFzX2VjaG8gIiRndF9jdl9jX2xvbmdfZG91YmxlIiA+JjY7IH0KKyAgaWYgdGVzdCAkZ3RfY3ZfY19sb25nX2RvdWJsZSA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xPTkdfRE9VQkxFIDEiID4+Y29uZmRlZnMuaAorCisgIGZpCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3Y2hhcl90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3Y2hhcl90Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2d0X2N2X2Nfd2NoYXJfdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyAgICAgICB3Y2hhcl90IGZvbyA9ICh3Y2hhcl90KSdcMCc7CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGd0X2N2X2Nfd2NoYXJfdD15ZXMKK2Vsc2UKKyAgZ3RfY3ZfY193Y2hhcl90PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRndF9jdl9jX3djaGFyX3QiID4mNQorJGFzX2VjaG8gIiRndF9jdl9jX3djaGFyX3QiID4mNjsgfQorICBpZiB0ZXN0ICRndF9jdl9jX3djaGFyX3QgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9XQ0hBUl9UIDEiID4+Y29uZmRlZnMuaAorCisgIGZpCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3aW50X3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdpbnRfdC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtndF9jdl9jX3dpbnRfdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx3Y2hhci5oPgorICAgICAgIHdpbnRfdCBmb28gPSAod2NoYXJfdCknXDAnOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBndF9jdl9jX3dpbnRfdD15ZXMKK2Vsc2UKKyAgZ3RfY3ZfY193aW50X3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGd0X2N2X2Nfd2ludF90IiA+JjUKKyRhc19lY2hvICIkZ3RfY3ZfY193aW50X3QiID4mNjsgfQorICBpZiB0ZXN0ICRndF9jdl9jX3dpbnRfdCA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1dJTlRfVCAxIiA+PmNvbmZkZWZzLmgKKworICBmaQorCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW50dHlwZXMuaCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50dHlwZXMuaC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHtqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgoraW50CittYWluICgpCit7Cit1aW50bWF4X3QgaSA9ICh1aW50bWF4X3QpIC0xOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oPXllcworZWxzZQorICBqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2giID4mNQorJGFzX2VjaG8gIiRqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaCIgPiY2OyB9CisgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWCAxCitfQUNFT0YKKworICBmaQorCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RkaW50LmgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludC5oLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2ptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KK2ludAorbWFpbiAoKQorewordWludG1heF90IGkgPSAodWludG1heF90KSAtMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBqbV9hY19jdl9oZWFkZXJfc3RkaW50X2g9eWVzCitlbHNlCisgIGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oIiA+JjUKKyRhc19lY2hvICIkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oIiA+JjY7IH0KKyAgaWYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggMQorX0FDRU9GCisKKyAgZmkKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbnRtYXhfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50bWF4X3QuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7Z3RfY3ZfY19pbnRtYXhfdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0hfV0lUSF9VSU5UTUFYCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK2ludG1heF90IHggPSAtMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBndF9jdl9jX2ludG1heF90PXllcworZWxzZQorICBndF9jdl9jX2ludG1heF90PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRndF9jdl9jX2ludG1heF90IiA+JjUKKyRhc19lY2hvICIkZ3RfY3ZfY19pbnRtYXhfdCIgPiY2OyB9CisgIGlmIHRlc3QgJGd0X2N2X2NfaW50bWF4X3QgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JTlRNQVhfVCAxIiA+PmNvbmZkZWZzLmgKKworICBmaQorCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcHJpbnRmKCkgc3VwcG9ydHMgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcHJpbnRmKCkgc3VwcG9ydHMgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2d0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorCisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2lmIGRlZmluZWQgX19OZXRCU0RfXyB8fCBkZWZpbmVkIF9NU0NfVkVSIHx8IGRlZmluZWQgX19NSU5HVzMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fCisgIG5vdHBvc2l4CisjZW5kaWYKKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibm90cG9zaXgiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PSJndWVzc2luZyBubyIKK2Vsc2UKKyAgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9Imd1ZXNzaW5nIHllcyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisvKiBUaGUgc3RyaW5nICIlMiRkICUxJGQiLCB3aXRoIGRvbGxhciBjaGFyYWN0ZXJzIHByb3RlY3RlZCBmcm9tIHRoZSBzaGVsbCdzCisgICBkb2xsYXIgZXhwYW5zaW9uIChwb3NzaWJseSBhbiBhdXRvY29uZiBidWcpLiAgKi8KK3N0YXRpYyBjaGFyIGZvcm1hdFtdID0geyAnJScsICcyJywgJyQnLCAnZCcsICcgJywgJyUnLCAnMScsICckJywgJ2QnLCAnXDAnIH07CitzdGF0aWMgY2hhciBidWZbMTAwXTsKK2ludCBtYWluICgpCit7CisgIHNwcmludGYgKGJ1ZiwgZm9ybWF0LCAzMywgNTUpOworICByZXR1cm4gKHN0cmNtcCAoYnVmLCAiNTUgMzMiKSAhPSAwKTsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PXllcworZWxzZQorICBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeD1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ3RfY3ZfZnVuY19wcmludGZfcG9zaXgiID4mNQorJGFzX2VjaG8gIiRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCIgPiY2OyB9CisgIGNhc2UgJGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4IGluCisgICAgKnllcykKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QT1NJWF9QUklOVEYgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgIDs7CisgIGVzYWMKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3dvcmtpbmdfYWxsb2NhX2grc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQKK21haW4gKCkKK3sKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EgKDIgKiBzaXplb2YgKGludCkpOworCQkJICBpZiAocCkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfd29ya2luZ19hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgYWNfY3Zfd29ya2luZ19hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfd29ya2luZ19hbGxvY2FfaCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl93b3JraW5nX2FsbG9jYV9oID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYWxsb2NhLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50CittYWluICgpCit7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhICgxKTsKKwkJCQkgICAgaWYgKHApIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjY7IH0KKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BTExPQ0EgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKworQUxMT0NBPVwke0xJQk9CSkRJUn1hbGxvY2EuJGFjX29iamV4dAorCiskYXNfZWNobyAiI2RlZmluZSBDX0FMTE9DQSAxIiA+PmNvbmZkZWZzLmgKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgXGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIFxgYWxsb2NhLmMnIG5lZWRzIENyYXkgaG9va3MuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfb3NfY3JheStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZiBkZWZpbmVkIENSQVkgJiYgISBkZWZpbmVkIENSQVkyCit3ZWJlY3JheQorI2Vsc2UKK3dlbm90YmVjcmF5CisjZW5kaWYKKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb3NfY3JheSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29zX2NyYXkiID4mNjsgfQoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorICBmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgICAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitldmFsIGFzX3ZhbD1cJCRhc19hY192YXIKKyAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK19BQ0VPRgorCisgICAgYnJlYWsKK2ZpCisKKyAgZG9uZQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19zdGFja19kaXJlY3Rpb24rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorCitpbnQKK21haW4gKCkKK3sKKyAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpIDwgMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+JjY7IH0KK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorX0FDRU9GCisKKworZmkKKworZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaCB1bmlzdGQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRwYWdlc2l6ZSIgImFjX2N2X2Z1bmNfZ2V0cGFnZXNpemUiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGFnZXNpemUiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKK19BQ0VPRgorCitmaQorZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisvKiBtYWxsb2MgbWlnaHQgaGF2ZSBiZWVuIHJlbmFtZWQgYXMgcnBsX21hbGxvYy4gKi8KKyN1bmRlZiBtYWxsb2MKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGUgc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wYWdhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmICFkZWZpbmVkIEhBVkVfU1RETElCX0gKK2NoYXIgKm1hbGxvYyAoKTsKKyNlbmRpZgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCitpbnQKK21haW4gKCkKK3sKKyAgY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisgIGludCBpLCBwYWdlc2l6ZTsKKyAgaW50IGZkOworCisgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7CisKKyAgLyogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LiAqLworICBkYXRhID0gKGNoYXIgKikgbWFsbG9jIChwYWdlc2l6ZSk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gMTsKKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgKihkYXRhICsgaSkgPSByYW5kICgpOworICB1bWFzayAoMCk7CisgIGZkID0gY3JlYXQgKCJjb25mdGVzdC5tbWFwIiwgMDYwMCk7CisgIGlmIChmZCA8IDApCisgICAgcmV0dXJuIDE7CisgIGlmICh3cml0ZSAoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKyAgICByZXR1cm4gMTsKKyAgY2xvc2UgKGZkKTsKKworICAvKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2ggYWxyZWFkeSBoYXMKKyAgICAgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLCBhbHNvIG1ha2Ugc3VyZSB0aGF0CisgICAgIHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLiAgKi8KKyAgZmQgPSBvcGVuICgiY29uZnRlc3QubW1hcCIsIE9fUkRXUik7CisgIGlmIChmZCA8IDApCisgICAgcmV0dXJuIDE7CisgIGRhdGEyID0gKGNoYXIgKikgbWFsbG9jICgyICogcGFnZXNpemUpOworICBpZiAoIWRhdGEyKQorICAgIHJldHVybiAxOworICBkYXRhMiArPSAocGFnZXNpemUgLSAoKGxvbmcgaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKyAgaWYgKGRhdGEyICE9IG1tYXAgKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKyAgICByZXR1cm4gMTsKKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKyAgICAgIHJldHVybiAxOworCisgIC8qIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhIGRvIG5vdAorICAgICBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4gIChUaGlzIGlzIGEgYnVnIG9uCisgICAgIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKSAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKyAgZGF0YTMgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKKyAgaWYgKCFkYXRhMykKKyAgICByZXR1cm4gMTsKKyAgaWYgKHJlYWQgKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorICAgIHJldHVybiAxOworICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKyAgICBpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorICAgICAgcmV0dXJuIDE7CisgIGNsb3NlIChmZCk7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NTUFQIDEiID4+Y29uZmRlZnMuaAorCitmaQorcm0gLWYgY29uZnRlc3QubW1hcAorCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5IDIuMSBvciBuZXdlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSAyLjEgb3IgbmV3ZXIuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfZ251X2xpYnJhcnlfMl8xK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKyAjaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAxKSB8fCAoX19HTElCQ19fID4gMikKKyAgTHVja3kgR05VIHVzZXIKKyAjZW5kaWYKKyNlbmRpZgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJMdWNreSBHTlUgdXNlciIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgYWNfY3ZfZ251X2xpYnJhcnlfMl8xPXllcworZWxzZQorICBhY19jdl9nbnVfbGlicmFyeV8yXzE9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIgPiY2OyB9CisKKyAgICBHTElCQzIxPSIkYWNfY3ZfZ251X2xpYnJhcnlfMl8xIgorCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIFNJR0ZQRSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgU0lHRlBFLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2d0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorCisgICAgICAgICAgIyBHdWVzcyBiYXNlZCBvbiB0aGUgQ1BVLgorICAgICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgICAgIGFscGhhKiB8IGkzNDU2Nzg2IHwgbTY4ayB8IHMzOTAqKQorICAgICAgICAgICAgICBndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZT0iZ3Vlc3NpbmcgeWVzIjs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICBndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZT0iZ3Vlc3Npbmcgbm8iOzsKKyAgICAgICAgICBlc2FjCisKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkCisjaWZkZWYgX19jcGx1c3BsdXMKK3NpZ2ZwZV9oYW5kbGVyIChpbnQgc2lnKQorI2Vsc2UKK3NpZ2ZwZV9oYW5kbGVyIChzaWcpIGludCBzaWc7CisjZW5kaWYKK3sKKyAgLyogRXhpdCB3aXRoIGNvZGUgMCBpZiBTSUdGUEUsIHdpdGggY29kZSAxIGlmIGFueSBvdGhlciBzaWduYWwuICAqLworICBleGl0IChzaWcgIT0gU0lHRlBFKTsKK30KKworaW50IHggPSAxOworaW50IHkgPSAwOworaW50IHo7CitpbnQgbmFuOworCitpbnQgbWFpbiAoKQoreworICBzaWduYWwgKFNJR0ZQRSwgc2lnZnBlX2hhbmRsZXIpOworLyogSVJJWCBhbmQgQUlYICh3aGVuICJ4bGMgLXFjaGVjayIgaXMgdXNlZCkgeWllbGQgc2lnbmFsIFNJR1RSQVAuICAqLworI2lmIChkZWZpbmVkIChfX3NnaSkgfHwgZGVmaW5lZCAoX0FJWCkpICYmIGRlZmluZWQgKFNJR1RSQVApCisgIHNpZ25hbCAoU0lHVFJBUCwgc2lnZnBlX2hhbmRsZXIpOworI2VuZGlmCisvKiBMaW51eC9TUEFSQyB5aWVsZHMgc2lnbmFsIFNJR0lMTC4gICovCisjaWYgZGVmaW5lZCAoX19zcGFyY19fKSAmJiBkZWZpbmVkIChfX2xpbnV4X18pCisgIHNpZ25hbCAoU0lHSUxMLCBzaWdmcGVfaGFuZGxlcik7CisjZW5kaWYKKworICB6ID0geCAvIHk7CisgIG5hbiA9IHkgLyB5OworICBleGl0ICgxKTsKK30KKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9eWVzCitlbHNlCisgIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZSIgPiY1CiskYXNfZWNobyAiJGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlIiA+JjY7IH0KKyAgY2FzZSAiJGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlIiBpbgorICAgICp5ZXMpIHZhbHVlPTE7OworICAgICopIHZhbHVlPTA7OworICBlc2FjCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFICR2YWx1ZQorX0FDRU9GCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHVuc2lnbmVkIGxvbmcgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgdW5zaWduZWQgbG9uZyBsb25nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLwordW5zaWduZWQgbG9uZyBsb25nIHVsbCA9IDFVTEw7IGludCBpID0gNjM7CitpbnQKK21haW4gKCkKK3sKK3Vuc2lnbmVkIGxvbmcgbG9uZyB1bGxtYXggPSAodW5zaWduZWQgbG9uZyBsb25nKSAtMTsKKyAgICAgcmV0dXJuIHVsbCA8PCBpIHwgdWxsID4+IGkgfCB1bGxtYXggLyB1bGwgfCB1bGxtYXggJSB1bGw7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmc9eWVzCitlbHNlCisgIGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmciID4mNjsgfQorICBpZiB0ZXN0ICRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1VOU0lHTkVEX0xPTkdfTE9ORyAxIiA+PmNvbmZkZWZzLmgKKworICBmaQorCisKKworCisgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oID0gbm8gJiYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oID0gbm87IHRoZW4KKworICAgIHRlc3QgJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nID0geWVzIFwKKyAgICAgICYmIGFjX3R5cGU9J3Vuc2lnbmVkIGxvbmcgbG9uZycgXAorICAgICAgfHwgYWNfdHlwZT0ndW5zaWduZWQgbG9uZycKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSB1aW50bWF4X3QgJGFjX3R5cGUKK19BQ0VPRgorCisgIGVsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VSU5UTUFYX1QgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGludHR5cGVzLmgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludHR5cGVzLmguLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7Z3RfY3ZfaGVhZGVyX2ludHR5cGVzX2grc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGd0X2N2X2hlYWRlcl9pbnR0eXBlc19oPXllcworZWxzZQorICBndF9jdl9oZWFkZXJfaW50dHlwZXNfaD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRndF9jdl9oZWFkZXJfaW50dHlwZXNfaCIgPiY1CiskYXNfZWNobyAiJGd0X2N2X2hlYWRlcl9pbnR0eXBlc19oIiA+JjY7IH0KKyAgaWYgdGVzdCAkZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorX0FDRU9GCisKKyAgZmkKKworCisKKyAgaWYgdGVzdCAkZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIGludHR5cGVzLmggUFJJeE5OIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGludHR5cGVzLmggUFJJeE5OIG1hY3JvcyBhcmUgYnJva2VuLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2d0X2N2X2ludHR5cGVzX3ByaV9icm9rZW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2lmZGVmIFBSSWQzMgorY2hhciAqcCA9IFBSSWQzMjsKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGd0X2N2X2ludHR5cGVzX3ByaV9icm9rZW49bm8KK2Vsc2UKKyAgZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbj15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbiIgPiY1CiskYXNfZWNobyAiJGd0X2N2X2ludHR5cGVzX3ByaV9icm9rZW4iID4mNjsgfQorICBmaQorICBpZiB0ZXN0ICIkZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbiIgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQUklfTUFDUk9TX0JST0tFTiAxCitfQUNFT0YKKworICBmaQorCisKKyAgZm9yIGFjX2hlYWRlciBpbiBzdGRpbnQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3RkaW50LmgiICJhY19jdl9oZWFkZXJfc3RkaW50X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N0ZGludF9oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU0laRV9NQVgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNJWkVfTUFYLi4uICIgPiY2OyB9CisgIHJlc3VsdD0KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgU0laRV9NQVgKK0ZvdW5kIGl0CisjZW5kaWYKKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAiRm91bmQgaXQiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIHJlc3VsdD15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKKworICBpZiB0ZXN0IC16ICIkcmVzdWx0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAifihzaXplX3QpMCAvIDEwIiAicmVzX2hpIiAgICAgICAgIiNpbmNsdWRlIDxzdGRkZWYuaD4iOyB0aGVuIDoKKworZWxzZQorICByZXN1bHQ9PworZmkKKworCisgICAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIn4oc2l6ZV90KTAgJSAxMCIgInJlc19sbyIgICAgICAgICIjaW5jbHVkZSA8c3RkZGVmLmg+IjsgdGhlbiA6CisKK2Vsc2UKKyAgcmVzdWx0PT8KK2ZpCisKKworICAgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICJzaXplb2YgKHNpemVfdCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpIiAiZml0c19pbl91aW50IiAgICAgICAgIiNpbmNsdWRlIDxzdGRkZWYuaD4iOyB0aGVuIDoKKworZWxzZQorICByZXN1bHQ9PworZmkKKworCisgICAgaWYgdGVzdCAiJGZpdHNfaW5fdWludCIgPSAxOyB0aGVuCisgICAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisgICAgICAgIGV4dGVybiBzaXplX3QgZm9vOworICAgICAgICBleHRlcm4gdW5zaWduZWQgbG9uZyBmb287CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZml0c19pbl91aW50PTAKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBmaQorICAgIGlmIHRlc3QgLXogIiRyZXN1bHQiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZml0c19pbl91aW50IiA9IDE7IHRoZW4KKyAgICAgICAgcmVzdWx0PSIkcmVzX2hpJHJlc19sbyJVCisgICAgICBlbHNlCisgICAgICAgIHJlc3VsdD0iJHJlc19oaSRyZXNfbG8iVUwKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0PSd+KHNpemVfdCkwJworICAgIGZpCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkcmVzdWx0IiA+JjY7IH0KKyAgaWYgdGVzdCAiJHJlc3VsdCIgIT0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRV9NQVggJHJlc3VsdAorX0FDRU9GCisKKyAgZmkKKworCisKKyAgZm9yIGFjX2hlYWRlciBpbiBzdGRpbnQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3RkaW50LmgiICJhY19jdl9oZWFkZXJfc3RkaW50X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N0ZGludF9oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKworICAgICAgaWYgdGVzdCAiWCRwcmVmaXgiID0gIlhOT05FIjsgdGhlbgorICAgIGFjbF9maW5hbF9wcmVmaXg9IiRhY19kZWZhdWx0X3ByZWZpeCIKKyAgZWxzZQorICAgIGFjbF9maW5hbF9wcmVmaXg9IiRwcmVmaXgiCisgIGZpCisgIGlmIHRlc3QgIlgkZXhlY19wcmVmaXgiID0gIlhOT05FIjsgdGhlbgorICAgIGFjbF9maW5hbF9leGVjX3ByZWZpeD0nJHtwcmVmaXh9JworICBlbHNlCisgICAgYWNsX2ZpbmFsX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGZpCisgIGFjbF9zYXZlX3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgZXZhbCBhY2xfZmluYWxfZXhlY19wcmVmaXg9XCIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4XCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCisjIFByZXBhcmUgUEFUSF9TRVBBUkFUT1IuCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQy4uLiAiID4mNjsgfQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9CitmaQoraWYgdGVzdCAiJHthY2xfY3ZfcGF0aF9MRCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgYWNsX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkYWNsX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrIDs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNsX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRhY2xfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1CiskYXNfZWNobyAiJExEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQordGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjbF9jdl9wcm9nX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGFjbF9jdl9wcm9nX2dudV9sZD15ZXMgOzsKKyopCisgIGFjbF9jdl9wcm9nX2dudV9sZD1ubyA7OworZXNhYworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNsX2N2X3Byb2dfZ251X2xkIiA+JjUKKyRhc19lY2hvICIkYWNsX2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KK3dpdGhfZ251X2xkPSRhY2xfY3ZfcHJvZ19nbnVfbGQKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHJ1biBwYXRoIG9yaWdpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hhcmVkIGxpYnJhcnkgcnVuIHBhdGggb3JpZ2luLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjbF9jdl9ycGF0aCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICBDQz0iJENDIiBHQ0M9IiRHQ0MiIExERkxBR1M9IiRMREZMQUdTIiBMRD0iJExEIiB3aXRoX2dudV9sZD0iJHdpdGhfZ251X2xkIiBcCisgICAgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gIiRhY19hdXhfZGlyL2NvbmZpZy5ycGF0aCIgIiRob3N0IiA+IGNvbmZ0ZXN0LnNoCisgICAgLiAuL2NvbmZ0ZXN0LnNoCisgICAgcm0gLWYgLi9jb25mdGVzdC5zaAorICAgIGFjbF9jdl9ycGF0aD1kb25lCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjbF9jdl9ycGF0aCIgPiY1CiskYXNfZWNobyAiJGFjbF9jdl9ycGF0aCIgPiY2OyB9CisgIHdsPSIkYWNsX2N2X3dsIgorICBsaWJleHQ9IiRhY2xfY3ZfbGliZXh0IgorICBzaGxpYmV4dD0iJGFjbF9jdl9zaGxpYmV4dCIKKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGFjbF9jdl9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIkYWNsX2N2X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiCisgIGhhcmRjb2RlX2RpcmVjdD0iJGFjbF9jdl9oYXJkY29kZV9kaXJlY3QiCisgIGhhcmRjb2RlX21pbnVzX0w9IiRhY2xfY3ZfaGFyZGNvZGVfbWludXNfTCIKKyAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcnBhdGggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9ycGF0aDsgOgorZWxzZQorICBlbmFibGVfcnBhdGg9eWVzCitmaQorCisKKworCisKKworCisKKyAgICB1c2VfYWRkaXRpb25hbD15ZXMKKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorCisgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxpYmljb252LXByZWZpeCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbGliaWNvbnZfcHJlZml4K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9saWJpY29udl9wcmVmaXg7CisgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25hbD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgZWxzZQorICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9IiR3aXRodmFsL2luY2x1ZGUiCisgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPSIkd2l0aHZhbC9saWIiCisgICAgICBmaQorICAgIGZpCisKK2ZpCisKKyAgICAgIExJQklDT05WPQorICBMVExJQklDT05WPQorICBJTkNJQ09OVj0KKyAgcnBhdGhkaXJzPQorICBsdHJwYXRoZGlycz0KKyAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPQorICBuYW1lc19uZXh0X3JvdW5kPSdpY29udiAnCisgIHdoaWxlIHRlc3QgLW4gIiRuYW1lc19uZXh0X3JvdW5kIjsgZG8KKyAgICBuYW1lc190aGlzX3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCIKKyAgICBuYW1lc19uZXh0X3JvdW5kPQorICAgIGZvciBuYW1lIGluICRuYW1lc190aGlzX3JvdW5kOyBkbworICAgICAgYWxyZWFkeV9oYW5kbGVkPQorICAgICAgZm9yIG4gaW4gJG5hbWVzX2FscmVhZHlfaGFuZGxlZDsgZG8KKyAgICAgICAgaWYgdGVzdCAiJG4iID0gIiRuYW1lIjsgdGhlbgorICAgICAgICAgIGFscmVhZHlfaGFuZGxlZD15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCAteiAiJGFscmVhZHlfaGFuZGxlZCI7IHRoZW4KKyAgICAgICAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPSIkbmFtZXNfYWxyZWFkeV9oYW5kbGVkICRuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJuYW1lPWBlY2hvICIkbmFtZSIgfCBzZWQgLWUgJ3l8YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy18QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX198J2AKKyAgICAgICAgZXZhbCB2YWx1ZT1cIlwkSEFWRV9MSUIkdXBwZXJuYW1lXCIKKyAgICAgICAgaWYgdGVzdCAtbiAiJHZhbHVlIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIiR2YWx1ZSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgIGV2YWwgdmFsdWU9XCJcJExJQiR1cHBlcm5hbWVcIgorICAgICAgICAgICAgdGVzdCAteiAiJHZhbHVlIiB8fCBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSR2YWx1ZSIKKyAgICAgICAgICAgIGV2YWwgdmFsdWU9XCJcJExUTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16ICIkdmFsdWUiIHx8IExUTElCSUNPTlY9IiR7TFRMSUJJQ09OVn0ke0xUTElCSUNPTlY6KyB9JHZhbHVlIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9kaXI9CisgICAgICAgICAgZm91bmRfbGE9CisgICAgICAgICAgZm91bmRfc289CisgICAgICAgICAgZm91bmRfYT0KKyAgICAgICAgICBpZiB0ZXN0ICR1c2VfYWRkaXRpb25hbCA9IHllczsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgZm91bmRfc289IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kc2hsaWJleHQiCisgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgICBmb3VuZF9hPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiID0gIlgiOyB0aGVuCisgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTFRMSUJJQ09OVjsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICBjYXNlICIkeCIgaW4KKyAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkeCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYmV4dCIgJiYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS4kc2hsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfc289IiRkaXIvbGliJG5hbWUuJHNobGliZXh0IgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgTFRMSUJJQ09OVj0iJHtMVExJQklDT05WfSR7TFRMSUJJQ09OVjorIH0tTCRmb3VuZF9kaXIgLWwkbmFtZSIKKyAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfc28iICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3JwYXRoIiA9IG5vIHx8IHRlc3QgIlgkZm91bmRfZGlyIiA9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBmb3IgeCBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgbHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZm91bmRfZGlyIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgJiYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBycGF0aGRpcnM9IiRycGF0aGRpcnMgJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCSUNPTlY7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfS1MJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSUNPTlY9IiR7TElCSUNPTlZ9JHtMSUJJQ09OVjorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSUNPTlY9IiR7TElCSUNPTlZ9JHtMSUJJQ09OVjorIH0tbCRuYW1lIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2EiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmb3VuZF9hIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0KKyAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9kaXIiIGluCisgICAgICAgICAgICAgICovbGliIHwgKi9saWIvKQorICAgICAgICAgICAgICAgIGJhc2VkaXI9YGVjaG8gIlgkZm91bmRfZGlyIiB8IHNlZCAtZSAncyxeWCwsJyAtZSAncywvbGliLyokLCwnYAorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJGJhc2VkaXIvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiAhPSAiWC91c3IvaW5jbHVkZSI7IHRoZW4KKyAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiID0gIlgvdXNyL2xvY2FsL2luY2x1ZGUiOyB0aGVuCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkQ1BQRkxBR1MgJElOQ0lDT05WOyBkbworCisgIGFjbF9zYXZlX3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3NhdmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxfZXhlY19wcmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0lDT05WPSIke0lOQ0lDT05WfSR7SU5DSUNPTlY6KyB9LUkkYWRkaXRpb25hbF9pbmNsdWRlZGlyIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmb3VuZF9sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisgICAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9sYSIgaW4KKyAgICAgICAgICAgICAgICAqLyogfCAqXFwqKSAuICIkZm91bmRfbGEiIDs7CisgICAgICAgICAgICAgICAgKikgLiAiLi8kZm91bmRfbGEiIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgbGliZGlyPSIkc2F2ZV9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworICAgICAgICAgICAgICAgIGNhc2UgIiRkZXAiIGluCisgICAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPWBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiAhPSAiWC91c3IvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiA9ICJYL3Vzci9sb2NhbC9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCSUNPTlY7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCSUNPTlY7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUTElCSUNPTlY9IiR7TFRMSUJJQ09OVn0ke0xUTElCSUNPTlY6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAtUiopCisgICAgICAgICAgICAgICAgICAgIGRpcj1gZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLVIvLydgCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRlbmFibGVfcnBhdGgiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBycGF0aGRpcnM9IiRycGF0aGRpcnMgJGRpciIKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRsdHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBsdHJwYXRoZGlycz0iJGx0cnBhdGhkaXJzICRkaXIiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgIC1sKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19uZXh0X3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCAiYGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1sLy8nYAorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgKi5sYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MsXlguKi8sLCcgLWUgJ3MsXmxpYiwsJyAtZSAncyxcLmxhJCwsJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSUNPTlY9IiR7TElCSUNPTlZ9JHtMSUJJQ09OVjorIH0kZGVwIgorICAgICAgICAgICAgICAgICAgICBMVExJQklDT05WPSIke0xUTElCSUNPTlZ9JHtMVExJQklDT05WOisgfSRkZXAiCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9LWwkbmFtZSIKKyAgICAgICAgICAgIExUTElCSUNPTlY9IiR7TFRMSUJJQ09OVn0ke0xUTElCSUNPTlY6KyB9LWwkbmFtZSIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKKyAgaWYgdGVzdCAiWCRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsZGlycz0KKyAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgYWxsZGlycz0iJHthbGxkaXJzfSR7YWxsZGlyczorJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3J9JGZvdW5kX2RpciIKKyAgICAgIGRvbmUKKyAgICAgICAgICAgIGFjbF9zYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgIGxpYmRpcj0iJGFsbGRpcnMiCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmbGFnIgorICAgIGVsc2UKKyAgICAgICAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgYWNsX3NhdmVfbGliZGlyPSIkbGliZGlyIgorICAgICAgICBsaWJkaXI9IiRmb3VuZF9kaXIiCisgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgICAgbGliZGlyPSIkYWNsX3NhdmVfbGliZGlyIgorICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmbGFnIgorICAgICAgZG9uZQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIlgkbHRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgZm9yIGZvdW5kX2RpciBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICBMVExJQklDT05WPSIke0xUTElCSUNPTlZ9JHtMVExJQklDT05WOisgfS1SJGZvdW5kX2RpciIKKyAgICBkb25lCisgIGZpCisKKworCisKKworCisKKworICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJwdHJkaWZmX3QiICJhY19jdl90eXBlX3B0cmRpZmZfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3B0cmRpZmZfdCIgPSB4IiJ5ZXM7IHRoZW4gOgorCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIHB0cmRpZmZfdCBsb25nIiA+PmNvbmZkZWZzLmgKKworCitmaQorCisgIGZvciBhY19oZWFkZXIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RkZGVmLmggXAorc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3lzL3BhcmFtLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitldmFsIGFzX3ZhbD1cJCRhc19hY19IZWFkZXIKKyAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworICBmb3IgYWNfZnVuYyBpbiBhc3ByaW50ZiBmd3ByaW50ZiBnZXRjd2QgZ2V0ZWdpZCBnZXRldWlkIGdldGdpZCBnZXR1aWQgXAorbWVtcGNweSBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc25wcmludGYgc3RwY3B5IHN0cmNhc2VjbXAgc3RyZHVwIFwKK3N0cnRvdWwgdHNlYXJjaCB3Y3NsZW4gX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQgXAorX19mc2V0bG9ja2luZworZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX3ZhcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBfc25wcmludGYgaXMgZGVjbGFyZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBfc25wcmludGYgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9kZWNsX19zbnByaW50ZitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyNpZm5kZWYgX3NucHJpbnRmCisgIGNoYXIgKnAgPSAoY2hhciAqKSBfc25wcmludGY7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hhdmVfZGVjbF9fc25wcmludGY9eWVzCitlbHNlCisgIGFjX2N2X2hhdmVfZGVjbF9fc25wcmludGY9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfZGVjbF9fc25wcmludGYiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX2RlY2xfX3NucHJpbnRmIiA+JjY7IH0KKyAgaWYgdGVzdCAkYWNfY3ZfaGF2ZV9kZWNsX19zbnByaW50ZiA9IHllczsgdGhlbgorICAgIGd0X3ZhbHVlPTEKKyAgZWxzZQorICAgIGd0X3ZhbHVlPTAKKyAgZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfX1NOUFJJTlRGICRndF92YWx1ZQorX0FDRU9GCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBfc253cHJpbnRmIGlzIGRlY2xhcmVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgX3Nud3ByaW50ZiBpcyBkZWNsYXJlZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfX3Nud3ByaW50ZitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyNpZm5kZWYgX3Nud3ByaW50ZgorICBjaGFyICpwID0gKGNoYXIgKikgX3Nud3ByaW50ZjsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGF2ZV9kZWNsX19zbndwcmludGY9eWVzCitlbHNlCisgIGFjX2N2X2hhdmVfZGVjbF9fc253cHJpbnRmPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX2RlY2xfX3Nud3ByaW50ZiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfZGVjbF9fc253cHJpbnRmIiA+JjY7IH0KKyAgaWYgdGVzdCAkYWNfY3ZfaGF2ZV9kZWNsX19zbndwcmludGYgPSB5ZXM7IHRoZW4KKyAgICBndF92YWx1ZT0xCisgIGVsc2UKKyAgICBndF92YWx1ZT0wCisgIGZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX19TTldQUklOVEYgJGd0X3ZhbHVlCitfQUNFT0YKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgZmVvZl91bmxvY2tlZCBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGZlb2ZfdW5sb2NrZWQgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9kZWNsX2Zlb2ZfdW5sb2NrZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisjaWZuZGVmIGZlb2ZfdW5sb2NrZWQKKyAgY2hhciAqcCA9IChjaGFyICopIGZlb2ZfdW5sb2NrZWQ7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hhdmVfZGVjbF9mZW9mX3VubG9ja2VkPXllcworZWxzZQorICBhY19jdl9oYXZlX2RlY2xfZmVvZl91bmxvY2tlZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2Zlb2ZfdW5sb2NrZWQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX2RlY2xfZmVvZl91bmxvY2tlZCIgPiY2OyB9CisgIGlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9mZW9mX3VubG9ja2VkID0geWVzOyB0aGVuCisgICAgZ3RfdmFsdWU9MQorICBlbHNlCisgICAgZ3RfdmFsdWU9MAorICBmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9GRU9GX1VOTE9DS0VEICRndF92YWx1ZQorX0FDRU9GCisKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBmZ2V0c191bmxvY2tlZCBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGZnZXRzX3VubG9ja2VkIGlzIGRlY2xhcmVkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hhdmVfZGVjbF9mZ2V0c191bmxvY2tlZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyNpZm5kZWYgZmdldHNfdW5sb2NrZWQKKyAgY2hhciAqcCA9IChjaGFyICopIGZnZXRzX3VubG9ja2VkOworI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9oYXZlX2RlY2xfZmdldHNfdW5sb2NrZWQ9eWVzCitlbHNlCisgIGFjX2N2X2hhdmVfZGVjbF9mZ2V0c191bmxvY2tlZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2ZnZXRzX3VubG9ja2VkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9kZWNsX2ZnZXRzX3VubG9ja2VkIiA+JjY7IH0KKyAgaWYgdGVzdCAkYWNfY3ZfaGF2ZV9kZWNsX2ZnZXRzX3VubG9ja2VkID0geWVzOyB0aGVuCisgICAgZ3RfdmFsdWU9MQorICBlbHNlCisgICAgZ3RfdmFsdWU9MAorICBmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9GR0VUU19VTkxPQ0tFRCAkZ3RfdmFsdWUKK19BQ0VPRgorCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgZ2V0Y191bmxvY2tlZCBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGdldGNfdW5sb2NrZWQgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9kZWNsX2dldGNfdW5sb2NrZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisjaWZuZGVmIGdldGNfdW5sb2NrZWQKKyAgY2hhciAqcCA9IChjaGFyICopIGdldGNfdW5sb2NrZWQ7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hhdmVfZGVjbF9nZXRjX3VubG9ja2VkPXllcworZWxzZQorICBhY19jdl9oYXZlX2RlY2xfZ2V0Y191bmxvY2tlZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2dldGNfdW5sb2NrZWQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX2RlY2xfZ2V0Y191bmxvY2tlZCIgPiY2OyB9CisgIGlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9nZXRjX3VubG9ja2VkID0geWVzOyB0aGVuCisgICAgZ3RfdmFsdWU9MQorICBlbHNlCisgICAgZ3RfdmFsdWU9MAorICBmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9HRVRDX1VOTE9DS0VEICRndF92YWx1ZQorX0FDRU9GCisKKworCisgIGNhc2UgJGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4IGluCisgICAgKnllcykgSEFWRV9QT1NJWF9QUklOVEY9MSA7OworICAgICopIEhBVkVfUE9TSVhfUFJJTlRGPTAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIiRhY19jdl9mdW5jX2FzcHJpbnRmIiA9IHllczsgdGhlbgorICAgIEhBVkVfQVNQUklOVEY9MQorICBlbHNlCisgICAgSEFWRV9BU1BSSU5URj0wCisgIGZpCisKKyAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfc25wcmludGYiID0geWVzOyB0aGVuCisgICAgSEFWRV9TTlBSSU5URj0xCisgIGVsc2UKKyAgICBIQVZFX1NOUFJJTlRGPTAKKyAgZmkKKworICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY193cHJpbnRmIiA9IHllczsgdGhlbgorICAgIEhBVkVfV1BSSU5URj0xCisgIGVsc2UKKyAgICBIQVZFX1dQUklOVEY9MAorICBmaQorCisKKworCisKKworCisgICAgICAgICAgYW1fc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorCisgIGZvciBlbGVtZW50IGluICRJTkNJQ09OVjsgZG8KKyAgICBoYXZlaXQ9CisgICAgZm9yIHggaW4gJENQUEZMQUdTOyBkbworCisgIGFjbF9zYXZlX3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3NhdmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxfZXhlY19wcmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZWxlbWVudCI7IHRoZW4KKyAgICAgICAgaGF2ZWl0PXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgIENQUEZMQUdTPSIke0NQUEZMQUdTfSR7Q1BQRkxBR1M6KyB9JGVsZW1lbnQiCisgICAgZmkKKyAgZG9uZQorCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaWNvbnYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGljb252Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FtX2N2X2Z1bmNfaWNvbnYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgICAgYW1fY3ZfZnVuY19pY29udj0ibm8sIGNvbnNpZGVyIGluc3RhbGxpbmcgR05VIGxpYmljb252IgorICAgIGFtX2N2X2xpYl9pY29udj1ubworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpY29udi5oPgoraW50CittYWluICgpCit7CitpY29udl90IGNkID0gaWNvbnZfb3BlbigiIiwiIik7CisgICAgICAgaWNvbnYoY2QsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgaWNvbnZfY2xvc2UoY2QpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFtX2N2X2Z1bmNfaWNvbnY9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgIT0geWVzOyB0aGVuCisgICAgICBhbV9zYXZlX0xJQlM9IiRMSUJTIgorICAgICAgTElCUz0iJExJQlMgJExJQklDT05WIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+CitpbnQKK21haW4gKCkKK3sKK2ljb252X3QgY2QgPSBpY29udl9vcGVuKCIiLCIiKTsKKyAgICAgICAgIGljb252KGNkLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgaWNvbnZfY2xvc2UoY2QpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFtX2N2X2xpYl9pY29udj15ZXMKKyAgICAgICAgYW1fY3ZfZnVuY19pY29udj15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgTElCUz0iJGFtX3NhdmVfTElCUyIKKyAgICBmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9mdW5jX2ljb252IiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfZnVuY19pY29udiIgPiY2OyB9CisgIGlmIHRlc3QgIiRhbV9jdl9mdW5jX2ljb252IiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0lDT05WIDEiID4+Y29uZmRlZnMuaAorCisgIGZpCisgIGlmIHRlc3QgIiRhbV9jdl9saWJfaWNvbnYiID0geWVzOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gbGluayB3aXRoIGxpYmljb252IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBsaW5rIHdpdGggbGliaWNvbnYuLi4gIiA+JjY7IH0KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExJQklDT05WIiA+JjUKKyRhc19lY2hvICIkTElCSUNPTlYiID4mNjsgfQorICBlbHNlCisgICAgICAgICAgICBDUFBGTEFHUz0iJGFtX3NhdmVfQ1BQRkxBR1MiCisgICAgTElCSUNPTlY9CisgICAgTFRMSUJJQ09OVj0KKyAgZmkKKworCisKKyAgaWYgdGVzdCAiJGFtX2N2X2Z1bmNfaWNvbnYiID0geWVzOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaWNvbnYgZGVjbGFyYXRpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGljb252IGRlY2xhcmF0aW9uLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAiJHthbV9jdl9wcm90b19pY29uditzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+CitleHRlcm4KKyNpZmRlZiBfX2NwbHVzcGx1cworIkMiCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorc2l6ZV90IGljb252IChpY29udl90IGNkLCBjaGFyICogKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICogKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOworI2Vsc2UKK3NpemVfdCBpY29udigpOworI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYW1fY3ZfcHJvdG9faWNvbnZfYXJnMT0iIgorZWxzZQorICBhbV9jdl9wcm90b19pY29udl9hcmcxPSJjb25zdCIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgIGFtX2N2X3Byb3RvX2ljb252PSJleHRlcm4gc2l6ZV90IGljb252IChpY29udl90IGNkLCAkYW1fY3ZfcHJvdG9faWNvbnZfYXJnMSBjaGFyICogKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICogKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOyIKK2ZpCisKKyAgICBhbV9jdl9wcm90b19pY29udj1gZWNobyAiJGFtX2N2X3Byb3RvX2ljb252IiB8IHRyIC1zICcgJyB8IHNlZCAtZSAncy8oIC8oLydgCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7YWNfdDotCisgICAgICAgICB9JGFtX2N2X3Byb3RvX2ljb252IiA+JjUKKyRhc19lY2hvICIke2FjX3Q6LQorICAgICAgICAgfSRhbV9jdl9wcm90b19pY29udiIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSUNPTlZfQ09OU1QgJGFtX2N2X3Byb3RvX2ljb252X2FyZzEKK19BQ0VPRgorCisgIGZpCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBubF9sYW5naW5mbyBhbmQgQ09ERVNFVCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8gYW5kIENPREVTRVQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YW1fY3ZfbGFuZ2luZm9fY29kZXNldCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsYW5naW5mby5oPgoraW50CittYWluICgpCit7CitjaGFyKiBjcyA9IG5sX2xhbmdpbmZvKENPREVTRVQpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQ9eWVzCitlbHNlCisgIGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9sYW5naW5mb19jb2Rlc2V0IiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfbGFuZ2luZm9fY29kZXNldCIgPiY2OyB9CisgIGlmIHRlc3QgJGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MQU5HSU5GT19DT0RFU0VUIDEiID4+Y29uZmRlZnMuaAorCisgIGZpCisKKyAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FtX2N2X3ZhbF9MQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludAorbWFpbiAoKQoreworcmV0dXJuIExDX01FU1NBR0VTCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcworZWxzZQorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiA+JjY7IH0KKyAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKKworICBmaQorCisgICAgICAgICAgICAgICAgICAgICAgZm9yIGFjX3Byb2cgaW4gYmlzb24KK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19JTlRMQklTT04rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkSU5UTEJJU09OIjsgdGhlbgorICBhY19jdl9wcm9nX0lOVExCSVNPTj0iJElOVExCSVNPTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0lOVExCSVNPTj0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorSU5UTEJJU09OPSRhY19jdl9wcm9nX0lOVExCSVNPTgoraWYgdGVzdCAtbiAiJElOVExCSVNPTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlRMQklTT04iID4mNQorJGFzX2VjaG8gIiRJTlRMQklTT04iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkSU5UTEJJU09OIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgLXogIiRJTlRMQklTT04iOyB0aGVuCisgICAgYWNfdmVyY19mYWlsPXllcworICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdmVyc2lvbiBvZiBiaXNvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB2ZXJzaW9uIG9mIGJpc29uLi4uICIgPiY2OyB9CisgICAgYWNfcHJvZ192ZXJzaW9uPWAkSU5UTEJJU09OIC0tdmVyc2lvbiAyPiYxIHwgc2VkIC1uICdzL14uKkdOVSBCaXNvbi4qIFwoWzAtOV0qXC5bMC05Ll0qXCkuKiQvXDEvcCdgCisgICAgY2FzZSAkYWNfcHJvZ192ZXJzaW9uIGluCisgICAgICAnJykgYWNfcHJvZ192ZXJzaW9uPSJ2LiA/Lj8/LCBiYWQiOyBhY192ZXJjX2ZhaWw9eWVzOzsKKyAgICAgIDEuMls2LTldKiB8IDEuWzMtOV1bMC05XSogfCBbMi05XS4qKQorICAgICAgICAgYWNfcHJvZ192ZXJzaW9uPSIkYWNfcHJvZ192ZXJzaW9uLCBvayI7IGFjX3ZlcmNfZmFpbD1ubzs7CisgICAgICAqKSBhY19wcm9nX3ZlcnNpb249IiRhY19wcm9nX3ZlcnNpb24sIGJhZCI7IGFjX3ZlcmNfZmFpbD15ZXM7OworICAgIGVzYWMKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3Byb2dfdmVyc2lvbiIgPiY1CiskYXNfZWNobyAiJGFjX3Byb2dfdmVyc2lvbiIgPiY2OyB9CisgIGZpCisgIGlmIHRlc3QgJGFjX3ZlcmNfZmFpbCA9IHllczsgdGhlbgorICAgIElOVExCSVNPTj06CisgIGZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkLi4uICIgPiY2OyB9CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9ubHM7IFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFVTRV9OTFMiID4mNQorJGFzX2VjaG8gIiRVU0VfTkxTIiA+JjY7IH0KKworCisKKworICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9bm8KKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgIExJQklOVEw9CisgIExUTElCSU5UTD0KKyAgUE9TVUI9CisKKyAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgIGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dD1ubworCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZC4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2luY2x1ZGVkX2dldHRleHQ7IG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiA+JjUKKyRhc19lY2hvICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgPiY2OyB9CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisKKworCisKKworCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7Z3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJjK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGxpYmludGwuaD4KK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKK2V4dGVybiBpbnQgKl9ubF9kb21haW5fYmluZGluZ3M7CitpbnQKK21haW4gKCkKK3sKK2JpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKSArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2RvbWFpbl9iaW5kaW5ncworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliYz15ZXMKK2Vsc2UKKyAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliYyIgPiY1CiskYXNfZWNobyAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliYyIgPiY2OyB9CisKKyAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliYyIgIT0gInllcyI7IHRoZW4KKworCisKKyAgICB1c2VfYWRkaXRpb25hbD15ZXMKKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorCisgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxpYmludGwtcHJlZml4IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9saWJpbnRsX3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfbGliaW50bF9wcmVmaXg7CisgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25hbD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgZWxzZQorICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9IiR3aXRodmFsL2luY2x1ZGUiCisgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPSIkd2l0aHZhbC9saWIiCisgICAgICBmaQorICAgIGZpCisKK2ZpCisKKyAgICAgIExJQklOVEw9CisgIExUTElCSU5UTD0KKyAgSU5DSU5UTD0KKyAgcnBhdGhkaXJzPQorICBsdHJwYXRoZGlycz0KKyAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPQorICBuYW1lc19uZXh0X3JvdW5kPSdpbnRsICcKKyAgd2hpbGUgdGVzdCAtbiAiJG5hbWVzX25leHRfcm91bmQiOyBkbworICAgIG5hbWVzX3RoaXNfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kIgorICAgIG5hbWVzX25leHRfcm91bmQ9CisgICAgZm9yIG5hbWUgaW4gJG5hbWVzX3RoaXNfcm91bmQ7IGRvCisgICAgICBhbHJlYWR5X2hhbmRsZWQ9CisgICAgICBmb3IgbiBpbiAkbmFtZXNfYWxyZWFkeV9oYW5kbGVkOyBkbworICAgICAgICBpZiB0ZXN0ICIkbiIgPSAiJG5hbWUiOyB0aGVuCisgICAgICAgICAgYWxyZWFkeV9oYW5kbGVkPXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IC16ICIkYWxyZWFkeV9oYW5kbGVkIjsgdGhlbgorICAgICAgICBuYW1lc19hbHJlYWR5X2hhbmRsZWQ9IiRuYW1lc19hbHJlYWR5X2hhbmRsZWQgJG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcm5hbWU9YGVjaG8gIiRuYW1lIiB8IHNlZCAtZSAneXxhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLXxBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX3wnYAorICAgICAgICBldmFsIHZhbHVlPVwiXCRIQVZFX0xJQiR1cHBlcm5hbWVcIgorICAgICAgICBpZiB0ZXN0IC1uICIkdmFsdWUiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAiJHZhbHVlIiA9IHllczsgdGhlbgorICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16ICIkdmFsdWUiIHx8IExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9JHZhbHVlIgorICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTFRMSUIkdXBwZXJuYW1lXCIKKyAgICAgICAgICAgIHRlc3QgLXogIiR2YWx1ZSIgfHwgTFRMSUJJTlRMPSIke0xUTElCSU5UTH0ke0xUTElCSU5UTDorIH0kdmFsdWUiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0KKyAgICAgICAgICBmb3VuZF9sYT0KKyAgICAgICAgICBmb3VuZF9zbz0KKyAgICAgICAgICBmb3VuZF9hPQorICAgICAgICAgIGlmIHRlc3QgJHVzZV9hZGRpdGlvbmFsID0geWVzOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJleHQiICYmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kc2hsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICBmb3VuZF9zbz0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCIKKyAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kbGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kbGliZXh0IgorICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2RpciIgPSAiWCI7IHRoZW4KKyAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMVExJQklOVEw7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgY2FzZSAiJHgiIGluCisgICAgICAgICAgICAgICAgLUwqKQorICAgICAgICAgICAgICAgICAgZGlyPWBlY2hvICJYJHgiIHwgc2VkIC1lICdzL15YLUwvLydgCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJleHQiICYmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUuJHNobGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRkaXIiCisgICAgICAgICAgICAgICAgICAgIGZvdW5kX3NvPSIkZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCIKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS4kbGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKyAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9hPSIkZGlyL2xpYiRuYW1lLiRsaWJleHQiCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2RpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIExUTElCSU5UTD0iJHtMVExJQklOVEx9JHtMVExJQklOVEw6KyB9LUwkZm91bmRfZGlyIC1sJG5hbWUiCisgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX3NvIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgPSBubyB8fCB0ZXN0ICJYJGZvdW5kX2RpciIgPSAiWC91c3IvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgZm9yIHggaW4gJGx0cnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGZvdW5kX2RpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGx0cnBhdGhkaXJzPSIkbHRycGF0aGRpcnMgJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSU5UTD0iJHtMSUJJTlRMfSR7TElCSU5UTDorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiICYmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRmb3VuZF9kaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExJQklOVEw7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfS1MJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSU5UTD0iJHtMSUJJTlRMfSR7TElCSU5UTDorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSU5UTD0iJHtMSUJJTlRMfSR7TElCSU5UTDorIH0tbCRuYW1lIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2EiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRmb3VuZF9hIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0KKyAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9kaXIiIGluCisgICAgICAgICAgICAgICovbGliIHwgKi9saWIvKQorICAgICAgICAgICAgICAgIGJhc2VkaXI9YGVjaG8gIlgkZm91bmRfZGlyIiB8IHNlZCAtZSAncyxeWCwsJyAtZSAncywvbGliLyokLCwnYAorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJGJhc2VkaXIvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiAhPSAiWC91c3IvaW5jbHVkZSI7IHRoZW4KKyAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiID0gIlgvdXNyL2xvY2FsL2luY2x1ZGUiOyB0aGVuCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkQ1BQRkxBR1MgJElOQ0lOVEw7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUkkYWRkaXRpb25hbF9pbmNsdWRlZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DSU5UTD0iJHtJTkNJTlRMfSR7SU5DSU5UTDorIH0tSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGZvdW5kX2xhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2xhIiBpbgorICAgICAgICAgICAgICAgICovKiB8ICpcXCopIC4gIiRmb3VuZF9sYSIgOzsKKyAgICAgICAgICAgICAgICAqKSAuICIuLyRmb3VuZF9sYSIgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBsaWJkaXI9IiRzYXZlX2xpYmRpciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGVwIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisgICAgICAgICAgICAgICAgY2FzZSAiJGRlcCIgaW4KKyAgICAgICAgICAgICAgICAgIC1MKikKKyAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9saWJkaXI9YGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1MLy8nYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9saWJkaXIiICE9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9saWJkaXIiID0gIlgvdXNyL2xvY2FsL2xpYiI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCopIGhhdmVpdD15ZXM7OworICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMSUJJTlRMOyBkbworCisgIGFjbF9zYXZlX3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3NhdmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxfZXhlY19wcmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfS1MJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMVExJQklOVEw7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUTElCSU5UTD0iJHtMVExJQklOVEx9JHtMVExJQklOVEw6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAtUiopCisgICAgICAgICAgICAgICAgICAgIGRpcj1gZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLVIvLydgCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRlbmFibGVfcnBhdGgiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBycGF0aGRpcnM9IiRycGF0aGRpcnMgJGRpciIKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRsdHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBsdHJwYXRoZGlycz0iJGx0cnBhdGhkaXJzICRkaXIiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgIC1sKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19uZXh0X3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCAiYGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1sLy8nYAorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgKi5sYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MsXlguKi8sLCcgLWUgJ3MsXmxpYiwsJyAtZSAncyxcLmxhJCwsJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSU5UTD0iJHtMSUJJTlRMfSR7TElCSU5UTDorIH0kZGVwIgorICAgICAgICAgICAgICAgICAgICBMVExJQklOVEw9IiR7TFRMSUJJTlRMfSR7TFRMSUJJTlRMOisgfSRkZXAiCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9LWwkbmFtZSIKKyAgICAgICAgICAgIExUTElCSU5UTD0iJHtMVExJQklOVEx9JHtMVExJQklOVEw6KyB9LWwkbmFtZSIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKKyAgaWYgdGVzdCAiWCRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsZGlycz0KKyAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgYWxsZGlycz0iJHthbGxkaXJzfSR7YWxsZGlyczorJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3J9JGZvdW5kX2RpciIKKyAgICAgIGRvbmUKKyAgICAgICAgICAgIGFjbF9zYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgIGxpYmRpcj0iJGFsbGRpcnMiCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRmbGFnIgorICAgIGVsc2UKKyAgICAgICAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgYWNsX3NhdmVfbGliZGlyPSIkbGliZGlyIgorICAgICAgICBsaWJkaXI9IiRmb3VuZF9kaXIiCisgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgICAgbGliZGlyPSIkYWNsX3NhdmVfbGliZGlyIgorICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRmbGFnIgorICAgICAgZG9uZQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIlgkbHRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgZm9yIGZvdW5kX2RpciBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICBMVExJQklOVEw9IiR7TFRMSUJJTlRMfSR7TFRMSUJJTlRMOisgfS1SJGZvdW5kX2RpciIKKyAgICBkb25lCisgIGZpCisKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgZ2V0dGV4dCBpbiBsaWJpbnRsLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2d0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGd0X3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJElOQ0lOVEwiCisgICAgICAgICAgICBndF9zYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICAgICAgTElCUz0iJExJQlMgJExJQklOVEwiCisgICAgICAgICAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8bGliaW50bC5oPgorZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworZXh0ZXJuCisjaWZkZWYgX19jcGx1c3BsdXMKKyJDIgorI2VuZGlmCitjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzICgpOworaW50CittYWluICgpCit7CitiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9leHBhbmRfYWxpYXMgKDApCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJpbnRsPXllcworZWxzZQorICBndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGw9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCIgIT0geWVzICYmIHRlc3QgLW4gIiRMSUJJQ09OViI7IHRoZW4KKyAgICAgICAgICAgICAgTElCUz0iJExJQlMgJExJQklDT05WIgorICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8bGliaW50bC5oPgorZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworZXh0ZXJuCisjaWZkZWYgX19jcGx1c3BsdXMKKyJDIgorI2VuZGlmCitjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzICgpOworaW50CittYWluICgpCit7CitiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9leHBhbmRfYWxpYXMgKDApCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgTElCSU5UTD0iJExJQklOVEwgJExJQklDT05WIgorICAgICAgICAgICAgICAgIExUTElCSU5UTD0iJExUTElCSU5UTCAkTFRMSUJJQ09OViIKKyAgICAgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGw9eWVzCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIENQUEZMQUdTPSIkZ3Rfc2F2ZV9DUFBGTEFHUyIKKyAgICAgICAgICAgIExJQlM9IiRndF9zYXZlX0xJQlMiCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGwiID4mNQorJGFzX2VjaG8gIiRndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGwiID4mNjsgfQorICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliYyIgPSAieWVzIiBcCisgICAgICAgICAgIHx8IHsgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCIgPSAieWVzIiBcCisgICAgICAgICAgICAgICAgJiYgdGVzdCAiJFBBQ0tBR0UiICE9IGdldHRleHQtcnVudGltZSBcCisgICAgICAgICAgICAgICAgJiYgdGVzdCAiJFBBQ0tBR0UiICE9IGdldHRleHQtdG9vbHM7IH07IHRoZW4KKyAgICAgICAgICBndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQ9eWVzCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgTElCSU5UTD0KKyAgICAgICAgICBMVExJQklOVEw9CisgICAgICAgICAgSU5DSU5UTD0KKyAgICAgICAgZmkKKworCisgICAgICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgTElCSU5UTD0iXCR7dG9wX2J1aWxkZGlyfS9pbnRsL2xpYmludGwuYSAkTElCSUNPTlYiCisgICAgICAgIExUTElCSU5UTD0iXCR7dG9wX2J1aWxkZGlyfS9pbnRsL2xpYmludGwuYSAkTFRMSUJJQ09OViIKKyAgICAgICAgTElCUz1gZWNobyAiICRMSUJTICIgfCBzZWQgLWUgJ3MvIC1saW50bCAvIC8nIC1lICdzL14gLy8nIC1lICdzLyAkLy8nYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIiBcCisgICAgICAgICB8fCB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICBmaQorCisKKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiIFwKKyAgICAgICB8fCB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBFTkFCTEVfTkxTIDEiID4+Y29uZmRlZnMuaAorCisgICAgZWxzZQorICAgICAgVVNFX05MUz1ubworICAgIGZpCisgIGZpCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIHVzZSBOTFMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byB1c2UgTkxTLi4uICIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVVNFX05MUyIgPiY1CiskYXNfZWNobyAiJFVTRV9OTFMiID4mNjsgfQorICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hlcmUgdGhlIGdldHRleHQgZnVuY3Rpb24gY29tZXMgZnJvbSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGVyZSB0aGUgZ2V0dGV4dCBmdW5jdGlvbiBjb21lcyBmcm9tLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCIgPSAieWVzIjsgdGhlbgorICAgICAgICBndF9zb3VyY2U9ImV4dGVybmFsIGxpYmludGwiCisgICAgICBlbHNlCisgICAgICAgIGd0X3NvdXJjZT0ibGliYyIKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZ3Rfc291cmNlPSJpbmNsdWRlZCBpbnRsIGRpcmVjdG9yeSIKKyAgICBmaQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZ3Rfc291cmNlIiA+JjUKKyRhc19lY2hvICIkZ3Rfc291cmNlIiA+JjY7IH0KKyAgZmkKKworICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorCisgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCIgPSAieWVzIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBsaW5rIHdpdGggbGliaW50bCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gbGluayB3aXRoIGxpYmludGwuLi4gIiA+JjY7IH0KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMSUJJTlRMIiA+JjUKKyRhc19lY2hvICIkTElCSU5UTCIgPiY2OyB9CisKKyAgZm9yIGVsZW1lbnQgaW4gJElOQ0lOVEw7IGRvCisgICAgaGF2ZWl0PQorICAgIGZvciB4IGluICRDUFBGTEFHUzsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGVsZW1lbnQiOyB0aGVuCisgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICBDUFBGTEFHUz0iJHtDUFBGTEFHU30ke0NQUEZMQUdTOisgfSRlbGVtZW50IgorICAgIGZpCisgIGRvbmUKKworICAgICAgZmkKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0dFVFRFWFQgMSIgPj5jb25mZGVmcy5oCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQ0dFVFRFWFQgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCisgICAgICAgIFBPU1VCPXBvCisgIGZpCisKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dC1ydW50aW1lIHx8IHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQtdG9vbHM7IHRoZW4KKyAgICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworCisKKworCisgICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD0KKyAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PQorCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisKKworICAgICAgICBJTlNUT0JKRVhUPS5tbworCisKKyAgICAgICAgR0VOQ0FUPWdlbmNhdAorCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9JTkNMVURFRF9MSUJJTlRMIiA9IHllczsgdGhlbgorICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICBmaQorCisKKyAgICAgICAgSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVg9CisKKworCisgICAgSU5UTExJQlM9IiRMSUJJTlRMIgorCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIHsgYXNfdmFyPWFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldDsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKK1NIRUxMID0gL2Jpbi9zaAorYWxsOgorCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIG1ha2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBtYWtlLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke19jdl9nbnVfbWFrZV9jb21tYW5kK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgX2N2X2dudV9tYWtlX2NvbW1hbmQ9JycgOworICAgICAgICAgICAgICAgIGZvciBhIGluICIkTUFLRSIgbWFrZSBnbWFrZSBnbnVtYWtlIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRhIiA7IHRoZW4gY29udGludWUgOyBmaSA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAgKCBzaCAtYyAiJGEgLS12ZXJzaW9uIiAyPiAvZGV2L251bGwgfCBncmVwIEdOVSAgMj4mMSA+IC9kZXYvbnVsbCApIDsgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N2X2dudV9tYWtlX2NvbW1hbmQ9JGEgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZSA7CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJF9jdl9nbnVfbWFrZV9jb21tYW5kIiA+JjUKKyRhc19lY2hvICIkX2N2X2dudV9tYWtlX2NvbW1hbmQiID4mNjsgfSA7CisgICAgICAgIGlmIHRlc3QgICJ4JF9jdl9nbnVfbWFrZV9jb21tYW5kIiAhPSAieCIgIDsgdGhlbgorICAgICAgICAgICAgICAgIGlmR05VbWFrZT0nJyA7CisgICAgICAgICAgICAgICAgaWZOb3RHTlVtYWtlPScjJyA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZkdOVW1ha2U9JyMnIDsKKyAgICAgICAgICAgICAgICBpZk5vdEdOVW1ha2U9JycgOworICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBcIk5vdCBmb3VuZFwiIiA+JjUKKyRhc19lY2hvICJcIk5vdCBmb3VuZFwiIiA+JjY7IH07CisgICAgICAgIGZpCisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxuIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsbjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTE4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRMTiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9MTj0iJExOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9MTj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9MTiIgJiYgYWNfY3ZfcGF0aF9MTj0ibG4iCisgIDs7Citlc2FjCitmaQorTE49JGFjX2N2X3BhdGhfTE4KK2lmIHRlc3QgLW4gIiRMTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMTiIgPiY1CiskYXNfZWNobyAiJExOIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICIgPiY2OyB9CitMTl9TPSRhc19sbl9zCitpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubywgdXNpbmcgJExOX1MiID4mNQorJGFzX2VjaG8gIm5vLCB1c2luZyAkTE5fUyIgPiY2OyB9CitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm12Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtdjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTVYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNViBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9NVj0iJE1WIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9NVj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NViIgJiYgYWNfY3ZfcGF0aF9NVj0ibXYiCisgIDs7Citlc2FjCitmaQorTVY9JGFjX2N2X3BhdGhfTVYKK2lmIHRlc3QgLW4gIiRNViI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNViIgPiY1CiskYXNfZWNobyAiJE1WIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY3AiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJENQIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NQPSIkQ1AiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX0NQPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0NQIiAmJiBhY19jdl9wYXRoX0NQPSJjcCIKKyAgOzsKK2VzYWMKK2ZpCitDUD0kYWNfY3ZfcGF0aF9DUAoraWYgdGVzdCAtbiAiJENQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQIiA+JjUKKyRhc19lY2hvICIkQ1AiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJybSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcm07IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1JNK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUk0gaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUk09IiRSTSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUk09IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUk0iICYmIGFjX2N2X3BhdGhfUk09InJtIgorICA7OworZXNhYworZmkKK1JNPSRhY19jdl9wYXRoX1JNCitpZiB0ZXN0IC1uICIkUk0iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUk0iID4mNQorJGFzX2VjaG8gIiRSTSIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNobW9kIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjaG1vZDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfQ0hNT0Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDSE1PRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9DSE1PRD0iJENITU9EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DSE1PRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DSE1PRCIgJiYgYWNfY3ZfcGF0aF9DSE1PRD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitDSE1PRD0kYWNfY3ZfcGF0aF9DSE1PRAoraWYgdGVzdCAtbiAiJENITU9EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENITU9EIiA+JjUKKyRhc19lY2hvICIkQ0hNT0QiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVdLK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKKyRhc19lY2hvICIkQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInNlZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc2VkOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9TRUQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRTRUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfU0VEPSIkU0VEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9TRUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfU0VEIiAmJiBhY19jdl9wYXRoX1NFRD0ic2VkIgorICA7OworZXNhYworZmkKK1NFRD0kYWNfY3ZfcGF0aF9TRUQKK2lmIHRlc3QgLW4gIiRTRUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU0VEIiA+JjUKKyRhc19lY2hvICIkU0VEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGVybCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcGVybDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfUEVSTCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBFUkwgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUEVSTD0iJFBFUkwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1BFUkw9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEVSTCIgJiYgYWNfY3ZfcGF0aF9QRVJMPSJwZXJsIgorICA7OworZXNhYworZmkKK1BFUkw9JGFjX2N2X3BhdGhfUEVSTAoraWYgdGVzdCAtbiAiJFBFUkwiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUEVSTCIgPiY1CiskYXNfZWNobyAiJFBFUkwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsZGNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbGRjb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0xEQ09ORklHK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTERDT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfTERDT05GSUc9IiRMRENPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfTERDT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTERDT05GSUciICYmIGFjX2N2X3BhdGhfTERDT05GSUc9IjoiCisgIDs7Citlc2FjCitmaQorTERDT05GSUc9JGFjX2N2X3BhdGhfTERDT05GSUcKK2lmIHRlc3QgLW4gIiRMRENPTkZJRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRENPTkZJRyIgPiY1CiskYXNfZWNobyAiJExEQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BUitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVI9JGFjX2N2X3Byb2dfQVIKK2lmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBUiIgPiY1CiskYXNfZWNobyAiJEFSIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiI7IHRoZW4KKyAgYWNfY3RfQVI9JEFSCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFyOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9BUitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iJGFjX2N0X0FSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQVI9ImFyIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0FSPSRhY19jdl9wcm9nX2FjX2N0X0FSCitpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQVIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9BUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0FSIiA9IHg7IHRoZW4KKyAgICBBUj0iYXIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQVI9JGFjX2N0X0FSCisgIGZpCitlbHNlCisgIEFSPSIkYWNfY3ZfcHJvZ19BUiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJBTkxJQiIgPiY1CiskYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KKyAgICBSQU5MSUI9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUkFOTElCPSRhY19jdF9SQU5MSUIKKyAgZmkKK2Vsc2UKKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQorJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAoraWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCisgICAgU1RSSVA9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgU1RSSVA9JGFjX2N0X1NUUklQCisgIGZpCitlbHNlCisgIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibWFrZWluZm8iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1ha2VpbmZvOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19NQUtFSU5GTytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRNQUtFSU5GTyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19NQUtFSU5GTz0iJE1BS0VJTkZPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfTUFLRUlORk89Im1ha2VpbmZvIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK01BS0VJTkZPPSRhY19jdl9wcm9nX01BS0VJTkZPCitpZiB0ZXN0IC1uICIkTUFLRUlORk8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFLRUlORk8iID4mNQorJGFzX2VjaG8gIiRNQUtFSU5GTyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitpZiB0ZXN0ICJfJE1BS0VJTkZPIiA9ICJfIjsgdGhlbgorICAgIE1BS0VJTkZPPSJAZWNobyBNYWtlaW5mbyBpcyBtaXNzaW5nLiBJbmZvIGRvY3VtZW50YXRpb24gd2lsbCBub3QgYmUgYnVpbHQuO3RydWUiCitlbHNlCisgICAgY2FzZSAiJE1BS0VJTkZPIiBpbgorICAgICAgKi9taXNzaW5nLiopCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzoKKyoqKiBNYWtlaW5mbyBpcyBtaXNzaW5nLiBJbmZvIGRvY3VtZW50YXRpb24gd2lsbCBub3QgYmUgYnVpbHQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6CisqKiogTWFrZWluZm8gaXMgbWlzc2luZy4gSW5mbyBkb2N1bWVudGF0aW9uIHdpbGwgbm90IGJlIGJ1aWx0LiIgPiYyO30KKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIDs7CisgICAgZXNhYworZmkKKworCisjIFNlZSBpZiB3ZSBuZWVkIGEgc2VwYXJhdGUgbmF0aXZlIGNvbXBpbGVyLgoraWYgdGVzdCAkY3Jvc3NfY29tcGlsaW5nID0gbm87IHRoZW4KKyAgQlVJTERfQ0M9IiRDQyIKKworZWxzZQorICBmb3IgYWNfcHJvZyBpbiBnY2MgY2MKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19CVUlMRF9DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRCVUlMRF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19CVUlMRF9DQz0iJEJVSUxEX0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQlVJTERfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0JVSUxEX0NDPSRhY19jdl9wcm9nX0JVSUxEX0NDCitpZiB0ZXN0IC1uICIkQlVJTERfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQlVJTERfQ0MiID4mNQorJGFzX2VjaG8gIiRCVUlMRF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRCVUlMRF9DQyIgJiYgYnJlYWsKK2RvbmUKKworZmkKK2ZvciBhY19oZWFkZXIgaW4gZGlyZW50LmggZXJybm8uaCBnZXRvcHQuaCBtYWxsb2MuaCBtbnRlbnQuaCBwYXRocy5oIHNlbWFwaG9yZS5oIHNldGptcC5oIHNpZ25hbC5oIHN0ZGFyZy5oIHN0ZGludC5oIHN0ZGxpYi5oIHRlcm1pb3MuaCB0ZXJtaW8uaCB1bmlzdGQuaCB1dGltZS5oIGxpbnV4L2ZkLmggbGludXgvbWFqb3IuaCBuZXQvaWZfZGwuaCBuZXRpbmV0L2luLmggc3lzL2Rpc2tsYWJlbC5oIHN5cy9maWxlLmggc3lzL2lvY3RsLmggc3lzL21rZGV2Lmggc3lzL21tYW4uaCBzeXMvcHJjdGwuaCBzeXMvcXVldWUuaCBzeXMvcmVzb3VyY2UuaCBzeXMvc2VsZWN0Lmggc3lzL3NvY2tldC5oIHN5cy9zb2NraW8uaCBzeXMvc3RhdC5oIHN5cy9zeXNjYWxsLmggc3lzL3N5c21hY3Jvcy5oIHN5cy90aW1lLmggc3lzL3R5cGVzLmggc3lzL3VuLmggc3lzL3dhaXQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfaGVhZGVyIGluIHN5cy9kaXNrLmggc3lzL21vdW50LmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiCisjaWYgSEFWRV9TWVNfUVVFVUVfSAorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyIKK2V2YWwgYXNfdmFsPVwkJGFzX2FjX0hlYWRlcgorICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfaGVhZGVyIGluIG5ldC9pZi5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJuZXQvaWYuaCIgImFjX2N2X2hlYWRlcl9uZXRfaWZfaCIgIgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1NPQ0tFVAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uZXRfaWZfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTkVUX0lGX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gdnByaW50ZgorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJ2cHJpbnRmIiAiYWNfY3ZfZnVuY192cHJpbnRmIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3ZwcmludGYiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1ZQUklOVEYgMQorX0FDRU9GCisKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIl9kb3BybnQiICJhY19jdl9mdW5jX19kb3BybnQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfX2RvcHJudCIgPSB4IiJ5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RPUFJOVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworZmkKK2RvbmUKKworCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBkaXJlbnQiICJkX3JlY2xlbiIgImFjX2N2X21lbWJlcl9zdHJ1Y3RfZGlyZW50X2RfcmVjbGVuIiAiI2luY2x1ZGUgPGRpcmVudC5oPgorIgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X2RpcmVudF9kX3JlY2xlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1JFQ0xFTl9ESVJFTlQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInNzaXplX3QiICJhY19jdl90eXBlX3NzaXplX3QiICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3NpemVfdCIgPSB4IiJ5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1RZUEVfU1NJWkVfVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAibGxzZWVrIiAiYWNfY3ZfaGF2ZV9kZWNsX2xsc2VlayIgIiNpbmNsdWRlIDx1bmlzdGQuaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX2xsc2VlayIgPSB4IiJ5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xMU0VFS19QUk9UT1RZUEUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImxzZWVrNjQiICJhY19jdl9oYXZlX2RlY2xfbHNlZWs2NCIgIiNkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UKKwkJICNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQorCQkgI2luY2x1ZGUgPHVuaXN0ZC5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfbHNlZWs2NCIgPSB4IiJ5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0xTRUVLNjRfUFJPVE9UWVBFIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoc2hvcnQpKSIgImFjX2N2X3NpemVvZl9zaG9ydCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3Nob3J0IiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK3sgYXNfZm5fc2V0X3N0YXR1cyA3NworYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2hvcnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDU7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfc2hvcnQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfU0hPUlQgJGFjX2N2X3NpemVvZl9zaG9ydAorX0FDRU9GCisKKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBpbnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBpbnQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2ludCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGludCkpIiAiYWNfY3Zfc2l6ZW9mX2ludCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2ludCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cit7IGFzX2ZuX3NldF9zdGF0dXMgNzcKK2FzX2ZuX2Vycm9yICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGludCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNTsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfaW50PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfaW50IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2ludCIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKK19BQ0VPRgorCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChsb25nKSkiICJhY19jdl9zaXplb2ZfbG9uZyIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmciID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQoreyBhc19mbl9zZXRfc3RhdHVzIDc3Cithc19mbl9lcnJvciAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9sb25nPTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9sb25nIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nCitfQUNFT0YKKworCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZyBsb25nKSkiICJhY19jdl9zaXplb2ZfbG9uZ19sb25nIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK3sgYXNfZm5fc2V0X3N0YXR1cyA3NworYXNfZm5fZXJyb3IgImNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nX2xvbmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX0xPTkdfTE9ORyAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZworX0FDRU9GCisKKworU0laRU9GX1NIT1JUPSRhY19jdl9zaXplb2Zfc2hvcnQKK1NJWkVPRl9JTlQ9JGFjX2N2X3NpemVvZl9pbnQKK1NJWkVPRl9MT05HPSRhY19jdl9zaXplb2ZfbG9uZworU0laRU9GX0xPTkdfTE9ORz0kYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZworCisKKworCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19iaWdlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19BUFBMRV9DQ19fCisJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisJICAgICAjZW5kaWYKKwkgICAgIHR5cGVkZWYgaW50IGR1bW15OworCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCisJIyB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIC1hcmNoIGZsYWdzIHdpdGggZGlmZmVyZW50IHZhbHVlcy4KKwlhY19hcmNoPQorCWFjX3ByZXY9CisJZm9yIGFjX3dvcmQgaW4gJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTOyBkbworCSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKwkgICBjYXNlICRhY193b3JkIGluCisJICAgICBpPzg2IHwgeDg2XzY0IHwgcHBjIHwgcHBjNjQpCisJICAgICAgIGlmIHRlc3QgLXogIiRhY19hcmNoIiB8fCB0ZXN0ICIkYWNfYXJjaCIgPSAiJGFjX3dvcmQiOyB0aGVuCisJCSBhY19hcmNoPSRhY193b3JkCisJICAgICAgIGVsc2UKKwkJIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbAorCQkgYnJlYWsKKwkgICAgICAgZmkKKwkgICAgICAgOzsKKwkgICBlc2FjCisJICAgYWNfcHJldj0KKwkgZWxpZiB0ZXN0ICJ4JGFjX3dvcmQiID0gIngtYXJjaCI7IHRoZW4KKwkgICBhY19wcmV2PWFyY2gKKwkgZmkKKyAgICAgICBkb25lCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAgICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZiAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2ludAorbWFpbiAoKQoreworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorCQkgbm90IGJpZyBlbmRpYW4KKwkJI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBmaQorICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCSBub3QgYmlnIGVuZGlhbgorCQkjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitzaG9ydCBpbnQgYXNjaWlfbW1bXSA9CisJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisJCXNob3J0IGludCBhc2NpaV9paVtdID0KKwkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKwkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKKwkJfQorCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OworCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKKwkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworCQl9CisJCWV4dGVybiBpbnQgZm9vOworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KKwkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKwkgICAgZmkKKwkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCisJCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisJICAgICAgZWxzZQorCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KKwkJYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorCSAgICAgIGZpCisJICAgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworCSAgICAgdW5pb24KKwkgICAgIHsKKwkgICAgICAgbG9uZyBpbnQgbDsKKwkgICAgICAgY2hhciBjW3NpemVvZiAobG9uZyBpbnQpXTsKKwkgICAgIH0gdTsKKwkgICAgIHUubCA9IDE7CisJICAgICByZXR1cm4gdS5jW3NpemVvZiAobG9uZyBpbnQpIC0gMV0gPT0gMTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KKyBjYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbiAjKAorICAgeWVzKQorICAgICAkYXNfZWNobyAiI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMSIgPj5jb25mZGVmcy5oCis7OyAjKAorICAgbm8pCisgICAgICA7OyAjKAorICAgdW5pdmVyc2FsKQorCiskYXNfZWNobyAiI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgOzsgIygKKyAgICopCisgICAgIGFzX2ZuX2Vycm9yICJ1bmtub3duIGVuZGlhbm5lc3MKKyBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgIiRMSU5FTk8iIDUgOzsKKyBlc2FjCisKK0JVSUxEX0NDPSIkQlVJTERfQ0MiIENQUD0iJENQUCIgL2Jpbi9zaCAkYWNfYXV4X2Rpci9wYXJzZS10eXBlcy5zaAorQVNNX1RZUEVTX0hFQURFUj0uL2FzbV90eXBlcy5oCisKK2VjaG8gIi8qIFRoZXNlIGRlZmluZXMgYXJlIG5lZWRlZCBmb3IgdGhlIHB1YmxpYyBleHQyZnMuaCBoZWFkZXIgZmlsZSAqLyIgXAorICAgICA+IHB1YmxpY19jb25maWcuaAoraWYgZ3JlcCBIQVZFX1NZU19UWVBFU19IIGNvbmZkZWZzLmggPiB0bXBfY29uZmlnLiQkOyB0aGVuCisgIHVuaXEgdG1wX2NvbmZpZy4kJCA+PiBwdWJsaWNfY29uZmlnLmgKK2Vsc2UKKyAgZWNobyAiI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0giID4+IHB1YmxpY19jb25maWcuaAorZmkKK2lmIGdyZXAgV09SRFNfQklHRU5ESUFOIGNvbmZkZWZzLmggPiB0bXBfY29uZmlnLiQkOyB0aGVuCisgIHVuaXEgdG1wX2NvbmZpZy4kJCA+PiBwdWJsaWNfY29uZmlnLmgKK2Vsc2UKKyAgZWNobyAiI3VuZGVmIFdPUkRTX0JJR0VORElBTiIgPj4gcHVibGljX2NvbmZpZy5oCitmaQorcm0gLWYgdG1wX2NvbmZpZy4kJAorUFVCTElDX0NPTkZJR19IRUFERVI9Li9wdWJsaWNfY29uZmlnLmgKKworZm9yIGFjX2hlYWRlciBpbiBpbnR0eXBlcy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJpbnR0eXBlcy5oIiAiYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2giID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50cHRyX3QiICJhY19jdl90eXBlX2ludHB0cl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50cHRyX3QiID0geCIieWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0lOVFBUUl9UIDEKK19BQ0VPRgorCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3Qgc3RhdCBoYXMgYSBzdF9mbGFncyBmaWVsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cnVjdCBzdGF0IGhhcyBhIHN0X2ZsYWdzIGZpZWxkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2UyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KK2ludAorbWFpbiAoKQoreworc3RydWN0IHN0YXQgc3RhdDsgc3RhdC5zdF9mbGFncyA9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFncz15ZXMKK2Vsc2UKKyAgZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFncz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlMmZzcHJvZ3NfY3Zfc3RydWN0X3N0X2ZsYWdzIiA+JjUKKyRhc19lY2hvICIkZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFncyIgPiY2OyB9CitpZiB0ZXN0ICIkZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFncyIgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0X2ZsYWdzIGZpZWxkIGlzIHVzZWZ1bCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0X2ZsYWdzIGZpZWxkIGlzIHVzZWZ1bC4uLiAiID4mNjsgfQorICBpZiB0ZXN0ICIke2UyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3NfaW1tdXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KK2ludAorbWFpbiAoKQoreworc3RydWN0IHN0YXQgc3RhdDsgc3RhdC5zdF9mbGFncyB8PSBVRl9JTU1VVEFCTEU7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFnc19pbW11dD15ZXMKK2Vsc2UKKyAgZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFnc19pbW11dD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGUyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3NfaW1tdXQiID4mNQorJGFzX2VjaG8gIiRlMmZzcHJvZ3NfY3Zfc3RydWN0X3N0X2ZsYWdzX2ltbXV0IiA+JjY7IH0KKyAgaWYgdGVzdCAiJGUyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3NfaW1tdXQiID0geWVzOyB0aGVuCisJICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1NUQVRfRkxBR1MgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBzb2NrYWRkciIgInNhX2xlbiIgImFjX2N2X21lbWJlcl9zdHJ1Y3Rfc29ja2FkZHJfc2FfbGVuIiAiI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3NvY2thZGRyX3NhX2xlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU0FfTEVOIDEKK19BQ0VPRgorCitmaQorCitpZiB0ZXN0IC1uICIkQkxLSURfQ01UIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgYmxraWRfcHJvYmVfYWxsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgYmxraWRfcHJvYmVfYWxsLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9ibGtpZF9wcm9iZV9hbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBibGtpZF9wcm9iZV9hbGwgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBibGtpZF9wcm9iZV9hbGwgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgYmxraWQ7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfYmxraWRfcHJvYmVfYWxsPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfYmxraWRfcHJvYmVfYWxsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9ibGtpZF9wcm9iZV9hbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9ibGtpZF9wcm9iZV9hbGw9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9ibGtpZF9wcm9iZV9hbGwiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfYmxraWRfcHJvYmVfYWxsIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2Jsa2lkX3Byb2JlX2FsbAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCitmaQorZm9yIGFjX2Z1bmMgaW4gY2hmbGFncyBnZXRydXNhZ2UgbGxzZWVrIGxzZWVrNjQgb3BlbjY0IGZzdGF0NjQgZnRydW5jYXRlNjQgZ2V0bW50aW5mbyBzdHJ0b3VsbCBzdHJjYXNlY21wIHNyYW5kb20ganJhbmQ0OCBmY2hvd24gbWFsbGluZm8gZmRhdGFzeW5jIHN0cm5sZW4gc3RycHRpbWUgc3RyZHVwIHN5c2NvbmYgcGF0aGNvbmYgcG9zaXhfbWVtYWxpZ24gbWVtYWxpZ24gdmFsbG9jIF9fc2VjdXJlX2dldGVudiBwcmN0bCBtbWFwIHV0aW1lIHNldHJlc3VpZCBzZXRyZXNnaWQgdXNsZWVwIG5hbm9zbGVlcCBnZXRkdGFibGVzaXplIGdldHJsaW1pdCBibGtpZF9wcm9iZV9nZXRfdG9wb2xvZ3kKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitldmFsIGFzX3ZhbD1cJCRhc19hY192YXIKKyAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitTT0NLRVRfTElCPScnCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfc29ja2V0X3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sc29ja2V0ICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzb2NrZXQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzb2NrZXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBTT0NLRVRfTElCPS1sc29ja2V0CitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9wdHJlc2V0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBvcHRyZXNldC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oYXZlX29wdHJlc2V0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJvcHRyZXNldCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgYWNfY3ZfaGF2ZV9vcHRyZXNldD15ZXMKK2Vsc2UKKyAgYWNfY3ZfaGF2ZV9vcHRyZXNldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX29wdHJlc2V0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9vcHRyZXNldCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oYXZlX29wdHJlc2V0ID0geWVzOyB0aGVuCisgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfT1BUUkVTRVQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCitTRU1fSU5JVF9MSUI9JycKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNlbV9pbml0IiAiYWNfY3ZfZnVuY19zZW1faW5pdCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zZW1faW5pdCIgPSB4IiJ5ZXM7IHRoZW4gOgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNlbV9pbml0IGluIC1scHRocmVhZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2VtX2luaXQgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9wdGhyZWFkX3NlbV9pbml0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxwdGhyZWFkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzZW1faW5pdCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNlbV9pbml0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9wdGhyZWFkX3NlbV9pbml0PXllcworZWxzZQorICBhY19jdl9saWJfcHRocmVhZF9zZW1faW5pdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9zZW1faW5pdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9wdGhyZWFkX3NlbV9pbml0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRfc2VtX2luaXQiID0geCIieWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRU1fSU5JVCAxIiA+PmNvbmZkZWZzLmgKKworICAJU0VNX0lOSVRfTElCPS1scHRocmVhZAorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzZW1faW5pdCBpbiAtbHJ0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzZW1faW5pdCBpbiAtbHJ0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9ydF9zZW1faW5pdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1scnQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNlbV9pbml0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2VtX2luaXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3J0X3NlbV9pbml0PXllcworZWxzZQorICBhY19jdl9saWJfcnRfc2VtX2luaXQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3J0X3NlbV9pbml0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3J0X3NlbV9pbml0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3J0X3NlbV9pbml0IiA9IHgiInllczsgdGhlbiA6CisgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfU0VNX0lOSVQgMSIgPj5jb25mZGVmcy5oCisKKyAgCVNFTV9JTklUX0xJQj0tbHJ0CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNlbV9pbml0IGluIC1scG9zaXg0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzZW1faW5pdCBpbiAtbHBvc2l4NC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfcG9zaXg0X3NlbV9pbml0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxwb3NpeDQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNlbV9pbml0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2VtX2luaXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3Bvc2l4NF9zZW1faW5pdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3Bvc2l4NF9zZW1faW5pdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcG9zaXg0X3NlbV9pbml0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3Bvc2l4NF9zZW1faW5pdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wb3NpeDRfc2VtX2luaXQiID0geCIieWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRU1fSU5JVCAxIiA+PmNvbmZkZWZzLmgKKworICAJU0VNX0lOSVRfTElCPS1scG9zaXg0CitmaQorCitmaQorCitmaQorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1bmlmaWVkIGRpZmYgb3B0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1bmlmaWVkIGRpZmYgb3B0aW9uLi4uICIgPiY2OyB9CitpZiBkaWZmIC11ICQwICQwID4gL2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICBVTklfRElGRl9PUFRTPS11CitlbHNlCisgICBVTklfRElGRl9PUFRTPS1jCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVTklfRElGRl9PUFRTIiA+JjUKKyRhc19lY2hvICIkVU5JX0RJRkZfT1BUUyIgPiY2OyB9CisKK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQorCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfRVhUMl9JT0NUTFMgMSIgPj5jb25mZGVmcy5oCisKKwk7OworZXNhYworTElOVVhfQ01UPSIjIgorQ1lHV0lOX0NNVD0iIyIKK1VOSVhfQ01UPQorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisJTElOVVhfQ01UPQorCTs7CitjeWd3aW4pCisJQ1lHV0lOX0NNVD0KKwlVTklYX0NNVD0iIyIKKwk7OworZXNhYworCisKKworY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCogfCBnbnUqIHwgaypic2QqLWdudSkKKwlpZiB0ZXN0ICIkcHJlZml4IiA9IE5PTkUgLWEgIiRyb290X3ByZWZpeCIgPSBOT05FIDsgdGhlbgorCQlyb290X3ByZWZpeD0iIjsKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE9uICRob3N0X29zIHN5c3RlbXMsIHJvb3RfcHJlZml4IGRlZmF1bHRzIHRvICcnIiA+JjUKKyRhc19lY2hvICJPbiAkaG9zdF9vcyBzeXN0ZW1zLCByb290X3ByZWZpeCBkZWZhdWx0cyB0byAnJyIgPiY2OyB9CisJZmkKKwk7OworZXNhYworY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCogfCBnbnUqIHwgaypic2QqLWdudSkKKwlpZiB0ZXN0ICIkcHJlZml4IiA9IE5PTkUgOyB0aGVuCisJCXByZWZpeD0iL3VzciI7CisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBPbiAkaG9zdF9vcyBzeXN0ZW1zLCBwcmVmaXggZGVmYXVsdHMgdG8gL3VzciIgPiY1CiskYXNfZWNobyAiT24gJGhvc3Rfb3Mgc3lzdGVtcywgcHJlZml4IGRlZmF1bHRzIHRvIC91c3IiID4mNjsgfQorCQlpZiB0ZXN0ICIkbWFuZGlyIiA9ICcke3ByZWZpeH0vbWFuJyA7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAuLi5hbmQgbWFuZGlyIGRlZmF1bHRzIHRvIC91c3Ivc2hhcmUvbWFuIiA+JjUKKyRhc19lY2hvICIuLi5hbmQgbWFuZGlyIGRlZmF1bHRzIHRvIC91c3Ivc2hhcmUvbWFuIiA+JjY7IH0KKwkJCW1hbmRpcj0vdXNyL3NoYXJlL21hbgorCQlmaQorCWZpCis7OworZXNhYworaWYgdGVzdCAiJHJvb3RfcHJlZml4IiA9IE5PTkUgOyB0aGVuCisJaWYgdGVzdCAiJHByZWZpeCIgPSBOT05FIDsgdGhlbgorCQlyb290X3ByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorCWVsc2UKKwkJcm9vdF9wcmVmaXg9IiRwcmVmaXgiCisJZmkKKwlyb290X2JpbmRpcj0kYmluZGlyCisJcm9vdF9zYmluZGlyPSRzYmluZGlyCisJcm9vdF9saWJkaXI9JGxpYmRpcgorCXJvb3Rfc3lzY29uZmRpcj0kc3lzY29uZmRpcgorZWxzZQorCXJvb3RfYmluZGlyPScke3Jvb3RfcHJlZml4fS9iaW4nCisJcm9vdF9zYmluZGlyPScke3Jvb3RfcHJlZml4fS9zYmluJworCXJvb3RfbGliZGlyPScke3Jvb3RfcHJlZml4fS9saWInCisJcm9vdF9zeXNjb25mZGlyPScke3Jvb3RfcHJlZml4fS9ldGMnCitmaQoraWYgdGVzdCAiJGJpbmRpciIgIT0gJyR7ZXhlY19wcmVmaXh9L2Jpbic7IHRoZW4KKyAgICByb290X2JpbmRpcj0kYmluZGlyCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IFNldHRpbmcgcm9vdF9iaW5kaXIgdG8gJHJvb3RfYmluZGlyIiA+JjUKKyRhc19lY2hvICJTZXR0aW5nIHJvb3RfYmluZGlyIHRvICRyb290X2JpbmRpciIgPiY2OyB9CitmaQoraWYgdGVzdCAiJHNiaW5kaXIiICE9ICcke2V4ZWNfcHJlZml4fS9zYmluJzsgdGhlbgorICAgIHJvb3Rfc2JpbmRpcj0kc2JpbmRpcgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBTZXR0aW5nIHJvb3Rfc2JpbmRpciB0byAkcm9vdF9zYmluZGlyIiA+JjUKKyRhc19lY2hvICJTZXR0aW5nIHJvb3Rfc2JpbmRpciB0byAkcm9vdF9zYmluZGlyIiA+JjY7IH0KK2ZpCitpZiB0ZXN0ICIkbGliZGlyIiAhPSAnJHtleGVjX3ByZWZpeH0vbGliJzsgdGhlbgorICAgIHJvb3RfbGliZGlyPSRsaWJkaXIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogU2V0dGluZyByb290X2xpYmRpciB0byAkcm9vdF9saWJkaXIiID4mNQorJGFzX2VjaG8gIlNldHRpbmcgcm9vdF9saWJkaXIgdG8gJHJvb3RfbGliZGlyIiA+JjY7IH0KK2ZpCitpZiB0ZXN0ICIkc3lzY29uZmRpciIgIT0gJyR7cHJlZml4fS9ldGMnOyB0aGVuCisgICAgcm9vdF9zeXNjb25mZGlyPSRzeXNjb25mZGlyCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IFNldHRpbmcgcm9vdF9zeXNjb25mZGlyIHRvICRyb290X3N5c2NvbmZkaXIiID4mNQorJGFzX2VjaG8gIlNldHRpbmcgcm9vdF9zeXNjb25mZGlyIHRvICRyb290X3N5c2NvbmZkaXIiID4mNjsgfQorZmkKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbGlua2VyIGFjY2VwdHMgLXN0YXRpYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGxpbmtlciBhY2NlcHRzIC1zdGF0aWMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfZTJmc3Byb2dzX3VzZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBTQVZFX0xERkxBR1M9JExERkxBR1M7IExERkxBR1M9IiRMREZMQUdTIC1zdGF0aWMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworZmZsdXNoKHN0ZG91dCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZTJmc3Byb2dzX3VzZV9zdGF0aWM9eWVzCitlbHNlCisgIGFjX2N2X2UyZnNwcm9nc191c2Vfc3RhdGljPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xERkxBR1M9JFNBVkVfTERGTEFHUworZmkKKworY2FzZSAiJGhvc3Rfb3MiIGluCitzb2xhcmlzMi4qKQorCWFjX2N2X2UyZnNwcm9nc191c2Vfc3RhdGljPW5vCis7OworZXNhYworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9lMmZzcHJvZ3NfdXNlX3N0YXRpYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2UyZnNwcm9nc191c2Vfc3RhdGljIiA+JjY7IH0KK0xERkxBR19TVEFUSUM9CitpZiB0ZXN0ICRhY19jdl9lMmZzcHJvZ3NfdXNlX3N0YXRpYyA9IHllczsgdGhlbgorCUxERkxBR19TVEFUSUM9LXN0YXRpYworZmkKKworY2FzZSAiJGhvc3Rfb3MiIGluCitkYXJ3aW4qKQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBVc2luZyBBcHBsZSBEYXJ3aW4gLyBHTlUgbGliaW50bCB3b3JrYXJvdW5kIiA+JjUKKyRhc19lY2hvICJVc2luZyBBcHBsZSBEYXJ3aW4gLyBHTlUgbGliaW50bCB3b3JrYXJvdW5kIiA+JjY7IH0KKwkkYXNfZWNobyAiI2RlZmluZSBfSU5UTF9SRURJUkVDVF9NQUNST1MgMSIgPj5jb25mZGVmcy5oCisKKwk7OworZXNhYworU1NfRElSPWBjZCAke3NyY2Rpcn0vbGliL3NzOyBwd2RgCitFVF9ESVI9YGNkICR7c3JjZGlyfS9saWIvZXQ7IHB3ZGAKKworCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyA7IHRoZW4KKyAgRE9fVEVTVF9TVUlURT0KK2Vsc2UKKyAgRE9fVEVTVF9TVUlURT1jaGVjaworZmkKKworSU5UTF9GTEFHUz0KK2lmIHRlc3QgIiRVU0VfSU5DTFVERURfTElCSU5UTCIgPSAieWVzIiA7IHRoZW4KKwlJTlRMX0ZMQUdTPSctSSQodG9wX2J1aWxkZGlyKS9pbnRsIC1JJCh0b3Bfc3JjZGlyKS9pbnRsJworZmkKKworaWYgdGVzdCAkY3Jvc3NfY29tcGlsaW5nID0gbm87IHRoZW4KKyAgIEJVSUxEX0NGTEFHUz0iJENGTEFHUyIKKyAgIEJVSUxEX0xERkxBR1M9IiRMREZMQUdTIgorZWxzZQorICAgQlVJTERfQ0ZMQUdTPQorICAgQlVJTERfTERGTEFHUz0KK2ZpCisKKwordGVzdCAtZCBsaWIgfHwgbWtkaXIgbGliCit0ZXN0IC1kIGluY2x1ZGUgfHwgbWtkaXIgaW5jbHVkZQordGVzdCAtZCBpbmNsdWRlL2xpbnV4IHx8IG1rZGlyIGluY2x1ZGUvbGludXgKK3Rlc3QgLWQgaW5jbHVkZS9hc20gfHwgbWtkaXIgaW5jbHVkZS9hc20KK2ZvciBpIGluIE1DT05GSUcgTWFrZWZpbGUgZTJmc3Byb2dzLnNwZWMgXAorCXV0aWwvTWFrZWZpbGUgdXRpbC9zdWJzdC5jb25mIHV0aWwvZ2VuLXRhcmJhbGwgXAorCWxpYi9ldC9NYWtlZmlsZSBsaWIvc3MvTWFrZWZpbGUgbGliL2UycC9NYWtlZmlsZSBcCisJbGliL2V4dDJmcy9NYWtlZmlsZSBsaWIvZXh0MmZzL2V4dDJfdHlwZXMuaCBcCisJbGliL3V1aWQvTWFrZWZpbGUgbGliL3V1aWQvdXVpZF90eXBlcy5oIFwKKwlsaWIvYmxraWQvTWFrZWZpbGUgbGliL2Jsa2lkL2Jsa2lkX3R5cGVzLmggXAorCWxpYi9zcy9zcy5wYyBsaWIvdXVpZC91dWlkLnBjIGxpYi9ldC9jb21fZXJyLnBjIFwKKwlsaWIvZTJwL2UycC5wYyBsaWIvYmxraWQvYmxraWQucGMgbGliL2V4dDJmcy9leHQyZnMucGMgXAorCW1pc2MvTWFrZWZpbGUgZXh0MmVkL01ha2VmaWxlIGUyZnNjay9NYWtlZmlsZSBcCisJZGVidWdmcy9NYWtlZmlsZSB0ZXN0cy9NYWtlZmlsZSB0ZXN0cy9wcm9ncy9NYWtlZmlsZSBcCisJcmVzaXplL01ha2VmaWxlIGRvYy9NYWtlZmlsZSBpbnRsL01ha2VmaWxlIFwKKwlpbnRsL2xpYmdudWludGwuaCBwby9NYWtlZmlsZS5pbiA7IGRvCisJaWYgdGVzdCAtZCBgZGlybmFtZSAke3NyY2Rpcn0vJGlgIDsgdGhlbgorCQlvdXRsaXN0PSIkb3V0bGlzdCAkaSIKKwlmaQorZG9uZQorYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzICRvdXRsaXN0IgorCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAorIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzOiBkb3VibGUtcXVvdGUKKyAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwuCisgICAgICBzZWQgLW4gXAorCSJzLycvJ1xcXFwnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCisgICAgICA7OworICAgIGVzYWMgfAorICAgIHNvcnQKKykgfAorICBzZWQgJworICAgICAvXmFjX2N2X2Vudl8vYiBlbmQKKyAgICAgdCBjbGVhcgorICAgICA6Y2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKyAgICAgOmVuZCcgPj5jb25mY2FjaGUKK2lmIGRpZmYgIiRjYWNoZV9maWxlIiBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCIgJiYKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2F0IGNvbmZjYWNoZSA+JGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCisjCisjIElmIHRoZSBmaXJzdCBzZWQgc3Vic3RpdHV0aW9uIGlzIGV4ZWN1dGVkICh3aGljaCBsb29rcyBmb3IgbWFjcm9zIHRoYXQKKyMgdGFrZSBhcmd1bWVudHMpLCB0aGVuIGJyYW5jaCB0byB0aGUgcXVvdGUgc2VjdGlvbi4gIE90aGVyd2lzZSwKKyMgbG9vayBmb3IgYSBtYWNybyB0aGF0IGRvZXNuJ3QgdGFrZSBhcmd1bWVudHMuCithY19zY3JpcHQ9JworOm1saW5lCisvXFwkL3sKKyBOCisgcyxcXFxuLCwKKyBiIG1saW5lCit9Cit0IGNsZWFyCis6Y2xlYXIKK3MvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgKF1bXgkgKF0qKFteKV0qKVwpWwkgXSpcKC4qXCkvLURcMT1cMi9nCit0IHF1b3RlCitzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKlwoW14JIF1bXgkgXSpcKVsJIF0qXCguKlwpLy1EXDE9XDIvZwordCBxdW90ZQorYiBhbnkKKzpxdW90ZQorcy9bCSBgfiMkXiYqKCl7fVxcfDsnXCcnIjw+P10vXFwmL2cKK3MvXFsvXFwmL2cKK3MvXF0vXFwmL2cKK3MvXCQvJCQvZworSAorOmFueQorJHsKKwlnCisJcy9eXG4vLworCXMvXG4vIC9nCisJcAorfQorJworREVGUz1gc2VkIC1uICIkYWNfc2NyaXB0IiBjb25mZGVmcy5oYAorCisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCisgIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKKworCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CithY193cml0ZV9mYWlsPTAKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2FzX3dyaXRlX2ZhaWw9MAorY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2RlYnVnPWZhbHNlCithY19jc19yZWNoZWNrPWZhbHNlCithY19jc19zaWxlbnQ9ZmFsc2UKKworU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK2V4cG9ydCBTSEVMTAorX0FTRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworCisjIGFzX2ZuX2Vycm9yIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggc3RhdHVzICQ/LCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JD87IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkMyI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQyIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQxIiA+JiQzCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMSIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNj4mMQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTRU9GCit0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY0LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisiCisKK19BQ0VPRgorCitjYXNlICRhY19jb25maWdfZmlsZXMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKK2VzYWMKKworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gYWN0aW9ucworZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICBVbmxlc3MgdGhlIGZpbGVzCithbmQgYWN0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIFRBR3MsIGFsbCBhcmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVEFHXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudAorICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byB0aGUgcGFja2FnZSBwcm92aWRlci4iCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc192ZXJzaW9uPSJcXAorY29uZmlnLnN0YXR1cworY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY0LAorICB3aXRoIG9wdGlvbnMgXFwiYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK0FXSz0nJEFXSycKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgICopCisgICAgYWNfb3B0aW9uPSQxCisgICAgYWNfb3B0YXJnPSQyCisgICAgYWNfc2hpZnQ9c2hpZnQKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGFjX2NzX3JlY2hlY2s9OiA7OworICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCisgICAgJGFzX2VjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OworICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQorICAgIGRlYnVnPTogOzsKKyAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlIHwgLS1oIHwgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIGFzX2ZuX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7CisKKyAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgc2V0IFggJyRTSEVMTCcgJyQwJyAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorICBzaGlmdAorICBcJGFzX2VjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCBcJCoiID4mNgorICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICBleGVjICJcJEAiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2V4ZWMgNT4+Y29uZmlnLmxvZworeworICBlY2hvCisgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisjIyBSdW5uaW5nICRhc19tZS4gIyMKK19BU0JPWAorICAkYXNfZWNobyAiJGFjX2xvZyIKK30gPiY1CisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjCisjIElOSVQtQ09NTUFORFMKKyMKKyMgQ2FwdHVyZSB0aGUgdmFsdWUgb2Ygb2Jzb2xldGUgQUxMX0xJTkdVQVMgYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGNvbXB1dGUKKyAgICAjIFBPRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUywgR01PRklMRVMsIENBVEFMT0dTLiBCdXQgaGlkZSBpdAorICAgICMgZnJvbSBhdXRvbWFrZS4KKyAgICBldmFsICdPQlNPTEVURV9BTExfTElOR1VBUycnPSIkQUxMX0xJTkdVQVMiJworICAgICMgQ2FwdHVyZSB0aGUgdmFsdWUgb2YgTElOR1VBUyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gY29tcHV0ZSBDQVRBTE9HUy4KKyAgICBMSU5HVUFTPSIke0xJTkdVQVMtJVVOU0VUJX0iCisKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiZGVmYXVsdC0xIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlZmF1bHQtMSIgOzsKKyAgICAiJG91dGxpc3QiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJG91dGxpc3QiIDs7CisKKyAgKikgYXNfZm5fZXJyb3IgImludmFsaWQgYXJndW1lbnQ6IFxgJGFjX2NvbmZpZ190YXJnZXQnIiAiJExJTkVOTyIgNTs7CisgIGVzYWMKK2RvbmUKKworCisjIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCisjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKyMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKKyMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCitpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcworICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcworZmkKKworIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCisjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6CisjIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KKyRkZWJ1ZyB8fAoreworICB0bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8IGFzX2ZuX2Vycm9yICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCitpZiAkQVdLICdCRUdJTiB7IGdldGxpbmUgPCIvZGV2L251bGwiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgYWNfY3NfYXdrX2dldGxpbmU9OgorICBhY19jc19hd2tfcGlwZV9pbml0PQorICBhY19jc19hd2tfcmVhZF9maWxlPScKKyAgICAgIHdoaWxlICgoZ2V0bGluZSBhbGluZSA8IChGW2tleV0pKSA+IDApCisJcHJpbnQoYWxpbmUpCisgICAgICBjbG9zZShGW2tleV0pJworICBhY19jc19hd2tfcGlwZV9maW5pPQorZWxzZQorICBhY19jc19hd2tfZ2V0bGluZT1mYWxzZQorICBhY19jc19hd2tfcGlwZV9pbml0PSJwcmludCBcImNhdCA8PCd8I18hIV8jfCcgJiZcIiIKKyAgYWNfY3NfYXdrX3JlYWRfZmlsZT0nCisgICAgICBwcmludCAifCNfISFfI3wiCisgICAgICBwcmludCAiY2F0ICIgRltrZXldICIgJiYiCisgICAgICAnJGFjX2NzX2F3a19waXBlX2luaXQKKyAgIyBUaGUgZmluYWwgYDonIGZpbmlzaGVzIHRoZSBBTkQgbGlzdC4KKyAgYWNfY3NfYXdrX3BpcGVfZmluaT0nRU5EIHsgcHJpbnQgInwjXyEhXyN8IjsgcHJpbnQgIjoiIH0nCitmaQorYWNfY3I9YGVjaG8gWCB8IHRyIFggJ1wwMTUnYAorIyBPbiBjeWd3aW4sIGJhc2ggY2FuIGVhdCBcciBpbnNpZGUgYGAgaWYgdGhlIHVzZXIgcmVxdWVzdGVkIGlnbmNyLgorIyBCdXQgd2Uga25vdyBvZiBubyBvdGhlciBzaGVsbCB3aGVyZSBhY19jciB3b3VsZCBiZSBlbXB0eSBhdCB0aGlzCisjIHBvaW50LCBzbyB3ZSBjYW4gdXNlIGEgYmFzaGlzbSBhcyBhIGZhbGxiYWNrLgoraWYgdGVzdCAieCRhY19jciIgPSB4OyB0aGVuCisgIGV2YWwgYWNfY3I9XCRcJ1xcclwnCitmaQorYWNfY3NfYXdrX2NyPWAkQVdLICdCRUdJTiB7IHByaW50ICJhXHJiIiB9JyA8L2Rldi9udWxsIDI+L2Rldi9udWxsYAoraWYgdGVzdCAiJGFjX2NzX2F3a19jciIgPSAiYSR7YWNfY3J9YiI7IHRoZW4KKyAgYWNfY3NfYXdrX2NyPSdccicKK2Vsc2UKKyAgYWNfY3NfYXdrX2NyPSRhY19jcgorZmkKKworZWNobyAnQkVHSU4geycgPiIkdG1wL3N1YnMxLmF3ayIgJiYKK19BQ0VPRgorCisjIENyZWF0ZSBjb21tYW5kcyB0byBzdWJzdGl0dXRlIGZpbGUgb3V0cHV0IHZhcmlhYmxlcy4KK3sKKyAgZWNobyAiY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xIiAmJgorICBlY2hvICdjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmJyAmJgorICBlY2hvICIkYWNfc3Vic3RfZmlsZXMiIHwgc2VkICdzLy4qL0ZbIiYiXT0iJCYiLycgJiYKKyAgZWNobyAiX0FDQVdLIiAmJgorICBlY2hvICJfQUNFT0YiCit9ID5jb25mJCRmaWxlcy5zaCAmJgorLiAuL2NvbmYkJGZpbGVzLnNoIHx8CisgIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK3JtIC1mIGNvbmYkJGZpbGVzLnNoCisKK3sKKyAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKyAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgorICBlY2hvICJfQUNFT0YiCit9ID5jb25mJCRzdWJzLnNoIHx8CisgIGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK2FjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnJCdgCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCisgIC4gLi9jb25mJCRzdWJzLnNoIHx8CisgICAgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCisgIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorcm0gLWYgY29uZiQkc3Vicy5zaAorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2NhdCA+PiJcJHRtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKK19BQ0VPRgorc2VkIC1uICcKK2gKK3MvXi9TWyIvOyBzLyEuKi8iXT0vCitwCitnCitzL15bXiFdKiEvLworOnJlcGwKK3QgcmVwbAorcy8nIiRhY19kZWxpbSInJC8vCit0IGRlbGltCis6bmwKK2gKK3MvXCguXHsxNDhcfVwpLiovXDEvCit0IG1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCitwCituCitiIHJlcGwKKzptb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IG5sCis6ZGVsaW0KK2gKK3MvXCguXHsxNDhcfVwpLiovXDEvCit0IG1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iLworcAorYgorOm1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCitwCitnCitzLy5cezE0OFx9Ly8KK3QgZGVsaW0KKycgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKKy9eW14iIl0veworICBOCisgIHMvXG4vLworfQorJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorcm0gLWYgY29uZiQkc3Vicy5hd2sKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorX0FDQVdLCitjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorICBmb3IgKGtleSBpbiBTKSBTX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorICBcJGFjX2NzX2F3a19waXBlX2luaXQKK30KK3sKKyAgbGluZSA9ICQgMAorICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKKyAgc3Vic3RlZCA9IDAKKyAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQorICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7CisgICAga2V5ID0gZmllbGRbaV0KKyAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQorICAgIGlmIChTX2lzX3NldFtrZXldKSB7CisgICAgICB2YWx1ZSA9IFNba2V5XQorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQorICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKKyAgICAgIHN1YnN0ZWQgPSAxCisgICAgfSBlbHNlCisgICAgICBsZW4gKz0gMSArIGtleWxlbgorICB9CisgIGlmIChuZmllbGRzID09IDMgJiYgIXN1YnN0ZWQpIHsKKyAgICBrZXkgPSBmaWVsZFsyXQorICAgIGlmIChGW2tleV0gIT0gIiIgJiYgbGluZSB+IC9eWwkgXSpALipAWwkgXSokLykgeworICAgICAgXCRhY19jc19hd2tfcmVhZF9maWxlCisgICAgICBuZXh0CisgICAgfQorICB9CisgIHByaW50IGxpbmUKK30KK1wkYWNfY3NfYXdrX3BpcGVfZmluaQorX0FDQVdLCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIHNlZCAicy8kYWNfY3IvLyIgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICBzZWQgInMvJGFjX2NyXCQvLzsgcy8kYWNfY3IvJGFjX2NzX2F3a19jci9nIgorZWxzZQorICBjYXQKK2ZpIDwgIiR0bXAvc3ViczEuYXdrIiA+ICIkdG1wL3N1YnMuYXdrIiBcCisgIHx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK19BQ0VPRgorCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97CitzLzoqXCQoc3JjZGlyKToqLzovCitzLzoqXCR7c3JjZGlyfToqLzovCitzLzoqQHNyY2RpckA6Ki86Lworcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvCitzLzoqJC8vCitzL15bXj1dKj1bCSBdKiQvLworfScKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworCitldmFsIHNldCBYICIgIDpGICRDT05GSUdfRklMRVMgICAgICA6QyAkQ09ORklHX0NPTU1BTkRTIgorc2hpZnQKK2ZvciBhY190YWcKK2RvCisgIGNhc2UgJGFjX3RhZyBpbgorICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKKyAgZXNhYworICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorICA6W0ZITF0qOiopOzsKKyAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNTs7CisgIDpbRkhdLSkgYWNfdGFnPS06LTs7CisgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisgIGVzYWMKKyAgYWNfc2F2ZV9JRlM9JElGUworICBJRlM9OgorICBzZXQgeCAkYWNfdGFnCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgc2hpZnQKKyAgYWNfZmlsZT0kMQorICBzaGlmdAorCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkwpIGFjX3NvdXJjZT0kMTs7CisgIDpbRkhdKQorICAgIGFjX2ZpbGVfaW5wdXRzPQorICAgIGZvciBhY19mCisgICAgZG8KKyAgICAgIGNhc2UgJGFjX2YgaW4KKyAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAorCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorCSB0ZXN0IC1mICIkYWNfZiIgfHwKKwkgICBjYXNlICRhY19mIGluCisJICAgW1xcLyRdKikgZmFsc2U7OworCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKwkgICBlc2FjIHx8CisJICAgYXNfZm5fZXJyb3IgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNTs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCisgICAgICBhc19mbl9hcHBlbmQgYWNfZmlsZV9pbnB1dHMgIiAnJGFjX2YnIgorICAgIGRvbmUKKworICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorCSAgJGFzX2VjaG8gIiQqIiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnCisJYCcgYnkgY29uZmlndXJlLicKKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgZmkKKyAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgorICAgIGNhc2UgJGNvbmZpZ3VyZV9pbnB1dCBpbiAjKAorICAgICpcJiogfCAqXHwqIHwgKlxcKiApCisgICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8CisgICAgICAgc2VkICdzL1tcXFxcJnxdL1xcXFwmL2cnYDs7ICMoCisgICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7CisgICAgZXNhYworCisgICAgY2FzZSAkYWNfdGFnIGluCisgICAgKjotOiogfCAqOi0pIGNhdCA+IiR0bXAvc3RkaW4iIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNSA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisKKyAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCisgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKworICBjYXNlICRhY19tb2RlIGluCisgIDpGKQorICAjCisgICMgQ09ORklHX0ZJTEUKKyAgIworCisgIGNhc2UgJElOU1RBTEwgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKKyAgZXNhYworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KKyMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgorYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49CithY19zZWRfZGF0YXJvb3Q9JworL2RhdGFyb290ZGlyLyB7CisgIHAKKyAgcQorfQorL0BkYXRhZGlyQC9wCisvQGRvY2RpckAvcAorL0BpbmZvZGlyQC9wCisvQGxvY2FsZWRpckAvcAorL0BtYW5kaXJAL3AnCitjYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCisqZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7CisqQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCisgIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKKyAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKKyAgcyZAaW5mb2RpckAmJGluZm9kaXImZworICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZworICBzJkBtYW5kaXJAJiRtYW5kaXImZworICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworZXNhYworX0FDRU9GCisKKyMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KKyMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgorIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19zZWRfZXh0cmE9IiRhY192cHN1YgorJGV4dHJhc3ViCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0CitzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKK3MmQHRvcF9idWlsZF9wcmVmaXhAJiRhY190b3BfYnVpbGRfcHJlZml4Jjt0IHQKK3MmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0CitzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0CitzJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0CitzJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKK3MmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKK3MmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKK3MmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKKyRhY19kYXRhcm9vdGRpcl9oYWNrCisiCitldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfAoraWYgJGFjX2NzX2F3a19nZXRsaW5lOyB0aGVuCisgICRBV0sgLWYgIiR0bXAvc3Vicy5hd2siCitlbHNlCisgICRBV0sgLWYgIiR0bXAvc3Vicy5hd2siIHwgJFNIRUxMCitmaSA+JHRtcC9vdXQgXAorICB8fCBhc19mbl9lcnJvciAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKwordGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCit3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KKworICBybSAtZiAiJHRtcC9zdGRpbiIKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtKSBjYXQgIiR0bXAvb3V0IiAmJiBybSAtZiAiJHRtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJHRtcC9vdXQiICIkYWNfZmlsZSI7OworICBlc2FjIFwKKyAgfHwgYXNfZm5fZXJyb3IgImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgOzsKKworCisgIDpDKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQorIDs7CisgIGVzYWMKKworCisgIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgorICAgICJkZWZhdWx0LTEiOkMpCisgICAgZm9yIGFjX2ZpbGUgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgICAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIKKyAgICAgIGNhc2UgIiRhY19maWxlIiBpbgorICAgICAgICAqOiopIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAgICAgZXNhYworICAgICAgIyBQTyBkaXJlY3RvcmllcyBoYXZlIGEgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4uaW4uCisgICAgICBjYXNlICIkYWNfZmlsZSIgaW4gKi9NYWtlZmlsZS5pbikKKyAgICAgICAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIuCisgICAgICAgIGFjX2Rpcj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICIkYWNfZGlyInxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgICAgIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4InxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgICAgICAgIyBJbiBhdXRvY29uZi0yLjEzIGl0IGlzIGNhbGxlZCAkYWNfZ2l2ZW5fc3JjZGlyLgorICAgICAgICAjIEluIGF1dG9jb25mLTIuNTAgaXQgaXMgY2FsbGVkICRzcmNkaXIuCisgICAgICAgIHRlc3QgLW4gIiRhY19naXZlbl9zcmNkaXIiIHx8IGFjX2dpdmVuX3NyY2Rpcj0iJHNyY2RpciIKKyAgICAgICAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgICAgICAgICAuKSAgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgIDs7CisgICAgICAgICAgLyopIHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICAgICAgICAgKikgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgICAgICAgZXNhYworICAgICAgICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvUE9URklMRVMuaW4iOyB0aGVuCisgICAgICAgICAgcm0gLWYgIiRhY19kaXIvUE9URklMRVMiCisgICAgICAgICAgdGVzdCAtbiAiJGFzX21lIiAmJiBlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19kaXIvUE9URklMRVMiIHx8IGVjaG8gImNyZWF0aW5nICRhY19kaXIvUE9URklMRVMiCisgICAgICAgICAgY2F0ICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvUE9URklMRVMuaW4iIHwgc2VkIC1lICIvXiMvZCIgLWUgIi9eWyAJXSpcJC9kIiAtZSAicywuKiwgICAgICR0b3Bfc3JjZGlyLyYgXFxcXCwiIHwgc2VkIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiA+ICIkYWNfZGlyL1BPVEZJTEVTIgorICAgICAgICAgIFBPTUFLRUZJTEVERVBTPSJQT1RGSUxFUy5pbiIKKyAgICAgICAgICAjIEFMTF9MSU5HVUFTLCBQT0ZJTEVTLCBVUERBVEVQT0ZJTEVTLCBEVU1NWVBPRklMRVMsIEdNT0ZJTEVTIGRlcGVuZAorICAgICAgICAgICMgb24gJGFjX2RpciBidXQgZG9uJ3QgZGVwZW5kIG9uIHVzZXItc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAjIHBhcmFtZXRlcnMuCisgICAgICAgICAgaWYgdGVzdCAtZiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICAjIFRoZSBMSU5HVUFTIGZpbGUgY29udGFpbnMgdGhlIHNldCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJE9CU09MRVRFX0FMTF9MSU5HVUFTIjsgdGhlbgorICAgICAgICAgICAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogc2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiIHx8IGVjaG8gInNldHRpbmcgQUxMX0xJTkdVQVMgaW4gY29uZmlndXJlLmluIGlzIG9ic29sZXRlIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFMTF9MSU5HVUFTXz1gc2VkIC1lICIvXiMvZCIgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTImAKKyAgICAgICAgICAgICMgSGlkZSB0aGUgQUxMX0xJTkdVQVMgYXNzaWdtZW50IGZyb20gYXV0b21ha2UuCisgICAgICAgICAgICBldmFsICdBTExfTElOR1VBUycnPSRBTExfTElOR1VBU18nCisgICAgICAgICAgICBQT01BS0VGSUxFREVQUz0iJFBPTUFLRUZJTEVERVBTIExJTkdVQVMiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBUaGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMgd2FzIGdpdmVuIGluIGNvbmZpZ3VyZS5pbi4KKyAgICAgICAgICAgIGV2YWwgJ0FMTF9MSU5HVUFTJyc9JE9CU09MRVRFX0FMTF9MSU5HVUFTJworICAgICAgICAgIGZpCisgICAgICAgICAgIyBDb21wdXRlIFBPRklMRVMKKyAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5wbykKKyAgICAgICAgICAjIENvbXB1dGUgVVBEQVRFUE9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykucG8tdXBkYXRlKQorICAgICAgICAgICMgQ29tcHV0ZSBEVU1NWVBPRklMRVMKKyAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLm5vcCkKKyAgICAgICAgICAjIENvbXB1dGUgR01PRklMRVMKKyAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5nbW8pCisgICAgICAgICAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgICAgICAgICAgIC4pIHNyY2RpcnByZT0gOzsKKyAgICAgICAgICAgICopIHNyY2RpcnByZT0nJChzcmNkaXIpLycgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgUE9GSUxFUz0KKyAgICAgICAgICBVUERBVEVQT0ZJTEVTPQorICAgICAgICAgIERVTU1ZUE9GSUxFUz0KKyAgICAgICAgICBHTU9GSUxFUz0KKyAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICAgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkc3JjZGlycHJlJGxhbmcucG8iCisgICAgICAgICAgICBVUERBVEVQT0ZJTEVTPSIkVVBEQVRFUE9GSUxFUyAkbGFuZy5wby11cGRhdGUiCisgICAgICAgICAgICBEVU1NWVBPRklMRVM9IiREVU1NWVBPRklMRVMgJGxhbmcubm9wIgorICAgICAgICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkc3JjZGlycHJlJGxhbmcuZ21vIgorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIENBVEFMT0dTIGRlcGVuZHMgb24gYm90aCAkYWNfZGlyIGFuZCB0aGUgdXNlcidzIExJTkdVQVMKKyAgICAgICAgICAjIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAgICAgIElOU1RfTElOR1VBUz0KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkQUxMX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICBmb3IgcHJlc2VudGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgICAgICAgICB1c2VpdD1ubworICAgICAgICAgICAgICBpZiB0ZXN0ICIlVU5TRVQlIiAhPSAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJExJTkdVQVMiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkQUxMX0xJTkdVQVMiCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KKyAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcHJlc2VudGxhbmcgY2F0YWxvZyBpZiBkZXNpcmVkbGFuZyBpcworICAgICAgICAgICAgICAgICMgICBhLiBlcXVhbCB0byBwcmVzZW50bGFuZywgb3IKKyAgICAgICAgICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKKyAgICAgICAgICAgICAgICAjICAgICAgcHJlc2VudGxhbmcgY2FuIGJlIHVzZWQgYXMgYSBmYWxsYmFjayBmb3IgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAjICAgICAgd2hpY2ggYXJlIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBkZXNpcmVkbGFuZyBjYXRhbG9nKS4KKyAgICAgICAgICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCisgICAgICAgICAgICAgICAgICAiJHByZXNlbnRsYW5nIiopIHVzZWl0PXllczs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgIGlmIHRlc3QgJHVzZWl0ID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgSU5TVF9MSU5HVUFTPSIkSU5TVF9MSU5HVUFTICRwcmVzZW50bGFuZyIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIENBVEFMT0dTPQorICAgICAgICAgIGlmIHRlc3QgLW4gIiRJTlNUX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICBmb3IgbGFuZyBpbiAkSU5TVF9MSU5HVUFTOyBkbworICAgICAgICAgICAgICBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nLmdtbyIKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIiB8fCBlY2hvICJjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIgorICAgICAgICAgIHNlZCAtZSAiL15QT1RGSUxFUyA9L3IgJGFjX2Rpci9QT1RGSUxFUyIgLWUgIi9eIyBNYWtldmFycy9yICRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9NYWtldmFycyIgLWUgInN8QFBPRklMRVNAfCRQT0ZJTEVTfGciIC1lICJzfEBVUERBVEVQT0ZJTEVTQHwkVVBEQVRFUE9GSUxFU3xnIiAtZSAic3xARFVNTVlQT0ZJTEVTQHwkRFVNTVlQT0ZJTEVTfGciIC1lICJzfEBHTU9GSUxFU0B8JEdNT0ZJTEVTfGciIC1lICJzfEBDQVRBTE9HU0B8JENBVEFMT0dTfGciIC1lICJzfEBQT01BS0VGSUxFREVQU0B8JFBPTUFLRUZJTEVERVBTfGciICIkYWNfZGlyL01ha2VmaWxlLmluIiA+ICIkYWNfZGlyL01ha2VmaWxlIgorICAgICAgICAgIGZvciBmIGluICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIiL1J1bGVzLSo7IGRvCisgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKyAgICAgICAgICAgICAgY2FzZSAiJGYiIGluCisgICAgICAgICAgICAgICAgKi5vcmlnIHwgKi5iYWsgfCAqfikgOzsKKyAgICAgICAgICAgICAgICAqKSBjYXQgIiRmIiA+PiAiJGFjX2Rpci9NYWtlZmlsZSIgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZG9uZSA7OworCisgIGVzYWMKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0ICQ/CitmaQoraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9CitmaQorCitpZiB0ZXN0IC1mIHV0aWwvZ2VuLXRhcmJhbGw7IHRoZW4gY2htb2QgK3ggdXRpbC9nZW4tdGFyYmFsbDsgZmkKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlndXJlLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MWJlZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTA4OSBAQAorQUNfSU5JVCh2ZXJzaW9uLmgpCitBQ19QUkVSRVEoMi41MCkKK0FDX0NPTkZJR19BVVhfRElSKGNvbmZpZykKK01DT05GSUc9Li9NQ09ORklHCitBQ19TVUJTVF9GSUxFKE1DT05GSUcpCitCSU5BUllfVFlQRT1iaW4KK2RubAorZG5sIFRoaXMgaXMgdG8gZmlndXJlIG91dCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIHRoZSBkYXRlLi4uLgorZG5sCitFMkZTUFJPR1NfVkVSU0lPTj1gZ3JlcCBFMkZTUFJPR1NfVkVSU0lPTiAke3NyY2Rpcn0vdmVyc2lvbi5oICBcCisJfCBhd2sgJ3twcmludCAkM30nIHwgdHIgXCIgIiAiIHwgYXdrICd7cHJpbnQgJDF9J2AKK0RBVEU9YGdyZXAgRTJGU1BST0dTX0RBVEUgJHtzcmNkaXJ9L3ZlcnNpb24uaCB8IGF3ayAne3ByaW50ICQzfScgXAorCXwgdHIgXCIgIiAiYAorRTJGU1BST0dTX0RBWT1gZWNobyAkREFURSB8IGF3ayAtRi0gJ3twcmludCAkMX0nYAorTU9OVEg9YGVjaG8gJERBVEUgfCBhd2sgLUYtICd7cHJpbnQgJDJ9J2AKK1lFQVI9YGVjaG8gJERBVEUgfCBhd2sgLUYtICd7cHJpbnQgJDN9J2AKKworaWYgZXhwciAkWUVBUiAiPiIgMTkwMCA+IC9kZXYvbnVsbCA7IHRoZW4KKwlFMkZTUFJPR1NfWUVBUj0kWUVBUgorZWxpZiBleHByICRZRUFSICI+IiA5MCA+L2Rldi9udWxsIDsgdGhlbgorCUUyRlNQUk9HU19ZRUFSPTE5JFlFQVIKK2Vsc2UKKwlFMkZTUFJPR1NfWUVBUj0yMCRZRUFSCitmaQorCitjYXNlICRNT05USCBpbgorSmFuKQlNT05USF9OVU09MDE7IEUyRlNQUk9HU19NT05USD0iSmFudWFyeSIgOzsKK0ZlYikJTU9OVEhfTlVNPTAyOyBFMkZTUFJPR1NfTU9OVEg9IkZlYnJ1YXJ5IiA7OworTWFyKQlNT05USF9OVU09MDM7IEUyRlNQUk9HU19NT05USD0iTWFyY2giIDs7CitBcHIpCU1PTlRIX05VTT0wNDsgRTJGU1BST0dTX01PTlRIPSJBcHJpbCIgOzsKK01heSkJTU9OVEhfTlVNPTA1OyBFMkZTUFJPR1NfTU9OVEg9Ik1heSIgOzsKK0p1bikJTU9OVEhfTlVNPTA2OyBFMkZTUFJPR1NfTU9OVEg9Ikp1bmUiIDs7CitKdWwpCU1PTlRIX05VTT0wNzsgRTJGU1BST0dTX01PTlRIPSJKdWx5IiA7OworQXVnKQlNT05USF9OVU09MDg7IEUyRlNQUk9HU19NT05USD0iQXVndXN0IiA7OworU2VwKQlNT05USF9OVU09MDk7IEUyRlNQUk9HU19NT05USD0iU2VwdGVtYmVyIiA7OworT2N0KQlNT05USF9OVU09MTA7IEUyRlNQUk9HU19NT05USD0iT2N0b2JlciIgOzsKK05vdikJTU9OVEhfTlVNPTExOyBFMkZTUFJPR1NfTU9OVEg9Ik5vdmVtYmVyIiA7OworRGVjKQlNT05USF9OVU09MTI7IEUyRlNQUk9HU19NT05USD0iRGVjZW1iZXIiIDs7CisqKQlBQ19NU0dfV0FSTihbVW5rbm93biBtb250aCAkTU9OVEg/P10pIDs7Citlc2FjCisKK2Jhc2VfdmVyPWBlY2hvICRFMkZTUFJPR1NfVkVSU0lPTiB8IFwKKwkgICAgICAgc2VkIC1lICdzLy1XSVAvLycgLWUgJ3MvcHJlLS8vJyAtZSAncy8tUExVUy8vJ2AKKworZGF0ZV9zcGVjPSR7RTJGU1BST0dTX1lFQVJ9LiR7TU9OVEhfTlVNfS4ke0UyRlNQUk9HU19EQVl9CisKK2Nhc2UgJEUyRlNQUk9HU19WRVJTSU9OIGluCisqLVdJUHxwcmUtKikKKwlFMkZTUFJPR1NfUEtHVkVSPSIkYmFzZV92ZXJ+V0lQLSRFMkZTUFJPR1NfWUVBUi0kTU9OVEhfTlVNLSRFMkZTUFJPR1NfREFZIgorCTs7CisqKQorCUUyRlNQUk9HU19QS0dWRVI9IiRiYXNlX3ZlciIKKwk7OworZXNhYworCit1bnNldCBEQVRFIE1PTlRIIFlFQVIgYmFzZV92ZXIgcHJlX3ZlcnMgZGF0ZV9zcGVjCitBQ19NU0dfUkVTVUxUKFtHZW5lcmF0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgZTJmc3Byb2dzIHZlcnNpb24gJEUyRlNQUk9HU19WRVJTSU9OXSkKK0FDX01TR19SRVNVTFQoW1JlbGVhc2UgZGF0ZSBpcyAke0UyRlNQUk9HU19NT05USH0sICR7RTJGU1BST0dTX1lFQVJ9XSkKK0FDX1NVQlNUKEUyRlNQUk9HU19ZRUFSKQorQUNfU1VCU1QoRTJGU1BST0dTX01PTlRIKQorQUNfU1VCU1QoRTJGU1BST0dTX0RBWSkKK0FDX1NVQlNUKEUyRlNQUk9HU19WRVJTSU9OKQorQUNfU1VCU1QoRTJGU1BST0dTX1BLR1ZFUikKK0FDX0NBTk9OSUNBTF9IT1NUCitkbmwKK2RubCBDaGVjayB0byBzZWUgaWYgbGliZGwgZXhpc3RzIGZvciB0aGUgc2FrZSBvZiBkbG9wZW4KK2RubAorRExPUEVOX0xJQj0nJworQUNfQ0hFQ0tfTElCKGRsLCBkbG9wZW4sIAorW0RMT1BFTl9MSUI9LWxkbAorQUNfREVGSU5FKEhBVkVfRExPUEVOKV0pCitBQ19TVUJTVChETE9QRU5fTElCKQorZG5sCitkbmwgVXNlIGRpZXQgbGliYworZG5sIAorV0lUSF9ESUVUX0xJQkM9CitBQ19BUkdfV0lUSChbZGlldC1saWJjXSwKK1sgIC0td2l0aC1kaWV0LWxpYmMgICAgICAgIHVzZSBkaWV0IGxpYmNdLAorQ0M9ImRpZXQgY2MgLW5vc3RkaW5jIgorV0lUSF9ESUVUX0xJQkM9eWVzCitBQ19NU0dfUkVTVUxUKENDPSRDQykpZG5sCitkbmwKK0FDX0FSR19XSVRIKFtjY10sCitBQ19IRUxQX1NUUklORyhbLS13aXRoLWNjXSxbbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdXNlIENDPSBpbnN0ZWFkXSksCitBQ19NU0dfRVJST1IoWy0td2l0aC1jYyBubyBsb25nZXIgc3VwcG9ydGVkOyB1c2UgQ0M9IGluc3RlYWRdKSkKK2RubAorQUNfQVJHX1dJVEgoW2Njb3B0c10sCitBQ19IRUxQX1NUUklORyhbLS13aXRoLWNjb3B0c10sW25vIGxvbmdlciBzdXBwb3J0ZWQsIHVzZSBDRkxBR1M9IGluc3RlYWRdKSwKK0FDX01TR19FUlJPUihbLS13aXRoLWNjb3B0cyBubyBsb25nZXIgc3VwcG9ydGVkOyB1c2UgQ0ZMQUdTPSBpbnN0ZWFkXSkpCitkbmwKK0FDX0FSR19XSVRIKFtsZG9wdHNdLAorQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1sZG9wdHNdLFtubyBsb25nZXIgc3VwcG9ydGVkLCB1c2UgTERGTEFHUz0gaW5zdGVhZF0pLAorQUNfTVNHX0VSUk9SKFstLXdpdGgtbGRvcHRzIG5vIGxvbmdlciBzdXBwb3J0ZWQ7IHVzZSBMREZMQUdTPSBpbnN0ZWFkXSkpCitkbmwKK0FDX1BST0dfQ0MKK0FDX1BST0dfQ1BQCitkbmwKK2RubCBPbiBzeXN0ZW1zIHdpdGhvdXQgbGludXggaGVhZGVyIGZpbGVzLCB3ZSBhZGQgYW4gZXh0cmEgaW5jbHVkZSBkaXJlY3RvcnkKK2RubCB0aGF0IGhvbGRzIGVub3VnaCB0byBmYWtlIGl0IChob3BlZnVsbHkpLiAgTm90ZSB0aGF0IHRoZSAkKHRvcF9zcmNkaXIpIGhlcmUKK2RubCBpcyBxdW90ZWQgc28gdGhhdCBpdCBnZXRzIGV4cGFuZGVkIGJ5IG1ha2UsIG5vdCBieSBjb25maWd1cmUuCitkbmwKK0FDX0NIRUNLX0hFQURFUihsaW51eC9mcy5oLCBbbGludXhfaGVhZGVycz15ZXNdLCBbbGludXhfaGVhZGVycz1ub10pCitpZiB0ZXN0ICIkbGludXhfaGVhZGVycyIgIT0geWVzOyB0aGVuCisgIExJTlVYX0lOQ0xVREU9Jy1JJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUnCitmaQorQUNfU1VCU1QoTElOVVhfSU5DTFVERSkKK2RubAorZG5sIEFscGhhIGNvbXB1dGVycyB1c2UgZmFzdCBhbmQgaW1wcmVjaXNlIGZsb2F0aW5nIHBvaW50IGNvZGUgdGhhdCBtYXkKK2RubCBtaXNzIGV4Y2VwdGlvbnMgYnkgZGVmYXVsdC4gRm9yY2Ugc2FuZSBvcHRpb25zIGlmIHdlJ3JlIHVzaW5nIEdDQy4KK0FDX01TR19DSEVDS0lORyhmb3IgYWRkaXRpb25hbCBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzKQoraWYgdGVzdCAiJEdDQyIgPSB5ZXMKK3RoZW4KKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisJYWxwaGEpCQlhZGRjZmxhZ3M9Ii1taWVlZSIgOzsKKyAgICBlc2FjCitmaQoraWYgdGVzdCAieCRhZGRjZmxhZ3MiICE9IHgKK3RoZW4KKyAgICBBQ19NU0dfUkVTVUxUKCRhZGRjZmxhZ3MpCisgICAgQ0ZMQUdTPSIkYWRkY2ZsYWdzICRDRkxBR1MiCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbWyhub25lKV1dKQorZmkKK2RubAorZG5sIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbGlicmFyeSBleHRlbnRpb25zLiAgV2lsbCBiZSBkZWFsdCB3aXRoIGFmdGVyCitkbmwgcGFyc2luZyBjb25maWd1cmF0aW9uIG9waW9ucywgd2hpY2ggbWF5IG1vZGlmeSB0aGVzZQorZG5sCitMSUJfRVhUPS5hCitTVEFUSUNfTElCX0VYVD0uYQorUFJPRklMRURfTElCX0VYVD0uYQorZG5sCitkbmwgQWxsb3cgc2VwYXJhdGUgYHJvb3RfcHJlZml4JyB0byBiZSBzcGVjaWZpZWQKK2RubAorQUNfQVJHX1dJVEgoW3Jvb3QtcHJlZml4XSwKK1sgIC0td2l0aC1yb290LXByZWZpeD1QUkVGSVggb3ZlcnJpZGUgcHJlZml4IHZhcmlhYmxlIGZvciBmaWxlcyB0byBiZSBwbGFjZWQgaW4gdGhlIHJvb3RdLAorcm9vdF9wcmVmaXg9JHdpdGh2YWwsCityb290X3ByZWZpeD1OT05FKWRubAorZG5sCitkbmwgaGFuZGxlIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQorZG5sCitBQ19BUkdfRU5BQkxFKFttYWludGFpbmVyLW1vZGVdLAorWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlZmlsZSBydWxlcyB1c2VmdWwgZm9yIG1haW50YWluZXJzXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCU1BSU5UQUlORVJfQ01UPSMKKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgbWFpbnRhaW5lciBtb2RlXSkKK2Vsc2UKKwlNQUlOVEFJTkVSX0NNVD0KKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBtYWludGFpbmVyIG1vZGVdKQorZmkKKywKK01BSU5UQUlORVJfQ01UPSMKK0FDX01TR19SRVNVTFQoW0Rpc2FibGluZyBtYWludGFpbmVyIG1vZGUgYnkgZGVmYXVsdF0pCispCitBQ19TVUJTVChNQUlOVEFJTkVSX0NNVCkKK2RubAorZG5sIGhhbmRsZSAtLWVuYWJsZS1zeW1saW5rLWluc3RhbGwKK2RubAorQUNfQVJHX0VOQUJMRShbc3ltbGluay1pbnN0YWxsXSwKK1sgIC0tZW5hYmxlLXN5bWxpbmstaW5zdGFsbCB1c2Ugc3ltbGlua3Mgd2hlbiBpbnN0YWxsaW5nIGluc3RlYWQgb2YgaGFyZCBsaW5rc10sCitpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlMSU5LX0lOU1RBTExfRkxBR1M9LWYKKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGluc3RhbGxdKQorZWxzZQorCUxJTktfSU5TVEFMTF9GTEFHUz0tc2YKKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBzeW1saW5rcyBmb3IgaW5zdGFsbF0pCitmaQorLAorTElOS19JTlNUQUxMX0ZMQUdTPS1mCitBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgc3ltbGlua3MgZm9yIGluc3RhbGxdKQorKQorQUNfU1VCU1QoTElOS19JTlNUQUxMX0ZMQUdTKQorZG5sCitkbmwgaGFuZGxlIC0tZW5hYmxlLXN5bWxpbmstYnVpbGQKK2RubAorQUNfQVJHX0VOQUJMRShbc3ltbGluay1idWlsZF0sCitbICAtLWVuYWJsZS1zeW1saW5rLWJ1aWxkICB1c2Ugc3ltbGlua3Mgd2hpbGUgYnVpbGRpbmcgaW5zdGVhZCBvZiBoYXJkIGxpbmtzXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUxJTktfQlVJTERfRkxBR1M9CisJQUNfTVNHX1JFU1VMVChbRGlzYWJsaW5nIHN5bWxpbmtzIGZvciBidWlsZF0pCitlbHNlCisJTElOS19CVUlMRF9GTEFHUz0tcworCUFDX01TR19SRVNVTFQoW0VuYWJsaW5nIHN5bWxpbmtzIGZvciBidWlsZF0pCitmaQorLAorTElOS19CVUlMRF9GTEFHUz0KK0FDX01TR19SRVNVTFQoW0Rpc2FibGluZyBzeW1saW5rcyBmb3IgYnVpbGRdKQorKQorQUNfU1VCU1QoTElOS19CVUlMRF9GTEFHUykKK2RubAorZG5sIGhhbmRsZSAtLWVuYWJsZS12ZXJib3NlLW1ha2VjbWRzCitkbmwKK0FDX0FSR19FTkFCTEUoW3ZlcmJvc2UtbWFrZWNtZHNdLAorWyAgLS1lbmFibGUtdmVyYm9zZS1tYWtlY21kcyBlbmFibGUgdmVyYm9zZSBtYWtlIGNvbW1hbmQgb3V0cHV0XSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyB2ZXJib3NlIG1ha2UgY29tbWFuZHNdKQorCUU9QGVjaG8KKwlRPUAKK2Vsc2UKKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyB2ZXJib3NlIG1ha2UgY29tbWFuZHNdKQorCUU9QFxcIworCVE9IAorZmkKKywKK0FDX01TR19SRVNVTFQoW0Rpc2FibGluZyB2ZXJib3NlIG1ha2UgY29tbWFuZHNdKQorRT1AZWNobworUT1ACispCitBQ19TVUJTVChFKQorQUNfU1VCU1QoUSkKK2RubAorZG5sIGhhbmRsZSAtLWVuYWJsZS1jb21wcmVzc2lvbgorZG5sCitBQ19BUkdfRU5BQkxFKFtjb21wcmVzc2lvbl0sCitbICAtLWVuYWJsZS1jb21wcmVzc2lvbgkgIGVuYWJsZSBFWFBFUklNRU5UQUwgY29tcHJlc3Npb24gc3VwcG9ydF0sCitpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgY29tcHJlc3Npb24gc3VwcG9ydF0pCitlbHNlCisJQUNfREVGSU5FKEVOQUJMRV9DT01QUkVTU0lPTikKKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBjb21wcmVzc2lvbiBzdXBwb3J0XSkKKwlBQ19NU0dfV0FSTihbQ29tcHJlc3Npb24gc3VwcG9ydCBpcyBleHBlcmltZW50YWxdKQorZmkKKywKK0FDX01TR19SRVNVTFQoW0Rpc2FibGluZyBjb21wcmVzc2lvbiBzdXBwb3J0IGJ5IGRlZmF1bHRdKQorKQorZG5sCitkbmwgaGFuZGxlIC0tZW5hYmxlLWh0cmVlCitkbmwKK0FDX0FSR19FTkFCTEUoW2h0cmVlXSwKK1sgIC0tZW5hYmxlLWh0cmVlICAgICAgCSAgZW5hYmxlIEVYUEVSSU1FTlRBTCBodHJlZSBkaXJlY3Rvcnkgc3VwcG9ydF0sCitpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlIVFJFRV9DTVQ9IworCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyBodHJlZSBkaXJlY3Rvcnkgc3VwcG9ydF0pCitlbHNlCisJSFRSRUVfQ01UPQorCUFDX0RFRklORShFTkFCTEVfSFRSRUUpCisJQUNfTVNHX1JFU1VMVChbRW5hYmxpbmcgaHRyZWUgZGlyZWN0b3J5IHN1cHBvcnRdKQorZmkKKywKK0hUUkVFX0NNVD0KK0FDX0RFRklORShFTkFCTEVfSFRSRUUpCitBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBodHJlZSBkaXJlY3Rvcnkgc3VwcG9ydCBieSBkZWZhdWx0XSkKKykKK0FDX1NVQlNUKEhUUkVFX0NNVCkKK2RubAorZG5sIFRoaXMgbmVlZHMgdG8gYmUgYmVmb3JlIGFsbCBvZiB0aGUgLS1lbmFibGUtKi1zaGxpYnMgb3B0aW9ucworZG5sCitFMl9QS0dfQ09ORklHX1NUQVRJQz0tLXN0YXRpYworTERGTEFHX0RZTkFNSUM9CitQUklWQVRFX0xJQlNfQ01UPQorZG5sCitkbmwgaGFuZGxlIC0tZW5hYmxlLWVsZi1zaGxpYnMKK2RubAorQUNfQVJHX0VOQUJMRShbZWxmLXNobGlic10sCitbICAtLWVuYWJsZS1lbGYtc2hsaWJzCSAgc2VsZWN0IEVMRiBzaGFyZWQgbGlicmFyaWVzXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUVMRl9DTVQ9IworCU1BS0VGSUxFX0VMRj0vZGV2L251bGwKKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgRUxGIHNoYXJlZCBsaWJyYXJpZXNdKQorZWxzZQorCUUyX1BLR19DT05GSUdfU1RBVElDPQorCUVMRl9DTVQ9CisJTUFLRUZJTEVfRUxGPSRzcmNkaXIvbGliL01ha2VmaWxlLmVsZi1saWIKKwlbY2FzZSAiJGhvc3Rfb3MiIGluCisJc29sYXJpczIuKikKKwkJTUFLRUZJTEVfRUxGPSRzcmNkaXIvbGliL01ha2VmaWxlLnNvbGFyaXMtbGliCisJOzsKKwllc2FjXQorCUJJTkFSWV9UWVBFPWVsZmJpbgorCUxJQl9FWFQ9LnNvCisJUFJJVkFURV9MSUJTX0NNVD0jCisJTERGTEFHX0RZTkFNSUM9WyctV2wsLXJwYXRoLWxpbmssJCh0b3BfYnVpbGRkaXIpL2xpYiddCisJQUNfTVNHX1JFU1VMVChbRW5hYmxpbmcgRUxGIHNoYXJlZCBsaWJyYXJpZXNdKQorZmkKKywKK01BS0VGSUxFX0VMRj0vZGV2L251bGwKK0VMRl9DTVQ9IworQUNfTVNHX1JFU1VMVChbRGlzYWJsaW5nIEVMRiBzaGFyZWQgbGlicmFyaWVzIGJ5IGRlZmF1bHRdKQorKQorQUNfU1VCU1QoRUxGX0NNVCkKK0FDX1NVQlNUX0ZJTEUoTUFLRUZJTEVfRUxGKQorZG5sCitkbmwgaGFuZGxlIC0tZW5hYmxlLWJzZC1zaGxpYnMKK2RubAorQUNfQVJHX0VOQUJMRShbYnNkLXNobGlic10sCitbICAtLWVuYWJsZS1ic2Qtc2hsaWJzCSAgc2VsZWN0IEJTRCBzaGFyZWQgbGlicmFyaWVzXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUJTRExJQl9DTVQ9IworCU1BS0VGSUxFX0JTRExJQj0vZGV2L251bGwKKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgQlNEIHNoYXJlZCBsaWJyYXJpZXNdKQorZWxzZQorCUUyX1BLR19DT05GSUdfU1RBVElDPQorCUJTRExJQl9DTVQ9CisJTUFLRUZJTEVfQlNETElCPSRzcmNkaXIvbGliL01ha2VmaWxlLmJzZC1saWIKKwlMSUJfRVhUPS5zbworCVtjYXNlICIkaG9zdF9vcyIgaW4KKwlkYXJ3aW4qKQorCQlNQUtFRklMRV9CU0RMSUI9JHNyY2Rpci9saWIvTWFrZWZpbGUuZGFyd2luLWxpYgorCQlMSUJfRVhUPS5keWxpYgorCTs7CisJZXNhY10KKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBCU0Qgc2hhcmVkIGxpYnJhcmllc10pCitmaQorLAorTUFLRUZJTEVfQlNETElCPS9kZXYvbnVsbAorQlNETElCX0NNVD0jCitBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgQlNEIHNoYXJlZCBsaWJyYXJpZXMgYnkgZGVmYXVsdF0pCispCitBQ19TVUJTVChCU0RMSUJfQ01UKQorQUNfU1VCU1RfRklMRShNQUtFRklMRV9CU0RMSUIpCitkbmwKK2RubCBoYW5kbGUgLS1lbmFibGUtcHJvZmlsZQorZG5sCitBQ19BUkdfRU5BQkxFKFtwcm9maWxlXSwKK1sgIC0tZW5hYmxlLXByb2ZpbGUJICBidWlsZCBwcm9maWxpbmcgbGlicmFyaWVzXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCVBST0ZJTEVfQ01UPSMKKwlNQUtFRklMRV9QUk9GSUxFPS9kZXYvbnVsbAorCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyBwcm9maWxpbmcgbGlicmFyaWVzXSkKK2Vsc2UKKwlQUk9GSUxFX0NNVD0KKwlNQUtFRklMRV9QUk9GSUxFPSRzcmNkaXIvbGliL01ha2VmaWxlLnByb2ZpbGUKKwlQUk9GSUxFRF9MSUJfRVhUPV9wLmEKKwlBQ19NU0dfUkVTVUxUKFtCdWlsZGluZyBwcm9maWxpbmcgbGlicmFyaWVzXSkKK2ZpCissCitQUk9GSUxFX0NNVD0jCitNQUtFRklMRV9QUk9GSUxFPS9kZXYvbnVsbAorQUNfTVNHX1JFU1VMVChbRGlzYWJsaW5nIHByb2ZpbGluZyBsaWJyYXJpZXMgYnkgZGVmYXVsdF0pCispCitBQ19TVUJTVChQUk9GSUxFX0NNVCkKK0FDX1NVQlNUX0ZJTEUoTUFLRUZJTEVfUFJPRklMRSkKK2RubAorZG5sIGhhbmRsZSAtLWVuYWJsZS1jaGVja2VyCitkbmwKK0FDX0FSR19FTkFCTEUoW2NoZWNrZXJdLAorWyAgLS1lbmFibGUtY2hlY2tlcgkgIGJ1aWxkIGNoZWNrZXIgbGlicmFyaWVzXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUNIRUNLRVJfQ01UPSMKKwlNQUtFRklMRV9DSEVDS0VSPS9kZXYvbnVsbAorCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyBjaGVja2VyIGxpYnJhcmllc10pCitlbHNlCisJQ0hFQ0tFUl9DTVQ9CisJTUFLRUZJTEVfQ0hFQ0tFUj0kc3JjZGlyL2xpYi9NYWtlZmlsZS5jaGVja2VyCisJQUNfTVNHX1JFU1VMVChbQnVpbGRpbmcgY2hlY2tlciBsaWJyYXJpZXNdKQorZmkKKywKK0NIRUNLRVJfQ01UPSMKK01BS0VGSUxFX0NIRUNLRVI9L2Rldi9udWxsCitBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgY2hlY2tlciBsaWJyYXJpZXMgYnkgZGVmYXVsdF0pCispCitBQ19TVUJTVChDSEVDS0VSX0NNVCkKK0FDX1NVQlNUX0ZJTEUoTUFLRUZJTEVfQ0hFQ0tFUikKK2RubAorZG5sIFN1YnN0aXR1dGUgbGlicmFyeSBleHRlbnNpb25zCitkbmwKK0FDX1NVQlNUKExJQl9FWFQpCitBQ19TVUJTVChTVEFUSUNfTElCX0VYVCkKK0FDX1NVQlNUKFBST0ZJTEVEX0xJQl9FWFQpCitBQ19TVUJTVChMREZMQUdfRFlOQU1JQykKK0FDX1NVQlNUKFBSSVZBVEVfTElCU19DTVQpCitkbmwKK2RubCBoYW5kbGUgLS1lbmFibGUtamJkLWRlYnVnCitkbmwKK0FDX0FSR19FTkFCTEUoW2piZC1kZWJ1Z10sCitbICAtLWVuYWJsZS1qYmQtZGVidWcgIAkgIGVuYWJsZSBqb3VybmFsIGRlYnVnZ2luZ10sCitpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgam91cm5hbCBkZWJ1Z2dpbmddKQorZWxzZQorCUFDX0RFRklORShDT05GSUdfSkJEX0RFQlVHKQorCUFDX01TR19SRVNVTFQoW0VuYWJsaW5nIGpvdXJuYWwgZGVidWdnaW5nXSkKK2ZpCissCitBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgam91cm5hbCBkZWJ1Z2dpbmcgYnkgZGVmYXVsdF0pCispCitkbmwKK2RubCBoYW5kbGUgLS1lbmFibGUtYmxraWQtZGVidWcKK2RubAorQUNfQVJHX0VOQUJMRShbYmxraWQtZGVidWddLAorWyAgLS1lbmFibGUtYmxraWQtZGVidWcgICAgZW5hYmxlIGJsa2lkIGRlYnVnZ2luZ10sCitpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgYmxraWQgZGVidWdnaW5nXSkKK2Vsc2UKKwlBQ19ERUZJTkUoQ09ORklHX0JMS0lEX0RFQlVHKQorCUFDX01TR19SRVNVTFQoW0VuYWJsaW5nIGJsa2lkIGRlYnVnZ2luZ10pCitmaQorLAorQUNfTVNHX1JFU1VMVChbRGlzYWJsaW5nIGJsa2lkIGRlYnVnZ2luZyBieSBkZWZhdWx0XSkKKykKK2RubAorZG5sIGhhbmRsZSAtLWVuYWJsZS10ZXN0aW8tZGVidWcKK2RubAorQUNfQVJHX0VOQUJMRShbdGVzdGlvLWRlYnVnXSwKK1sgIC0tZGlzYWJsZS10ZXN0aW8tZGVidWcgIGRpc2FibGUgdGhlIHVzZSBvZiB0aGUgdGVzdCBJL08gbWFuYWdlciBmb3IgZGVidWdnaW5nXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyB0ZXN0aW8gZGVidWdnaW5nXSkKKwlURVNUX0lPX0NNVD0iIyIKK2Vsc2UKKwlURVNUX0lPX0NNVD0KKwlBQ19ERUZJTkUoQ09ORklHX1RFU1RJT19ERUJVRykKKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyB0ZXN0aW8gZGVidWdnaW5nXSkKK2ZpCissCitBQ19NU0dfUkVTVUxUKFtFbmFibGluZyB0ZXN0aW8gZGVidWdnaW5nIGJ5IGRlZmF1bHRdKQorQUNfREVGSU5FKENPTkZJR19URVNUSU9fREVCVUcpCitURVNUX0lPX0NNVD0KKykKK0FDX1NVQlNUKFRFU1RfSU9fQ01UKQorZG5sCitkbmwgaGFuZGxlIC0tZGlzYWJsZS1saWJ1dWlkCitkbmwKK1BLR19QUk9HX1BLR19DT05GSUcKK0xJQlVVSUQ9CitERVBMSUJVVUlEPQorU1RBVElDX0xJQlVVSUQ9CitERVBTVEFUSUNfTElCVVVJRD0KK1BST0ZJTEVEX0xJQlVVSUQ9CitERVBQUk9GSUxFRF9MSUJVVUlEPQorVVVJRF9DTVQ9CitBQ19BUkdfRU5BQkxFKFtsaWJ1dWlkXSwKK1sgIC0tZGlzYWJsZS1saWJ1dWlkCSAgZG8gbm90IGJ1aWxkIHByaXZhdGUgdXVpZCBsaWJyYXJ5XSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCWlmIHRlc3QgLXogIiRQS0dfQ09ORklHIjsgdGhlbgorCQlBQ19NU0dfRVJST1IoW3BrZy1jb25maWcgbm90IGluc3RhbGxlZDsgcGxlYXNlIGluc3RhbGwgaXQuXSkKKwlmaQorCisJQUNfQ0hFQ0tfTElCKHV1aWQsIHV1aWRfZ2VuZXJhdGUsCisJCVtMSUJVVUlEPWAkUEtHX0NPTkZJRyAtLWxpYnMgdXVpZGA7CisJCSBTVEFUSUNfTElCVVVJRD1gJFBLR19DT05GSUcgLS1zdGF0aWMgLS1saWJzIHV1aWRgXSwKKwkJW0FDX01TR19FUlJPUihbZXh0ZXJuYWwgdXVpZCBsaWJyYXJ5IG5vdCBmb3VuZF0pXSwKKwkJWyRMSUJVVUlEXSkKKwlVVUlEX0NNVD0jCisJQUNfTVNHX1JFU1VMVChbRGlzYWJsaW5nIHByaXZhdGUgdXVpZCBsaWJyYXJ5XSkKK2Vsc2UKKwlMSUJVVUlEPSckKExJQikvbGlidXVpZCckTElCX0VYVAorCURFUExJQlVVSUQ9JExJQlVVSUQKKwlTVEFUSUNfTElCVVVJRD0nJChMSUIpL2xpYnV1aWQnJFNUQVRJQ19MSUJfRVhUCisJREVQU1RBVElDX0xJQlVVSUQ9JFNUQVRJQ19MSUJVVUlECisJUFJPRklMRURfTElCVVVJRD0nJChMSUIpL2xpYnV1aWQnJFBST0ZJTEVEX0xJQl9FWFQKKwlERVBQUk9GSUxFRF9MSUJVVUlEPSRQUk9GSUxFRF9MSUJVVUlECisJQUNfTVNHX1JFU1VMVChbRW5hYmxpbmcgcHJpdmF0ZSB1dWlkIGxpYnJhcnldKQorZmkKKywKK0xJQlVVSUQ9JyQoTElCKS9saWJ1dWlkJyRMSUJfRVhUCitERVBMSUJVVUlEPSRMSUJVVUlECitTVEFUSUNfTElCVVVJRD0nJChMSUIpL2xpYnV1aWQnJFNUQVRJQ19MSUJfRVhUCitERVBTVEFUSUNfTElCVVVJRD0kU1RBVElDX0xJQlVVSUQKK1BST0ZJTEVEX0xJQlVVSUQ9JyQoTElCKS9saWJ1dWlkJyRQUk9GSUxFRF9MSUJfRVhUCitERVBQUk9GSUxFRF9MSUJVVUlEPSRQUk9GSUxFRF9MSUJVVUlECitBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBwcml2YXRlIHV1aWQgbGlicmFyeSBieSBkZWZhdWx0XSkKKykKK0FDX1NVQlNUKExJQlVVSUQpCitBQ19TVUJTVChERVBMSUJVVUlEKQorQUNfU1VCU1QoU1RBVElDX0xJQlVVSUQpCitBQ19TVUJTVChERVBTVEFUSUNfTElCVVVJRCkKK0FDX1NVQlNUKFBST0ZJTEVEX0xJQlVVSUQpCitBQ19TVUJTVChERVBQUk9GSUxFRF9MSUJVVUlEKQorQUNfU1VCU1QoVVVJRF9DTVQpCitkbmwKK2RubCBoYW5kbGUgLS1kaXNhYmxlLWxpYmJsa2lkCitkbmwKK1BLR19QUk9HX1BLR19DT05GSUcKK0xJQkJMS0lEPQorREVQTElCQkxLSUQ9CitTVEFUSUNfTElCQkxLSUQ9CitERVBTVEFUSUNfTElCQkxLSUQ9CitQUk9GSUxFRF9MSUJCTEtJRD0KK0RFUFBST0ZJTEVEX0xJQkJMS0lEPQorQkxLSURfQ01UPQorQUNfQVJHX0VOQUJMRShbbGliYmxraWRdLAorWyAgLS1kaXNhYmxlLWxpYmJsa2lkCSAgZG8gbm90IGJ1aWxkIHByaXZhdGUgYmxraWQgbGlicmFyeV0sCitpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlpZiB0ZXN0IC16ICIkUEtHX0NPTkZJRyI7IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFtwa2ctY29uZmlnIG5vdCBpbnN0YWxsZWQ7IHBsZWFzZSBpbnN0YWxsIGl0Ll0pCisJZmkKKworCUFDX0NIRUNLX0xJQihibGtpZCwgYmxraWRfZ2V0X2NhY2hlLAorCQlbTElCQkxLSUQ9YCRQS0dfQ09ORklHIC0tbGlicyBibGtpZGA7CisJCSBTVEFUSUNfTElCQkxLSUQ9YCRQS0dfQ09ORklHIC0tc3RhdGljIC0tbGlicyBibGtpZGBdLAorCQlbQUNfTVNHX0VSUk9SKFtleHRlcm5hbCBibGtpZCBsaWJyYXJ5IG5vdCBmb3VuZF0pXSwKKwkJWyRMSUJCTEtJRF0pCisJQkxLSURfQ01UPSMKKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgcHJpdmF0ZSBibGtpZCBsaWJyYXJ5XSkKK2Vsc2UKKwlMSUJCTEtJRD0nJChMSUIpL2xpYmJsa2lkJyRMSUJfRVhUCisJREVQTElCQkxLSUQ9JExJQkJMS0lECisJU1RBVElDX0xJQkJMS0lEPSckKExJQikvbGliYmxraWQnJFNUQVRJQ19MSUJfRVhUCisJREVQU1RBVElDX0xJQkJMS0lEPSRTVEFUSUNfTElCQkxLSUQKKwlQUk9GSUxFRF9MSUJCTEtJRD0nJChMSUIpL2xpYmJsa2lkJyRQUk9GSUxFRF9MSUJfRVhUCisJREVQUFJPRklMRURfTElCQkxLSUQ9JFBST0ZJTEVEX0xJQkJMS0lECisJQUNfREVGSU5FKENPTkZJR19CVUlMRF9GSU5ERlMpCisJQUNfTVNHX1JFU1VMVChbRW5hYmxpbmcgcHJpdmF0ZSBibGtpZCBsaWJyYXJ5XSkKK2ZpCissCitMSUJCTEtJRD0nJChMSUIpL2xpYmJsa2lkJyRMSUJfRVhUCitERVBMSUJCTEtJRD0kTElCQkxLSUQKK1NUQVRJQ19MSUJCTEtJRD0nJChMSUIpL2xpYmJsa2lkJyRTVEFUSUNfTElCX0VYVAorREVQU1RBVElDX0xJQkJMS0lEPSRTVEFUSUNfTElCQkxLSUQKK1BST0ZJTEVEX0xJQkJMS0lEPSckKExJQikvbGliYmxraWQnJFBST0ZJTEVEX0xJQl9FWFQKK0RFUFBST0ZJTEVEX0xJQkJMS0lEPSRQUk9GSUxFRF9MSUJCTEtJRAorQUNfREVGSU5FKENPTkZJR19CVUlMRF9GSU5ERlMpCitBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBwcml2YXRlIGJsa2lkIGxpYnJhcnkgYnkgZGVmYXVsdF0pCispCitBQ19TVUJTVChMSUJCTEtJRCkKK0FDX1NVQlNUKERFUExJQkJMS0lEKQorQUNfU1VCU1QoU1RBVElDX0xJQkJMS0lEKQorQUNfU1VCU1QoREVQU1RBVElDX0xJQkJMS0lEKQorQUNfU1VCU1QoUFJPRklMRURfTElCQkxLSUQpCitBQ19TVUJTVChERVBQUk9GSUxFRF9MSUJCTEtJRCkKK0FDX1NVQlNUKEJMS0lEX0NNVCkKK2RubAorZG5sIGhhbmRsZSAtLWVuYWJsZS1kZWJ1Z2ZzCitkbmwKK0FDX0FSR19FTkFCTEUoW2RlYnVnZnNdLAorWyAgLS1kaXNhYmxlLWRlYnVnZnMgICAJICBkaXNhYmxlIHN1cHBvcnQgb2YgZGVidWdmcyBwcm9ncmFtXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyBkZWJ1Z2ZzIHN1cHBvcnRdKQorCURFQlVHRlNfQ01UPSIjIgorZWxzZQorCURFQlVHRlNfQ01UPQorCUFDX01TR19SRVNVTFQoW0VuYWJsaW5nIGRlYnVnZnMgc3VwcG9ydF0pCitmaQorLAorQUNfTVNHX1JFU1VMVChbRW5hYmxpbmcgZGVidWdmcyBzdXBwb3J0IGJ5IGRlZmF1bHRdKQorREVCVUdGU19DTVQ9CispCitBQ19TVUJTVChERUJVR0ZTX0NNVCkKK2RubAorZG5sIGhhbmRsZSAtLWVuYWJsZS1pbWFnZXIKK2RubAorQUNfQVJHX0VOQUJMRShbaW1hZ2VyXSwKK1sgIC0tZGlzYWJsZS1pbWFnZXIgICAJICBkaXNhYmxlIHN1cHBvcnQgb2YgZTJpbWFnZSBwcm9ncmFtXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyBlMmltYWdlIHN1cHBvcnRdKQorCUlNQUdFUl9DTVQ9IiMiCitlbHNlCisJSU1BR0VSX0NNVD0KKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBlMmltYWdlIHN1cHBvcnRdKQorZmkKKywKK0FDX01TR19SRVNVTFQoW0VuYWJsaW5nIGUyaW1hZ2Ugc3VwcG9ydCBieSBkZWZhdWx0XSkKK0lNQUdFUl9DTVQ9CispCitBQ19TVUJTVChJTUFHRVJfQ01UKQorZG5sCitkbmwgaGFuZGxlIC0tZW5hYmxlLXJlc2l6ZXIKK2RubAorQUNfQVJHX0VOQUJMRShbcmVzaXplcl0sCitbICAtLWRpc2FibGUtcmVzaXplciAgIAkgIGRpc2FibGUgc3VwcG9ydCBvZiBlMnJlc2l6ZSBwcm9ncmFtXSwKK2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCUFDX01TR19SRVNVTFQoW0Rpc2FibGluZyBlMnJlc2l6ZSBzdXBwb3J0XSkKKwlSRVNJWkVSX0NNVD0iIyIKK2Vsc2UKKwlSRVNJWkVSX0NNVD0KKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBlMnJlc2l6ZSBzdXBwb3J0XSkKK2ZpCissCitBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBlMnJlc2l6ZSBzdXBwb3J0IGJ5IGRlZmF1bHRdKQorUkVTSVpFUl9DTVQ9CispCitBQ19TVUJTVChSRVNJWkVSX0NNVCkKK2RubAorZG5sIFNlZSB3aGV0aGVyIHRvIGluc3RhbGwgdGhlIGBmc2NrJyB3cmFwcGVyIHByb2dyYW0gKHRoYXQgY2FsbHMgZTJmc2NrKQorZG5sCitBQ19BUkdfRU5BQkxFKFtmc2NrXSwKK1sgIC0tZW5hYmxlLWZzY2sgICAgICAgICAgIGJ1aWxkIGZzY2sgd3JhcHBlciBwcm9ncmFtXSwKK1tpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlGU0NLX1BST0c9JycgRlNDS19NQU49JycKKwlBQ19NU0dfUkVTVUxUKFtOb3QgYnVpbGRpbmcgZnNjayB3cmFwcGVyXSkKK2Vsc2UKKwlGU0NLX1BST0c9ZnNjayBGU0NLX01BTj1mc2NrLjgKKwlBQ19NU0dfUkVTVUxUKFtCdWlsZGluZyBmc2NrIHdyYXBwZXJdKQorZmldCissCitbY2FzZSAiJGhvc3Rfb3MiIGluCisgIGdudSopCisgICAgRlNDS19QUk9HPScnIEZTQ0tfTUFOPScnCisgICAgQUNfTVNHX1JFU1VMVChbTm90IGJ1aWxkaW5nIGZzY2sgd3JhcHBlciBieSBkZWZhdWx0XSkKKyAgICA7OworICAqKQorICAgIEZTQ0tfUFJPRz1mc2NrIEZTQ0tfTUFOPWZzY2suOAorICAgIEFDX01TR19SRVNVTFQoW0J1aWxkaW5nIGZzY2sgd3JhcHBlciBieSBkZWZhdWx0XSkKK2VzYWNdCispCitBQ19TVUJTVChGU0NLX1BST0cpCitBQ19TVUJTVChGU0NLX01BTikKK2RubAorZG5sIFNlZSB3aGV0aGVyIHRvIGluc3RhbGwgdGhlIGBlMmluaXRyZC1oZWxwZXInIHByb2dyYW0KK2RubAorQUNfQVJHX0VOQUJMRShbZTJpbml0cmQtaGVscGVyXSwKK1sgIC0tZW5hYmxlLWUyaW5pdHJkLWhlbHBlciBidWlsZCBlMmluaXRyZC1oZWxwZXIgcHJvZ3JhbV0sCitbaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iCit0aGVuCisJRTJJTklUUkRfUFJPRz0nJyBFMklOSVRSRF9NQU49JycKKwlBQ19NU0dfUkVTVUxUKFtOb3QgYnVpbGRpbmcgZTJpbml0cmQgaGVscGVyXSkKK2Vsc2UKKwlFMklOSVRSRF9QUk9HPWUyaW5pdHJkX2hlbHBlciBFMklOSVRSRF9NQU49ZTJpbml0cmRfaGVscGVyLjgKKwlBQ19NU0dfUkVTVUxUKFtCdWlsZGluZyBlMmluaXRyZCBoZWxwZXJdKQorZmldCissCitFMklOSVRSRF9QUk9HPWUyaW5pdHJkX2hlbHBlciBFMklOSVRSRF9NQU49ZTJpbml0cmRfaGVscGVyLjgKK0FDX01TR19SRVNVTFQoW0J1aWxkaW5nIGUyaW5pdHJkIGhlbHBlciBieSBkZWZhdWx0XSkKKykKK0FDX1NVQlNUKEUySU5JVFJEX1BST0cpCitBQ19TVUJTVChFMklOSVRSRF9NQU4pCitkbmwKK2RubAorZG5sCitBQ19BUkdfRU5BQkxFKFt0bHNdLAorWyAgLS1kaXNhYmxlLXRscyAgICAgICAgICAgZGlzYWJsZSB1c2Ugb2YgdGhyZWFkIGxvY2FsIHN1cHBvcnRdLAorW2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIgordGhlbgorCXRyeV90bHM9IiIKKwlBQ19NU0dfUkVTVUxUKFtEaXNhYmxpbmcgdGhyZWFkIGxvY2FsIHN1cHBvcnRdKQorZWxzZQorCXRyeV90bHM9InllcyIKKwlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyB0aHJlYWQgbG9jYWwgc3VwcG9ydF0pCitmaV0KKywKK2lmIHRlc3QgLW4gIiRXSVRIX0RJRVRfTElCQyIKK3RoZW4KKwl0cnlfdGxzPSIiCisJQUNfTVNHX1JFU1VMVChbRGlldCBsaWJjIGRvZXMgbm90IHN1cHBvcnQgdGhyZWFkIGxvY2FsIHN1cHBvcnRdKQorZWxzZQorCXRyeV90bHM9InllcyIKKwlBQ19NU0dfUkVTVUxUKFtUcnkgdXNpbmcgdGhyZWFkIGxvY2FsIHN1cHBvcnQgYnkgZGVmYXVsdF0pCitmaQorKQoraWYgdGVzdCAiJHRyeV90bHMiID0gInllcyIKK3RoZW4KK0FYX1RMUworZmkKK2RubAorZG5sCitkbmwKK0FDX0FSR19FTkFCTEUoW3V1aWRkXSwKK1sgIC0tZGlzYWJsZS11dWlkZCAgICAgICAgIGRpc2FibGUgYnVpbGRpbmcgdGhlIHV1aWQgZGFlbW9uXSwKK1tpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIKK3RoZW4KKwlBQ19NU0dfUkVTVUxUKFtOb3QgYnVpbGRpbmcgdXVpZGRdKQorCVVVSUREX0NNVD0iIyIKK2Vsc2UKKwlBQ19ERUZJTkUoVVNFX1VVSUREKQorCVVVSUREX0NNVD0iIgorCUFDX01TR19SRVNVTFQoW0J1aWxkaW5nIHV1aWRkXSkKK2ZpXQorLAorQUNfREVGSU5FKFVTRV9VVUlERCkKK1VVSUREX0NNVD0iIgorQUNfTVNHX1JFU1VMVChbQnVpbGRpbmcgdXVpZGQgYnkgZGVmYXVsdF0pCispCitBQ19TVUJTVChVVUlERF9DTVQpCitkbmwKK2RubAorZG5sCitNQUtFRklMRV9MSUJSQVJZPSRzcmNkaXIvbGliL01ha2VmaWxlLmxpYnJhcnkKK0FDX1NVQlNUX0ZJTEUoTUFLRUZJTEVfTElCUkFSWSkKK2RubAorZG5sIEFkZCBpbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0LCB1c2luZyBnZXR0ZXh0LgorZG5sCitHRVRURVhUX1BBQ0tBR0U9ZTJmc3Byb2dzCitQQUNLQUdFPWUyZnNwcm9ncworVkVSU0lPTj0iJEUyRlNQUk9HU19WRVJTSU9OIgorVkVSU0lPTj0wLjE0LjEKK0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiKQorQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIpCitBQ19TVUJTVChHRVRURVhUX1BBQ0tBR0UpCitBQ19TVUJTVChQQUNLQUdFKQorQUNfU1VCU1QoVkVSU0lPTikKKworQU1fR05VX0dFVFRFWFQKK2RubAorZG5sIEVuZCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMKK2RubAorQUNfU1VCU1QoQklOQVJZX1RZUEUpCitBQ19QUk9HX01BS0VfU0VUCitDSEVDS19HTlVfTUFLRQorQUNfUEFUSF9QUk9HKExOLCBsbiwgbG4pCitBQ19QUk9HX0xOX1MKK0FDX1BBVEhfUFJPRyhNViwgbXYsIG12KQorQUNfUEFUSF9QUk9HKENQLCBjcCwgY3ApCitBQ19QQVRIX1BST0coUk0sIHJtLCBybSkKK0FDX1BBVEhfUFJPRyhDSE1PRCwgY2htb2QsIDopCitBQ19QUk9HX0FXSworQUNfUFJPR19FR1JFUAorQUNfUEFUSF9QUk9HKFNFRCwgc2VkLCBzZWQpCitBQ19QQVRIX1BST0coUEVSTCwgcGVybCwgcGVybCkKK0FDX1BBVEhfUFJPRyhMRENPTkZJRywgbGRjb25maWcsIDopCitBQ19DSEVDS19UT09MKEFSLCBhciwgYXIpCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQorQUNfQ0hFQ0tfVE9PTChTVFJJUCwgc3RyaXAsIDopCitBQ19DSEVDS19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgbWFrZWluZm8sICkKK2lmIHRlc3QgIl8kTUFLRUlORk8iID0gIl8iOyB0aGVuCisgICAgTUFLRUlORk89IkBlY2hvIE1ha2VpbmZvIGlzIG1pc3NpbmcuIEluZm8gZG9jdW1lbnRhdGlvbiB3aWxsIG5vdCBiZSBidWlsdC47dHJ1ZSIKK2Vsc2UKKyAgICBjYXNlICIkTUFLRUlORk8iIGluCisgICAgICAqL21pc3NpbmcuKikKKyAgICAgICAgQUNfTVNHX1dBUk4oWworKioqIE1ha2VpbmZvIGlzIG1pc3NpbmcuIEluZm8gZG9jdW1lbnRhdGlvbiB3aWxsIG5vdCBiZSBidWlsdC5dKQorICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgOzsKKyAgICBlc2FjCitmaQorQUNfU1VCU1QoTUFLRUlORk8pCitBQ19QUk9HX0lOU1RBTEwKKyMgU2VlIGlmIHdlIG5lZWQgYSBzZXBhcmF0ZSBuYXRpdmUgY29tcGlsZXIuCitpZiB0ZXN0ICRjcm9zc19jb21waWxpbmcgPSBubzsgdGhlbgorICBCVUlMRF9DQz0iJENDIgorICBBQ19TVUJTVChCVUlMRF9DQykKK2Vsc2UKKyAgQUNfQ0hFQ0tfUFJPR1MoQlVJTERfQ0MsIGdjYyBjYykKK2ZpCitBQ19DSEVDS19IRUFERVJTKGRpcmVudC5oIGVycm5vLmggZ2V0b3B0LmggbWFsbG9jLmggbW50ZW50LmggcGF0aHMuaCBzZW1hcGhvcmUuaCBzZXRqbXAuaCBzaWduYWwuaCBzdGRhcmcuaCBzdGRpbnQuaCBzdGRsaWIuaCB0ZXJtaW9zLmggdGVybWlvLmggdW5pc3RkLmggdXRpbWUuaCBsaW51eC9mZC5oIGxpbnV4L21ham9yLmggbmV0L2lmX2RsLmggbmV0aW5ldC9pbi5oIHN5cy9kaXNrbGFiZWwuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIHN5cy9ta2Rldi5oIHN5cy9tbWFuLmggc3lzL3ByY3RsLmggc3lzL3F1ZXVlLmggc3lzL3Jlc291cmNlLmggc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaCBzeXMvc29ja2lvLmggc3lzL3N0YXQuaCBzeXMvc3lzY2FsbC5oIHN5cy9zeXNtYWNyb3MuaCBzeXMvdGltZS5oIHN5cy90eXBlcy5oIHN5cy91bi5oIHN5cy93YWl0LmgpCitBQ19DSEVDS19IRUFERVJTKHN5cy9kaXNrLmggc3lzL21vdW50LmgsLCwKK1tbCisjaWYgSEFWRV9TWVNfUVVFVUVfSAorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCitdXSkKK0FDX0NIRUNLX0hFQURFUlMobmV0L2lmLmgsLCwKK1tbCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfU09DS0VUCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCitdXSkKK0FDX0ZVTkNfVlBSSU5URgorZG5sIENoZWNrIHRvIHNlZSBpZiBkaXJlbnQgaGFzIG1lbWJlciBkX3JlY2xlbi4gT24gY3lnd2luIHRob3NlIGRfcmVjbGVuCitkbmwgaXMgbm90IGRlY2xlYXJlZC4KK0FDX0NIRUNLX01FTUJFUihzdHJ1Y3QgZGlyZW50LmRfcmVjbGVuLFtBQ19ERUZJTkUoSEFWRV9SRUNMRU5fRElSRU5UKV0sLAorCQlbI2luY2x1ZGUgPGRpcmVudC5oPl0pCitkbmwgQ2hlY2sgdG8gc2VlIGlmIHNzaXplX3Qgd2FzIGRlY2xlYXJlZAorQUNfQ0hFQ0tfVFlQRShzc2l6ZV90LFtBQ19ERUZJTkUoSEFWRV9UWVBFX1NTSVpFX1QpXSwsCisJICAgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dKQorZG5sCitkbmwgQ2hlY2sgdG8gc2VlIGlmIGxsc2VlaygpIGlzIGRlY2xhcmVkIGluIHVuaXN0ZC5oLiAgT24gc29tZSBsaWJjJ3MgCitkbmwgaXQgaXMsIGFuZCBvbiBvdGhlcnMgaXQgaXNuJ3QuLi4uLiBUaGFuayB5b3UgZ2xpYmMgZGV2ZWxvcGVycy4uLi4KK2RubAorQUNfQ0hFQ0tfREVDTChsbHNlZWssW0FDX0RFRklORShIQVZFX0xMU0VFS19QUk9UT1RZUEUpXSwsCisJICAgICAgWyNpbmNsdWRlIDx1bmlzdGQuaD5dKQorZG5sCitkbmwgQ2hlY2sgdG8gc2VlIGlmIGxzZWVrNjQoKSBpcyBkZWNsYXJlZCBpbiB1bmlzdGQuaC4gIEdsaWJjJ3MgaGVhZGVyIGZpbGVzCitkbmwgYXJlIHNvIGNvbnZvbHV0ZWQgdGhhdCBJIGNhbid0IHRlbGwgd2hldGhlciBpdCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLAorZG5sIGFuZCBpZiBpdCBpc24ndCBkZWZpbmVkIHdoaWxlIGxzZWVrNjQgaXMgZGVmaW5lZCBpbiB0aGUgbGlicmFyeSwgCitkbmwgZGlzYXN0ZXIgd2lsbCBzdHJpa2UuICAKK2RubAorZG5sIFdhcm5pbmchICBVc2Ugb2YgLS1lbmFibGUtZ2NjLXdhbGwgbWF5IHRocm93IG9mZiB0aGlzIHRlc3QuCitkbmwKK2RubAorQUNfQ0hFQ0tfREVDTChsc2VlazY0LFtBQ19ERUZJTkUoSEFWRV9MU0VFSzY0X1BST1RPVFlQRSldLCwKKwkJWyNkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UKKwkJICNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQorCQkgI2luY2x1ZGUgPHVuaXN0ZC5oPl0pCitkbmwKK2RubCBXb3JkIHNpemVzLi4uCitkbmwKK0FDX0NIRUNLX1NJWkVPRihzaG9ydCkKK0FDX0NIRUNLX1NJWkVPRihpbnQpCitBQ19DSEVDS19TSVpFT0YobG9uZykKK0FDX0NIRUNLX1NJWkVPRihsb25nIGxvbmcpCitTSVpFT0ZfU0hPUlQ9JGFjX2N2X3NpemVvZl9zaG9ydAorU0laRU9GX0lOVD0kYWNfY3Zfc2l6ZW9mX2ludAorU0laRU9GX0xPTkc9JGFjX2N2X3NpemVvZl9sb25nCitTSVpFT0ZfTE9OR19MT05HPSRhY19jdl9zaXplb2ZfbG9uZ19sb25nCitBQ19TVUJTVChTSVpFT0ZfU0hPUlQpCitBQ19TVUJTVChTSVpFT0ZfSU5UKQorQUNfU1VCU1QoU0laRU9GX0xPTkcpCitBQ19TVUJTVChTSVpFT0ZfTE9OR19MT05HKQorQUNfQ19CSUdFTkRJQU4KK0JVSUxEX0NDPSIkQlVJTERfQ0MiIENQUD0iJENQUCIgL2Jpbi9zaCAkYWNfYXV4X2Rpci9wYXJzZS10eXBlcy5zaAorQVNNX1RZUEVTX0hFQURFUj0uL2FzbV90eXBlcy5oCitBQ19TVUJTVF9GSUxFKEFTTV9UWVBFU19IRUFERVIpCitkbmwKK2RubCBTYXZlIHRoZSBjb25maWd1cmF0aW9uICNkZWZpbmVzIG5lZWRlZCBmb3IgdGhlIHB1YmxpYyBleHQyZnMuaAorZG5sIGhlYWRlciBmaWxlCitkbmwKK2VjaG8gIi8qIFRoZXNlIGRlZmluZXMgYXJlIG5lZWRlZCBmb3IgdGhlIHB1YmxpYyBleHQyZnMuaCBoZWFkZXIgZmlsZSAqLyIgXAorICAgICA+IHB1YmxpY19jb25maWcuaAoraWYgZ3JlcCBIQVZFX1NZU19UWVBFU19IIGNvbmZkZWZzLmggPiB0bXBfY29uZmlnLiQkOyB0aGVuCisgIHVuaXEgdG1wX2NvbmZpZy4kJCA+PiBwdWJsaWNfY29uZmlnLmgKK2Vsc2UKKyAgZWNobyAiI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0giID4+IHB1YmxpY19jb25maWcuaAorZmkKK2lmIGdyZXAgV09SRFNfQklHRU5ESUFOIGNvbmZkZWZzLmggPiB0bXBfY29uZmlnLiQkOyB0aGVuCisgIHVuaXEgdG1wX2NvbmZpZy4kJCA+PiBwdWJsaWNfY29uZmlnLmgKK2Vsc2UKKyAgZWNobyAiI3VuZGVmIFdPUkRTX0JJR0VORElBTiIgPj4gcHVibGljX2NvbmZpZy5oCitmaQorcm0gLWYgdG1wX2NvbmZpZy4kJAorUFVCTElDX0NPTkZJR19IRUFERVI9Li9wdWJsaWNfY29uZmlnLmgKK0FDX1NVQlNUX0ZJTEUoUFVCTElDX0NPTkZJR19IRUFERVIpCitkbmwKK2RubCBTZWUgaWYgd2UgaGF2ZSBpbnR0eXBlcy5oIGFuZCBpZiBpbnRwdHJfdCBpcyBkZWZpbmVkCitkbmwKK0FDX0NIRUNLX0hFQURFUlMoW2ludHR5cGVzLmhdKQorQUNfQ0hFQ0tfVFlQRVMoaW50cHRyX3QpCitkbmwKK2RubCBTZWUgaWYgc3RydWN0IHN0YXQgaGFzIGEgc3RfZmxhZ3MgZmllbGQsIGluIHdoaWNoIGNhc2Ugd2UgY2FuIGdldCBmaWxlCitkbmwgZmxhZ3Mgc29tZXdoYXQgcG9ydGFibHkuICBBbHNvIGNoZWNrIGZvciB0aGUgYW5hbG9nb3VzIHNldHRlciwgY2hmbGFncygpLgorZG5sCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBzdHJ1Y3Qgc3RhdCBoYXMgYSBzdF9mbGFncyBmaWVsZCkKK0FDX0NBQ0hFX1ZBTChlMmZzcHJvZ3NfY3Zfc3RydWN0X3N0X2ZsYWdzLAorCUFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3N0YXQuaD5dLAorCQlbc3RydWN0IHN0YXQgc3RhdDsgc3RhdC5zdF9mbGFncyA9IDA7XSwKKwkJW2UyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3M9eWVzXSwKKwkJW2UyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3M9bm9dKSkKK0FDX01TR19SRVNVTFQoJGUyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3MpCitpZiB0ZXN0ICIkZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFncyIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgc3RfZmxhZ3MgZmllbGQgaXMgdXNlZnVsKQorICBBQ19DQUNIRV9WQUwoZTJmc3Byb2dzX2N2X3N0cnVjdF9zdF9mbGFnc19pbW11dCwKKwlBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9zdGF0Lmg+XSwKKwkJW3N0cnVjdCBzdGF0IHN0YXQ7IHN0YXQuc3RfZmxhZ3MgfD0gVUZfSU1NVVRBQkxFO10sCisJCVtlMmZzcHJvZ3NfY3Zfc3RydWN0X3N0X2ZsYWdzX2ltbXV0PXllc10sCisJCVtlMmZzcHJvZ3NfY3Zfc3RydWN0X3N0X2ZsYWdzX2ltbXV0PW5vXSkpCisgIEFDX01TR19SRVNVTFQoJGUyZnNwcm9nc19jdl9zdHJ1Y3Rfc3RfZmxhZ3NfaW1tdXQpCisgIGlmIHRlc3QgIiRlMmZzcHJvZ3NfY3Zfc3RydWN0X3N0X2ZsYWdzX2ltbXV0IiA9IHllczsgdGhlbgorCSAgQUNfREVGSU5FKEhBVkVfU1RBVF9GTEFHUykKKyAgZmkKK2ZpCitkbmwKK2RubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIFNBX0xFTgorZG5sCitBQ19DSEVDS19NRU1CRVIoc3RydWN0IHNvY2thZGRyLnNhX2xlbiwKKwkJQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfU0FfTEVOLDEsW0RlZmluZSBpZiBzdHJ1Y3Qgc29ja2FkZHIgY29udGFpbnMgc2FfbGVuXSksLAorCVsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSkKK2RubAorZG5sIFRoaXMgd2lsbCBhZGQgLWxibGtpZCB0byB0aGUgQUNfQ0hFQ0tfRlVOQ1Mgc2VhcmNoIGlmIHdlIGFyZSB1c2luZworZG5sIHRoZSBzeXN0ZW0tcHJvdmlkZWQgYmxraWQgbGlicmFyeQorZG5sCitpZiB0ZXN0IC1uICIkQkxLSURfQ01UIjsgdGhlbgorICBBQ19TRUFSQ0hfTElCUyhbYmxraWRfcHJvYmVfYWxsXSwgW2Jsa2lkXSkKK2ZpCitkbmwKK0FDX0NIRUNLX0ZVTkNTKGNoZmxhZ3MgZ2V0cnVzYWdlIGxsc2VlayBsc2VlazY0IG9wZW42NCBmc3RhdDY0IGZ0cnVuY2F0ZTY0IGdldG1udGluZm8gc3RydG91bGwgc3RyY2FzZWNtcCBzcmFuZG9tIGpyYW5kNDggZmNob3duIG1hbGxpbmZvIGZkYXRhc3luYyBzdHJubGVuIHN0cnB0aW1lIHN0cmR1cCBzeXNjb25mIHBhdGhjb25mIHBvc2l4X21lbWFsaWduIG1lbWFsaWduIHZhbGxvYyBfX3NlY3VyZV9nZXRlbnYgcHJjdGwgbW1hcCB1dGltZSBzZXRyZXN1aWQgc2V0cmVzZ2lkIHVzbGVlcCBuYW5vc2xlZXAgZ2V0ZHRhYmxlc2l6ZSBnZXRybGltaXQgYmxraWRfcHJvYmVfZ2V0X3RvcG9sb2d5KQorZG5sCitkbmwgQ2hlY2sgdG8gc2VlIGlmIC1sc29ja2V0IGlzIHJlcXVpcmVkIChzb2xhcmlzKSB0byBtYWtlIHNvbWV0aGluZworZG5sIHRoYXQgdXNlcyBzb2NrZXQoKSB0byBjb21waWxlOyB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIFVVSUQgbGlicmFyeQorZG5sCitTT0NLRVRfTElCPScnCitBQ19DSEVDS19MSUIoc29ja2V0LCBzb2NrZXQsIFtTT0NLRVRfTElCPS1sc29ja2V0XSkKK0FDX1NVQlNUKFNPQ0tFVF9MSUIpCitkbmwKK2RubCBTZWUgaWYgb3B0cmVzZXQgZXhpc3RzCitkbmwKK0FDX01TR19DSEVDS0lORyhmb3Igb3B0cmVzZXQpCitBQ19DQUNIRV9WQUwoYWNfY3ZfaGF2ZV9vcHRyZXNldCwKK1tBQ19FR1JFUF9IRUFERVIob3B0cmVzZXQsIHVuaXN0ZC5oLAorICBhY19jdl9oYXZlX29wdHJlc2V0PXllcywgYWNfY3ZfaGF2ZV9vcHRyZXNldD1ubyldKWRubAorQUNfTVNHX1JFU1VMVCgkYWNfY3ZfaGF2ZV9vcHRyZXNldCkKK2lmIHRlc3QgJGFjX2N2X2hhdmVfb3B0cmVzZXQgPSB5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKEhBVkVfT1BUUkVTRVQpCitmaQorZG5sCitkbmwgVGVzdCBmb3Igc2VtX2luaXQsIGFuZCB3aGljaCBsaWJyYXJ5IGl0IG1pZ2h0IHJlcXVpcmU6CitkbmwKK1NFTV9JTklUX0xJQj0nJworQUNfQ0hFQ0tfRlVOQyhzZW1faW5pdCwgLAorICBBQ19DSEVDS19MSUIocHRocmVhZCwgc2VtX2luaXQsCisgIAlBQ19ERUZJTkUoSEFWRV9TRU1fSU5JVCkKKyAgCVNFTV9JTklUX0xJQj0tbHB0aHJlYWQsCisgIEFDX0NIRUNLX0xJQihydCwgc2VtX2luaXQsCisgIAlBQ19ERUZJTkUoSEFWRV9TRU1fSU5JVCkKKyAgCVNFTV9JTklUX0xJQj0tbHJ0LAorICBBQ19DSEVDS19MSUIocG9zaXg0LCBzZW1faW5pdCwKKyAgCUFDX0RFRklORShIQVZFX1NFTV9JTklUKQorICAJU0VNX0lOSVRfTElCPS1scG9zaXg0KSkpKWRubAorQUNfU1VCU1QoU0VNX0lOSVRfTElCKQorZG5sCitkbmwgQ2hlY2sgZm9yIHVuaWZpZWQgZGlmZgorZG5sCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHVuaWZpZWQgZGlmZiBvcHRpb24pCitpZiBkaWZmIC11ICQwICQwID4gL2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICBVTklfRElGRl9PUFRTPS11CitlbHNlCisgICBVTklfRElGRl9PUFRTPS1jCitmaQorQUNfTVNHX1JFU1VMVCgkVU5JX0RJRkZfT1BUUykKK0FDX1NVQlNUKFVOSV9ESUZGX09QVFMpCitkbmwKK2RubCBXZSB1c2UgdGhlIEVYVDIgaW9jdGxzIG9ubHkgdW5kZXIgTGludXgKK2RubAorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisJQUNfREVGSU5FKEhBVkVfRVhUMl9JT0NUTFMpCisJOzsKK2VzYWMKK2RubAorZG5sIE9TLXNwZWNpZmljIHVuY29tbWVudCBjb250cm9sCitkbmwKK0xJTlVYX0NNVD0iIyIKK0NZR1dJTl9DTVQ9IiMiCitVTklYX0NNVD0KK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQorCUxJTlVYX0NNVD0KKwk7OworY3lnd2luKQorCUNZR1dJTl9DTVQ9CisJVU5JWF9DTVQ9IiMiCisJOzsKK2VzYWMKK0FDX1NVQlNUKExJTlVYX0NNVCkKK0FDX1NVQlNUKENZR1dJTl9DTVQpCitBQ19TVUJTVChVTklYX0NNVCkKK2RubAorZG5sIExpbnV4IGFuZCBIdXJkIHBsYWNlcyByb290IGZpbGVzIGluIHRoZSAvIGJ5IGRlZmF1bHQKK2RubAorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCogfCBnbnUqIHwgaypic2QqLWdudSkKKwlpZiB0ZXN0ICIkcHJlZml4IiA9IE5PTkUgLWEgIiRyb290X3ByZWZpeCIgPSBOT05FIDsgdGhlbgorCQlyb290X3ByZWZpeD0iIjsKKwkJQUNfTVNHX1JFU1VMVChbT24gJGhvc3Rfb3Mgc3lzdGVtcywgcm9vdF9wcmVmaXggZGVmYXVsdHMgdG8gJyddKQorCWZpCisJOzsKK2VzYWMKK2RubAorZG5sIE9uIExpbnV4L2h1cmQsIGZvcmNlIHRoZSBwcmVmaXggdG8gYmUgL3VzcgorZG5sCitjYXNlICIkaG9zdF9vcyIgaW4KK2xpbnV4KiB8IGdudSogfCBrKmJzZCotZ251KQorCWlmIHRlc3QgIiRwcmVmaXgiID0gTk9ORSA7IHRoZW4KKwkJcHJlZml4PSIvdXNyIjsKKwkJQUNfTVNHX1JFU1VMVChbT24gJGhvc3Rfb3Mgc3lzdGVtcywgcHJlZml4IGRlZmF1bHRzIHRvIC91c3JdKQorCQlpZiB0ZXN0ICIkbWFuZGlyIiA9ICcke3ByZWZpeH0vbWFuJyA7IHRoZW4KKwkJCUFDX01TR19SRVNVTFQoWy4uLmFuZCBtYW5kaXIgZGVmYXVsdHMgdG8gL3Vzci9zaGFyZS9tYW5dKQorCQkJbWFuZGlyPS91c3Ivc2hhcmUvbWFuCisJCWZpCisJZmkKKzs7Citlc2FjCitpZiB0ZXN0ICIkcm9vdF9wcmVmaXgiID0gTk9ORSA7IHRoZW4KKwlpZiB0ZXN0ICIkcHJlZml4IiA9IE5PTkUgOyB0aGVuCisJCXJvb3RfcHJlZml4PSIkYWNfZGVmYXVsdF9wcmVmaXgiCisJZWxzZQorCQlyb290X3ByZWZpeD0iJHByZWZpeCIKKwlmaQorCXJvb3RfYmluZGlyPSRiaW5kaXIKKwlyb290X3NiaW5kaXI9JHNiaW5kaXIKKwlyb290X2xpYmRpcj0kbGliZGlyCisJcm9vdF9zeXNjb25mZGlyPSRzeXNjb25mZGlyCitlbHNlCisJcm9vdF9iaW5kaXI9JyR7cm9vdF9wcmVmaXh9L2JpbicKKwlyb290X3NiaW5kaXI9JyR7cm9vdF9wcmVmaXh9L3NiaW4nCisJcm9vdF9saWJkaXI9JyR7cm9vdF9wcmVmaXh9L2xpYicKKwlyb290X3N5c2NvbmZkaXI9JyR7cm9vdF9wcmVmaXh9L2V0YycKK2ZpCitpZiB0ZXN0ICIkYmluZGlyIiAhPSAnJHtleGVjX3ByZWZpeH0vYmluJzsgdGhlbgorICAgIHJvb3RfYmluZGlyPSRiaW5kaXIKKyAgICBBQ19NU0dfUkVTVUxUKFtTZXR0aW5nIHJvb3RfYmluZGlyIHRvICRyb290X2JpbmRpcl0pCitmaQoraWYgdGVzdCAiJHNiaW5kaXIiICE9ICcke2V4ZWNfcHJlZml4fS9zYmluJzsgdGhlbgorICAgIHJvb3Rfc2JpbmRpcj0kc2JpbmRpcgorICAgIEFDX01TR19SRVNVTFQoW1NldHRpbmcgcm9vdF9zYmluZGlyIHRvICRyb290X3NiaW5kaXJdKQorZmkKK2lmIHRlc3QgIiRsaWJkaXIiICE9ICcke2V4ZWNfcHJlZml4fS9saWInOyB0aGVuCisgICAgcm9vdF9saWJkaXI9JGxpYmRpcgorICAgIEFDX01TR19SRVNVTFQoW1NldHRpbmcgcm9vdF9saWJkaXIgdG8gJHJvb3RfbGliZGlyXSkKK2ZpCitpZiB0ZXN0ICIkc3lzY29uZmRpciIgIT0gJyR7cHJlZml4fS9ldGMnOyB0aGVuCisgICAgcm9vdF9zeXNjb25mZGlyPSRzeXNjb25mZGlyCisgICAgQUNfTVNHX1JFU1VMVChbU2V0dGluZyByb290X3N5c2NvbmZkaXIgdG8gJHJvb3Rfc3lzY29uZmRpcl0pCitmaQorQUNfU1VCU1Qocm9vdF9wcmVmaXgpCitBQ19TVUJTVChyb290X2JpbmRpcikKK0FDX1NVQlNUKHJvb3Rfc2JpbmRpcikKK0FDX1NVQlNUKHJvb3RfbGliZGlyKQorQUNfU1VCU1Qocm9vdF9zeXNjb25mZGlyKQorZG5sCitkbmwgU2VlIGlmIC1zdGF0aWMgd29ya3MuCitkbmwKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBsaW5rZXIgYWNjZXB0cyAtc3RhdGljXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9lMmZzcHJvZ3NfdXNlX3N0YXRpYywKK1tTQVZFX0xERkxBR1M9JExERkxBR1M7IExERkxBR1M9IiRMREZMQUdTIC1zdGF0aWMiCitBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGlvLmg+XSxbZmZsdXNoKHN0ZG91dCk7XSwKKyBhY19jdl9lMmZzcHJvZ3NfdXNlX3N0YXRpYz15ZXMsIGFjX2N2X2UyZnNwcm9nc191c2Vfc3RhdGljPW5vKQorTERGTEFHUz0kU0FWRV9MREZMQUdTXSkKK2RubAorZG5sIFJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0ZXN0IHR1cm5zIG91dCwgU29sYXJpcyBkb2Vzbid0IGhhbmRsZSAtc3RhdGljCitkbmwgVGhpcyBpcyBjYXVzZWQgYnkgdGhlIHNvY2tldCBsaWJyYXJ5IHJlcXVpcmluZyB0aGUgbnNsIGxpYnJhcnksIHdoaWNoCitkbmwgcmVxdWlyZXMgdGhlIC1kbCBsaWJyYXJ5LCB3aGljaCBvbmx5IHdvcmtzIGZvciBkeW5hbWljYWxseSBsaW5rZWQgCitkbmwgcHJvZ3JhbXMuICBJdCBiYXNpY2FsbHkgbWVhbnMgeW91IGNhbid0IGhhdmUgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMKK2RubCB3aGljaCB1c2UgdGhlIG5ldHdvcmsgdW5kZXIgU29sYXJpcy4gIAorZG5sCitjYXNlICIkaG9zdF9vcyIgaW4KK3NvbGFyaXMyLiopCisJYWNfY3ZfZTJmc3Byb2dzX3VzZV9zdGF0aWM9bm8JCis7OworZXNhYworQUNfTVNHX1JFU1VMVCgkYWNfY3ZfZTJmc3Byb2dzX3VzZV9zdGF0aWMpCitMREZMQUdfU1RBVElDPQoraWYgdGVzdCAkYWNfY3ZfZTJmc3Byb2dzX3VzZV9zdGF0aWMgPSB5ZXM7IHRoZW4KKwlMREZMQUdfU1RBVElDPS1zdGF0aWMKK2ZpCitBQ19TVUJTVChMREZMQUdfU1RBVElDKQorZG5sCitkbmwgV29yayBhcm91bmQgbXlzdGVyaW91cyBEYXJ3aW4gLyBHTlUgbGliaW50bCBwcm9ibGVtCitkbmwgKF9fYXNtX18gcmVkaXJlY3Rpb24gZG9lc24ndCB3b3JrIGZvciBzb21lIG15c3RlcmlvdXMgcmVhc29uLiAgTG9va3MgbGlrZQorZG5sIEFwcGxlIGhhY2tlZCBnY2Mgc29tZWhvdz8pCitkbmwKK2Nhc2UgIiRob3N0X29zIiBpbgorZGFyd2luKikKKwlBQ19NU0dfUkVTVUxUKFtVc2luZyBBcHBsZSBEYXJ3aW4gLyBHTlUgbGliaW50bCB3b3JrYXJvdW5kXSkKKwlBQ19ERUZJTkUoX0lOVExfUkVESVJFQ1RfTUFDUk9TKQorCTs7Citlc2FjCitkbmwKK2RubCBNYWtlIHRoZSBzcyBhbmQgZXQgZGlyZWN0b3JpZXMgd29yayBjb3JyZWN0bHkuCitkbmwKK1NTX0RJUj1gY2QgJHtzcmNkaXJ9L2xpYi9zczsgcHdkYAorRVRfRElSPWBjZCAke3NyY2Rpcn0vbGliL2V0OyBwd2RgCitBQ19TVUJTVChTU19ESVIpCitBQ19TVUJTVChFVF9ESVIpCitkbmwKK2RubCBPbmx5IHRyeSB0byBydW4gdGhlIHRlc3Qgc3VpdGUgaWYgd2UncmUgbm90IGNyb3NzIGNvbXBpbGluZy4KK2RubAoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgOyB0aGVuCisgIERPX1RFU1RfU1VJVEU9CitlbHNlCisgIERPX1RFU1RfU1VJVEU9Y2hlY2sKK2ZpCitBQ19TVUJTVChET19URVNUX1NVSVRFKQorZG5sCitkbmwgT25seSBpbmNsdWRlIHRoZSBpbnRsIGluY2x1ZGUgZmlsZXMgaWYgd2UncmUgYnVpbGRpbmcgd2l0aCB0aGVtCitkbmwgCitJTlRMX0ZMQUdTPQoraWYgdGVzdCAiJFVTRV9JTkNMVURFRF9MSUJJTlRMIiA9ICJ5ZXMiIDsgdGhlbgorCUlOVExfRkxBR1M9Jy1JJCh0b3BfYnVpbGRkaXIpL2ludGwgLUkkKHRvcF9zcmNkaXIpL2ludGwnCitmaQorQUNfU1VCU1QoSU5UTF9GTEFHUykKK2RubAorZG5sIEJ1aWxkIENGTEFHUworZG5sCitpZiB0ZXN0ICRjcm9zc19jb21waWxpbmcgPSBubzsgdGhlbgorICAgQlVJTERfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgQlVJTERfTERGTEFHUz0iJExERkxBR1MiCitlbHNlCisgICBCVUlMRF9DRkxBR1M9CisgICBCVUlMRF9MREZMQUdTPQorZmkKK0FDX1NVQlNUKEJVSUxEX0NGTEFHUykKK0FDX1NVQlNUKEJVSUxEX0xERkxBR1MpCitkbmwKK2RubCBNYWtlIG91ciBvdXRwdXQgZmlsZXMsIGJlaW5nIHN1cmUgdGhhdCB3ZSBjcmVhdGUgdGhlIHNvbWUgbWlzY2VsbGFuZW91cyAKK2RubCBkaXJlY3RvcmllcworZG5sCit0ZXN0IC1kIGxpYiB8fCBta2RpciBsaWIKK3Rlc3QgLWQgaW5jbHVkZSB8fCBta2RpciBpbmNsdWRlCit0ZXN0IC1kIGluY2x1ZGUvbGludXggfHwgbWtkaXIgaW5jbHVkZS9saW51eAordGVzdCAtZCBpbmNsdWRlL2FzbSB8fCBta2RpciBpbmNsdWRlL2FzbQorZm9yIGkgaW4gTUNPTkZJRyBNYWtlZmlsZSBlMmZzcHJvZ3Muc3BlYyBcCisJdXRpbC9NYWtlZmlsZSB1dGlsL3N1YnN0LmNvbmYgdXRpbC9nZW4tdGFyYmFsbCBcCisJbGliL2V0L01ha2VmaWxlIGxpYi9zcy9NYWtlZmlsZSBsaWIvZTJwL01ha2VmaWxlIFwKKwlsaWIvZXh0MmZzL01ha2VmaWxlIGxpYi9leHQyZnMvZXh0Ml90eXBlcy5oIFwKKwlsaWIvdXVpZC9NYWtlZmlsZSBsaWIvdXVpZC91dWlkX3R5cGVzLmggXAorCWxpYi9ibGtpZC9NYWtlZmlsZSBsaWIvYmxraWQvYmxraWRfdHlwZXMuaCBcCisJbGliL3NzL3NzLnBjIGxpYi91dWlkL3V1aWQucGMgbGliL2V0L2NvbV9lcnIucGMgXAorCWxpYi9lMnAvZTJwLnBjIGxpYi9ibGtpZC9ibGtpZC5wYyBsaWIvZXh0MmZzL2V4dDJmcy5wYyBcCisJbWlzYy9NYWtlZmlsZSBleHQyZWQvTWFrZWZpbGUgZTJmc2NrL01ha2VmaWxlIFwKKwlkZWJ1Z2ZzL01ha2VmaWxlIHRlc3RzL01ha2VmaWxlIHRlc3RzL3Byb2dzL01ha2VmaWxlIFwKKwlyZXNpemUvTWFrZWZpbGUgZG9jL01ha2VmaWxlIGludGwvTWFrZWZpbGUgXAorCWludGwvbGliZ251aW50bC5oIHBvL01ha2VmaWxlLmluIDsgZG8KKwlpZiB0ZXN0IC1kIGBkaXJuYW1lICR7c3JjZGlyfS8kaWAgOyB0aGVuCisJCW91dGxpc3Q9IiRvdXRsaXN0ICRpIgorCWZpCitkb25lCitBQ19PVVRQVVQoJG91dGxpc3QpCitpZiB0ZXN0IC1mIHV0aWwvZ2VuLXRhcmJhbGw7IHRoZW4gY2htb2QgK3ggdXRpbC9nZW4tdGFyYmFsbDsgZmkKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZGVwZml4LnNlZCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZGVwZml4LnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzNhODkzCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9kZXBmaXguc2VkCkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgSW5zZXJ0IHRoZSBoZWFkZXIuLi4uLgorIworMWlcCisjICsrKyBEZXBlbmRlbmN5IGxpbmUgZWF0ZXIgKysrXAorIyBcCisjIE1ha2VmaWxlIGRlcGVuZGVuY2llcyBmb2xsb3cuICBUaGlzIG11c3QgYmUgdGhlIGxhc3Qgc2VjdGlvbiBpblwKKyMgdGhlIE1ha2VmaWxlLmluIGZpbGVcCisjCisKKyMKKyMgUmVtb3ZlIGxpbmUgY29udGludWF0aW9ucy4uLi4KKyMKKzpGSVJTVAoreS8JLyAvCitzL14gKi8vCisvXFwkL3sKK04KK3kvCS8gLworcy9cXFxuICovIC8KK2JGSVJTVAorfQorcy8gICovIC9nCisKK3M7L3Vzci9pbmNsdWRlL1teIF0qICo7O2cKK3M7L3Vzci9saWIvW14gXSogKjs7ZworczsvbWl0L2N5Z251c1teIF0qICo7O2cKK3M7Li4vW14gXSpsaWIvYmxraWQvYmxraWRbXiBdKiAqOztnCitzOy4uL1teIF0qbGliL3V1aWQvdXVpZC5oW14gXSogKjs7ZworCisjCisjIE5vdyBpbnNlcnQgYSB0cmFpbGluZyBuZXdsaW5lLi4uCisjCiskYVwKKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9kb2MvTWFrZWZpbGUuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2RvYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk4ZDVmCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9kb2MvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw3OCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGRvYyBkaXJlY3RvcnkKKyMKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3RvcF9idWlsZGRpciA9IC4uCitteV9kaXIgPSBkb2MKK0lOU1RBTEwgPSBASU5TVEFMTEAKKworQE1DT05GSUdACisKK0RWST10ZXhpMmR2aQorRFZJUFM9ZHZpcHMgLW8gIiRAIgorSU5GTz1ATUFLRUlORk9ACitIVE1MPXRleGkyaHRtbCAtc3BsaXRfY2hhcHRlcgorCithbGw6OiBsaWJleHQyZnMuaW5mbyBsaWJleHQyZnMuZHZpCisKK2luc3RhbGwtZG9jLWxpYnM6IGxpYmV4dDJmcy5pbmZvIGxpYmV4dDJmcy5kdmkKKwkkKFEpICQoUk0pIC1yZiAkKERFU1RESVIpJChpbmZvZGlyKS9saWJleHQyZnMuaW5mbyoKKwkkKEUpICIJTUtJTlNUQUxMRElSUyAkKGluZm9kaXIpIgorCSQoUSkgJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChpbmZvZGlyKQorCS0kKFEpIGZvciBpIGluIGxpYmV4dDJmcy5pbmZvKiA7IGRvIFwKKwkJZWNobyAiCUlOU1RBTExfREFUQSAkKGluZm9kaXIpLyQkaSIgOyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQoaW5mb2RpcikvJCRpIDsgXAorCWRvbmUKKwkkKEUpICIJR1pJUCAkKGluZm9kaXIpL2xpYmV4dDJmcy5pbmZvKiIKKwktJChRKSBnemlwIC05ICQoREVTVERJUikkKGluZm9kaXIpL2xpYmV4dDJmcy5pbmZvKgorCit1bmluc3RhbGwtZG9jLWxpYnM6CisJJChSTSkgLXJmICQoREVTVERJUikkKGluZm9kaXIpL2xpYmV4dDJmcy5pbmZvKgorCitsaWJleHQyZnMuaW5mbzogJChzcmNkaXIpL2xpYmV4dDJmcy50ZXhpbmZvCisJJChFKSAiCU1BS0VJTkZPICRAIgorCS0kKFEpICQoSU5GTykgJChzcmNkaXIpL2xpYmV4dDJmcy50ZXhpbmZvCisKK2xpYmV4dDJmcy5kdmk6ICQoc3JjZGlyKS9saWJleHQyZnMudGV4aW5mbworCSQoRSkgIglURVhJMkRWSSAkQCIKKwktJChRKSAkKERWSSkgJChzcmNkaXIpL2xpYmV4dDJmcy50ZXhpbmZvCisKK2xpYmV4dDJmc19hYnQuaHRtbDogJChzcmNkaXIpL2xpYmV4dDJmcy50ZXhpbmZvCisJJChFKSAiCVRFWEkySFRNTCAkQCIKKwktJChRKSAkKEhUTUwpICQoc3JjZGlyKS9saWJleHQyZnMudGV4aW5mbworCS0kKFEpIGlmIHRlc3QgLWQgbGliZXh0MmZzIDsgdGhlbiBcCisJCW12IGxpYmV4dDJmcy8qIC4gOyBybWRpciBsaWJleHQyZnMgOyBcCisJCWZpCisKKy5QSE9OWTogZGlzdGNsZWFuCitkaXN0Y2xlYW46OiBjbGVhbgorCSQoUk0pIC1mIE1ha2VmaWxlCisKKy5QSE9OWTogY2xlYW4KK2NsZWFuOjogY2xlYW4tYWxsCisKKy5QSE9OWTogY2xlYW4tYWxsCitjbGVhbi1hbGw6OiBjbGVhbi10ZXggY2xlYW4tYmFja3VwIGNsZWFuLWZpbmFsIGNsZWFuLXRhcmZpbGVzIGNsZWFuLWh0bWwKKworLlBIT05ZOiBjbGVhbi1maW5hbAorY2xlYW4tZmluYWw6OgorCSQoUk0pIC1mICoucHMgKi5pbmZvICouaW5mby0/ICouaHRtbAorCisuUEhPTlk6IGNsZWFuLXRleAorY2xlYW4tdGV4OjoKKwkkKFJNKSAtZiAqLmF1eCAqLmNwICouZHZpICouZm4gKi5reSAqLmxvZyAqLnBnICoudG9jICoudHAgKi52ciAqLmZucworCisuUEhPTlk6IGNsZWFuLWJhY2t1cAorY2xlYW4tYmFja3VwOjoKKwkkKFJNKSAtZiAqfiAjKgorCisuUEhPTlk6IGNsZWFuLXRhcmZpbGVzCitjbGVhbi10YXJmaWxlczo6CisJJChSTSkgLWYgKi50YXIgKi50YXIuZ3ogKi50Z3oKKworY2xlYW4taHRtbDo6CisJJChSTSkgLWYgKi5odG1sCisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZG9jL2xpYmJsa2lkLnR4dCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZG9jL2xpYmJsa2lkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWVhMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9kb2MvbGliYmxraWQudHh0CkBAIC0wLDAgKzEsNzggQEAKK2xpYmJsa2lkIC0gYSBsaWJyYXJ5IHRvIGhhbmRsZSBkZXZpY2UgaWRlbnRpZmljYXRpb24gYW5kIHRva2VuIGV4dHJhY3Rpb24KKworQmFzaWMgdXNhZ2UgaXMgYXMgZm9sbG93cyAtIHRoZXJlIGFyZSB0d28gbm9ybWFsIHVzYWdlIHBhdHRlcm5zOgorCitGb3IgY2FzZXMgd2hlcmUgYSBwcm9ncmFtIHdhbnRzIGluZm9ybWF0aW9uIGFib3V0IG11bHRpcGxlIGRldmljZXMsIG9yCitleHBlY3RzIHRvIGJlIGRvaW5nIG11bHRpcGxlIHRva2VuIHNlYXJjaGVzLCB0aGUgcHJvZ3JhbSBzaG91bGQKK2RpcmVjdGx5IGluaXRpYWxpemUgY2FjaGUgZmlsZSB2aWEgKHNlY29uZCBwYXJhbWV0ZXIgaXMgY2FjaGUKK2ZpbGVuYW1lLCBOVUxMID0gZGVmYXVsdCk6CisKKwlibGtpZF9jYWNoZSBjYWNoZSA9IE5VTEw7CisJaWYgKGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIE5VTEwpIDwgMCkKKwkJLyogZXJyb3IgcmVhZGluZyB0aGUgY2FjaGUgZmlsZSwgbm90IHJlYWxseSBmYXRhbCAqLworCitOb3RlIHRoYXQgaWYgbm8gY2FjaGUgZmlsZSBleGlzdHMsIGFuIGVtcHR5IGNhY2hlIHN0cnVjdCBpcyBzdGlsbAorYWxsb2NhdGVkLiAgVXNhZ2Ugb2YgbGliYmxraWQgZnVuY3Rpb25zIHdpbGwgdXNlIHRoZSBjYWNoZSB0byBhdm9pZAorbmVlZGxlc3MgZGV2aWNlIHNjYW5zLgorCitUaGUgbW9kZWwgb2YgdGhlIGJsa2lkIGNhY2hlIGlzIHRoYXQgZWFjaCBkZXZpY2UgaGFzIGEgbnVtYmVyIG9mCithdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC4gIEN1cnJlbnRseSB0aGUgYXR0cmlidXRlcword2hpY2ggYXJlIHN1cHBvcnRlZCAoYW5kIHNldCkgYnkgYmxraWQgYXJlOgorCisJVFlQRQkJZmlsZXN5c3RlbSB0eXBlCisJVVVJRAkJZmlsZXN5c3RlbSB1dWlkCisJTEFCRUwJCWZpbGVzeXN0ZW0gbGFiZWwKKworCitIb3cgdG8gdXNlIGxpYmJsa2lkPyAgTm9ybWFsbHksIHlvdSBlaXRoZXIgd2FudCB0byBmaW5kIGEgZGV2aWNlIHdpdGgKK2Egc3BlY2lmaWMgTkFNRT12YWx1ZSB0b2tlbiwgb3IgeW91IHdhbnQgdG8gb3V0cHV0IHRva2VuKHMpIGZyb20gYQorZGV2aWNlLiAgVG8gZmluZCBhIGRldmljZSB0aGF0IG1hdGNoZXMgYSBmb2xsb3dpbmcgYXR0cmlidXRlLCB5b3UKK3NpbXBseSBjYWxsIHRoZSBibGtpZF9nZXRfZGV2bmFtZSgpIGZ1bmN0aW9uOiAKKworCWlmICgoZGV2bmFtZSA9IGJsa2lkX2dldF9kZXZuYW1lKGNhY2hlLCBhdHRyaWJ1dGVfbmFtZSwgdmFsdWUpKSkgeworCQkvKiBkbyBzb21ldGhpbmcgd2l0aCBkZXZuYW1lICovCisJCXN0cmluZ19mcmVlKGRldm5hbWUpOworCX0KKworVGhlIGNhY2hlIHBhcmFtZXRlciBpcyBvcHRpb25hbDsgaWYgaXQgaXMgTlVMTCwgdGhlbiB0aGUgYmxraWQgbGlicmFyeQord2lsbCBsb2FkIHRoZSBkZWZhdWx0IGJsa2lkLnRhYiBjYWNoZSBmaWxlLCBhbmQgdGhlbiByZWxlYXNlIHRoZSBjYWNoZQorYmVmb3JlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gYWxsb2NhdGVkIHN0cmluZword2hpY2ggaG9sZHMgdGhlIHJlc3VsdGluZyBkZXZpY2UgbmFtZSAoaWYgaXQgaXMgZm91bmQpLiAgSWYgdGhlIHZhbHVlCitpcyBOVUxMLCB0aGVuIGF0dHJpYnV0ZV9uYW1lIGlzIHBhcnNlZCBhcyBpZiBpdCB3ZXJlCisiPGF0dHJpYnV0ZV9uYW1lPj08dmFsdWU+IjsgaWYgaXQgY2Fubm90IGJlIHNvIHBhcnNlZCwgdGhlbiB0aGUKK29yaWdpbmFsIGF0dHJpYnV0ZV9uYW1lIGlzIHJldHVybmVkIGluIGEgY29waWVkIGFsbG9jYXRlZCBzdHJpbmcuCitUaGlzIGlzIGEgY29udmVuaWVuY2UgdG8gYWxsb3cgdXNlciBwcm9ncmFtcyB0byB3YW50IHRvIHRyYW5zbGF0ZSB1c2VyCitpbnB1dCwgd2hldGhlciBpdCBpcyBvZiB0aGUgZm9ybTogIi9kZXYvaGRhMSIsICJMQUJFTD1yb290IiwKKyJVVUlEPTA4MkQtMjZFMyIsIGFuZCBnZXQgYmFjayBhIGRldmljZSBuYW1lIHRoYXQgaXQgY2FuIHVzZS4KKworQWx0ZXJuYXRpdmVseSwgb2YgY291cnNlLCB0aGUgcHJvZ3JhbW1lciBjYW4gcGFzcyBhbiBhdHRyaWJ1dGUgbmFtZSBvZgorIkxBQkVMIiwgYW5kIHZhbHVlIG9mICJyb290IiwgaWYgdGhhdCBpcyBtb3JlIGNvbnZlbmllbnQuCisKK0Fub3RoZXIgY29tbW9uIHVzYWdlIGlzIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGF0dHJpYnV0ZQorZm9yIGEgcGFydGljdWxhciBkZXZpY2UuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgZmlsZXN5c3RlbQordHlwZSwgb3IgbGFiZWwsIG9yIHV1aWQgZm9yIGEgcGFydGljdWxhciBkZXZpY2U6CisKKwlpZiAoKHZhbHVlID0gYmxraWRfZ2V0X3RhZ192YWx1ZShjYWNoZSwgYXR0cmlidXRlX25hbWUsIGRldm5hbWUpKSkgeworCQkvKiBkbyBzb21ldGhpbmcgd2l0aCB2YWx1ZSAqLworCQlzdHJpbmdfZnJlZSh2YWx1ZSk7CisJfQorCitJZiBhIHByb2dyYW0gbmVlZHMgdG8gY2FsbCBtdWx0aXBsZSBibGtpZCBmdW5jdGlvbnMsIHRoZW4gcGFzc2luZyBpbiBhCitjYWNoZSB2YWx1ZSBvZiBOVUxMIGlzIG5vdCByZWNvbW1lbmRlZCwgc2luY2UgdGhlIC9ldGMvYmxraWQudGFiIGZpbGUKK3dpbGwgYmUgcmVwZWF0ZWRseSBwYXJzZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbiwgd2l0aCBtZW1vcnkgYWxsb2NhdGVkCithbmQgZGVhbGxvY2F0ZWQuICBUbyBpbml0aWFsaXplIHRoZSBibGtpZCBjYWNoZSwgYmxraWRfZ2V0X2NhY2hlKCkKK2Z1bmN0aW9uIGlzIHVzZWQ6CisKKwlpZiAoYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgTlVMTCkgPCAwKQorCQlnb3RvIGVycm91dDsKKworVGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgYmxraWRfZ2V0X2NhY2hlIChpZiBub24temVybykgaXMgdGhlIGFsdGVybmF0ZQorZmlsZW5hbWUgb2YgdGhlIGJsa2lkIGNhY2hlIGZpbGUgKHdoZXJlIHRoZSBkZWZhdWx0IGlzCisvZXRjL2Jsa2lkLnRhYikuICBOb3JtYWxseSwgcHJvZ3JhbXMgc2hvdWxkIGp1c3QgcGFzcyBpbiBOVUxMLgorCitJZiB5b3UgaGF2ZSBjYWxsZWQgYmxraWRfZ2V0X2NhY2hlKCksIHlvdSBzaG91bGQgY2FsbCBibGtpZF9wdXRfY2FjaGUoKQord2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgdGhlIGJsa2lkIGxpYnJhcnkgZnVuY3Rpb25zLiAgVGhpcyB3aWxsIHNhdmUgdGhlCitjYWNoZSB0byB0aGUgYmxraWQudGFiIGZpbGUsIGlmIHlvdSBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGUgZmlsZS4gIEl0Cit3aWxsIGFsc28gZnJlZSBhbGwgYXNzb2NpYXRlZCBkZXZpY2VzIGFuZCB0YWdzOgorCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsgCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2RvYy9saWJleHQyZnMudGV4aW5mbyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZG9jL2xpYmV4dDJmcy50ZXhpbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDY2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2RvYy9saWJleHQyZnMudGV4aW5mbwpAQCAtMCwwICsxLDEzNzcgQEAKK1xpbnB1dCB0ZXhpbmZvICAgIEBjIC0qLXRleGluZm8tKi0KK0BjICUqKnN0YXJ0IG9mIGhlYWRlcgorQHNldGZpbGVuYW1lIGxpYmV4dDJmcy5pbmZvCitAc2V0dGl0bGUgVGhlIEVYVDJGUyBMaWJyYXJ5ICh2ZXJzaW9uIDEuNDEuMTIpCitAc3luaW5kZXggdHAgZm4KK0Bjb21tZW50ICUqKmVuZCBvZiBoZWFkZXIKKworQGlmaW5mbworQGRpcmNhdGVnb3J5IERldmVsb3BtZW50CitAZGlyZW50cnkKKyogbGliZXh0MmZzOiAobGliZXh0MmZzKS4gICAgICAgICAgICAgICAgICBUaGUgRVhUMkZTIGxpYnJhcnkuCitAZW5kIGRpcmVudHJ5CitAZW5kIGlmaW5mbworCitAYyBzbWFsbGJvb2sKKworQGlmdGV4CitAZmluYWxvdXQKK0BlbmQgaWZ0ZXgKKworQGMgTm90ZTogdGhlIGVkaXRpb24gbnVtYmVyIGlzIGxpc3RlZCBpbiAqdGhyZWUqIHBsYWNlczsgcGxlYXNlIHVwZGF0ZQorQGMgYWxsIHRocmVlLiAgQWxzbywgdXBkYXRlIHRoZSBtb250aCBhbmQgeWVhciB3aGVyZSBhcHByb3ByaWF0ZS4KKworQGMgPT0+IFVwZGF0ZSBlZGl0aW9uIG51bWJlciBmb3Igc2V0dGl0bGUgYW5kIHN1YnRpdGxlLCBhbmQgaW4gdGhlCitAYyA9PT4gZm9sbG93aW5nIHBhcmFncmFwaDsgdXBkYXRlIGRhdGUsIHRvby4KKworCitAaWZpbmZvCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBleHQyZnMgbGlicmFyeSwgYSBsaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgdGhlCitleHQyIGZpbGVzeXN0ZW0uCisKK0NvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKzIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgYnkgVGhlb2RvcmUgVHMnbworCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQorcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAorZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24gYXBwcm92ZWQKK2J5IHRoZSBhdXRob3IuCitAZW5kIGlmaW5mbworCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24KK0B0aXRsZXBhZ2UKK0BjICB1c2UgdGhlIG5ldyBmb3JtYXQgZm9yIHRpdGxlcworCitAdGl0bGUgVGhlIEVYVDJGUyBMaWJyYXJ5CitAc3VidGl0bGUgVGhlIEVYVDJGUyBMaWJyYXJ5CitAc3VidGl0bGUgVmVyc2lvbiAxLjQxLjEyCitAc3VidGl0bGUgTWF5IDIwMTAKKworQGF1dGhvciBieSBUaGVvZG9yZSBUcydvCisKK0BjIEluY2x1ZGUgdGhlIERpc3RyaWJ1dGlvbiBpbnNpZGUgdGhlIHRpdGxlcGFnZSBzbworQGMgdGhhdCBoZWFkaW5ncyBhcmUgdHVybmVkIG9mZi4KKworQHRleAorXGdsb2JhbFxwYXJpbmRlbnQ9MHB0CitcZ2xvYmFsXHBhcnNraXA9OHB0CitcZ2xvYmFsXGJhc2VsaW5lc2tpcD0xM3B0CitAZW5kIHRleAorCitAcGFnZQorQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorMjAwNSBUaGVvZG9yZSBUcydvCisKK0BzcCAyCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKK3Jlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKK2V4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCitieSB0aGUgRm91bmRhdGlvbi4KK0BlbmQgdGl0bGVwYWdlCitAaGVhZGluZ3MgZG91YmxlCisKK0BpZmluZm8KK0Bub2RlIFRvcCwgSW50cm9kdWN0aW9uIHRvIHRoZSBFWFQyRlMgTGlicmFyeSwgKGRpciksIChkaXIpCisKK0B0b3AgVGhlIEVYVDJGUyBMaWJyYXJ5CisKK1RoaXMgbWFudWFsIGRvY3VtZW50cyB0aGUgRVhUMkZTIExpYnJhcnksIHZlcnNpb24gMS40MS4xMi4KKworQGVuZCBpZmluZm8KKworQG1lbnUKKyogSW50cm9kdWN0aW9uIHRvIHRoZSBFWFQyRlMgTGlicmFyeTo6ICAKKyogRVhUMkZTIExpYnJhcnkgRnVuY3Rpb25zOjogICAgCisqIENvbmNlcHQgSW5kZXg6OiAgICAgICAgICAgICAgIAorKiBGdW5jdGlvbiBJbmRleDo6ICAgICAgICAgICAgICAKK0BlbmQgbWVudQorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIEludHJvZHVjdGlvbiB0byB0aGUgRVhUMkZTIExpYnJhcnksIEVYVDJGUyBMaWJyYXJ5IEZ1bmN0aW9ucywgVG9wLCBUb3AKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQGNoYXB0ZXIgSW50cm9kdWN0aW9uIHRvIHRoZSBFWFQyRlMgTGlicmFyeQorCitUaGUgRVhUMkZTIGxpYnJhcnkgaXMgZGVzaWduZWQgdG8gYWxsb3cgdXNlci1sZXZlbCBwcm9ncmFtcyB0bworbWFuaXB1bGF0ZSBhbiBleHQyIGZpbGVzeXN0ZW0uCisKK0Bub2RlIEVYVDJGUyBMaWJyYXJ5IEZ1bmN0aW9ucywgQ29uY2VwdCBJbmRleCwgSW50cm9kdWN0aW9uIHRvIHRoZSBFWFQyRlMgTGlicmFyeSwgVG9wCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BjaGFwdGVyIEVYVDJGUyBMaWJyYXJ5IEZ1bmN0aW9ucworCitAbWVudQorKiBGaWxlc3lzdGVtLWxldmVsIGZ1bmN0aW9uczo6ICAKKyogRmlsZSBJL08gRnVuY3Rpb25zOjogICAgICAgICAgCisqIElub2RlIEZ1bmN0aW9uczo6ICAgICAgICAgICAgIAorKiBEaXJlY3RvcnkgZnVuY3Rpb25zOjogICAgICAgICAKKyogQml0bWFwIEZ1bmN0aW9uczo6ICAgICAgICAgICAgCisqIEVYVDIgZGF0YSBhYnN0cmFjdGlvbnM6OiAgICAgIAorKiBCeXRlLXN3YXBwaW5nIGZ1bmN0aW9uczo6ICAgICAKKyogT3RoZXIgZnVuY3Rpb25zOjogICAgICAgICAgICAgCitAZW5kIG1lbnUKKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBGaWxlc3lzdGVtLWxldmVsIGZ1bmN0aW9ucywgRmlsZSBJL08gRnVuY3Rpb25zLCBFWFQyRlMgTGlicmFyeSBGdW5jdGlvbnMsIEVYVDJGUyBMaWJyYXJ5IEZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc2VjdGlvbiBGaWxlc3lzdGVtLWxldmVsIGZ1bmN0aW9ucworCitUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvcGVyYXRlIG9uIGEgZmlsZXN5c3RlbSBoYW5kbGUuICBNb3N0IEVYVDJGUworTGlicmFyeSBmdW5jdGlvbnMgcmVxdWlyZSBhIGZpbGVzeXN0ZW0gaGFuZGxlIGFzIHRoZWlyIGZpcnN0IGFyZ3VtZW50LgorVGhlcmUgYXJlIHR3byBmdW5jdGlvbnMgd2hpY2ggY3JlYXRlIGEgZmlsZXN5c3RlbSBoYW5kbGUsCitAY29kZXtleHQyZnNfb3Blbn0gYW5kIEBjb2Rle2V4dDJmc19pbml0aWFsaXplfS4gIAorCitUaGUgZmlsZXN5c3RlbSBjYW4gYWxzbyBiZSBjbG9zZWQgdXNpbmcgQGNvZGV7ZXh0MmZzX2Nsb3NlfSwgYW5kIGFueQorY2hhbmdlcyB0byB0aGUgc3VwZXJibG9jayBhbmQgZ3JvdXAgZGVzY3JpcHRzIGNhbiBiZSB3cml0dGVuIG91dCB0byBkaXNrCit1c2luZyBAY29kZXtleHQyZnNfZmx1c2h9LgorCitAbWVudQorKiBPcGVuaW5nIGFuIGV4dDIgZmlsZXN5c3RlbTo6ICAKKyogQ2xvc2luZyBhbmQgZmx1c2hpbmcgb3V0IGNoYW5nZXM6OiAgCisqIEluaXRpYWxpemluZyBhIGZpbGVzeXN0ZW06OiAgIAorKiBGaWxlc3lzdGVtIGZsYWcgZnVuY3Rpb25zOjogICAKK0BlbmQgbWVudQorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIE9wZW5pbmcgYW4gZXh0MiBmaWxlc3lzdGVtLCBDbG9zaW5nIGFuZCBmbHVzaGluZyBvdXQgY2hhbmdlcywgRmlsZXN5c3RlbS1sZXZlbCBmdW5jdGlvbnMsIEZpbGVzeXN0ZW0tbGV2ZWwgZnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIE9wZW5pbmcgYW4gZXh0MiBmaWxlc3lzdGVtCisKK01vc3QgbGliZXh0MmZzIGZ1bmN0aW9ucyB0YWtlIGEgZmlsZXN5c3RlbSBoYW5kbGUgb2YgdHlwZQorQGNvZGV7ZXh0Ml9maWxzeXN9LiAgQSBmaWxlc3lzdGVtIGhhbmRsZSBpcyBjcmVhdGVkIGVpdGhlciBieSBvcGVuaW5nCithbiBleGlzdGluZyBmdW5jdGlvbiB1c2luZyBAY29kZXtleHQyZnNfb3Blbn0sIG9yIGJ5IGluaXRpYWxpemluZyBhIG5ldworZmlsZXN5c3RlbSB1c2luZyBAY29kZXtleHQyZnNfaW5pdGlhbGl6ZX0uCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfb3BlbiAoY29uc3QgY2hhciAqQHZhcntuYW1lfSwgaW50IEB2YXJ7ZmxhZ3N9LCBpbnQgQHZhcntzdXBlcmJsb2NrfSwgaW50IEB2YXJ7YmxvY2tfc2l6ZX0sIGlvX21hbmFnZXIgQHZhcnttYW5hZ2VyfSwgZXh0Ml9maWxzeXMgKkB2YXJ7cmV0X2ZzfSkKKworT3BlbnMgYSBmaWxlc3lzdGVtIG5hbWVkIEB2YXJ7bmFtZX0sIHVzaW5nIHRoZSB0aGUgaW9fbWFuYWdlcgorQHZhcnttYW5hZ2VyfSB0byBkZWZpbmUgdGhlIGlucHV0L291dHB1dCByb3V0aW5lcyBuZWVkZWQgdG8gcmVhZCBhbmQKK3dyaXRlIHRoZSBmaWxlc3lzdGVtLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIEBjb2Rle3VuaXhfaW99IGlvX21hbmFnZXIsCitAdmFye25hbWV9IGlzIGludGVycHJldGVkIGFzIHRoZSBVbml4IGZpbGVuYW1lIG9mIHRoZSBmaWxlc3lzdGVtIGltYWdlLgorVGhpcyBpcyBvZnRlbiBhIGRldmljZSBmaWxlLCBzdWNoIGFzIEBmaWxley9kZXYvaGRhMX0uCisKK1RoZSBAdmFye3N1cGVyYmxvY2t9IHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGJsb2NrIG51bWJlciBvZiB0aGUKK3N1cGVyYmxvY2sgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBvcGVuaW5nIHRoZSBmaWxlc3lzdGVtLgorSWYgQHZhcntzdXBlcmJsb2NrfSBpcyB6ZXJvLCBAY29kZXtleHQyZnNfb3Blbn0gd2lsbCB1c2UgdGhlIHByaW1hcnkKK3N1cGVyYmxvY2sgbG9jYXRlZCBhdCBvZmZzZXQgMTAyNCBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZXN5c3RlbQoraW1hZ2UuCisKK1RoZSBAdmFye2Jsb2NrX3NpemV9IHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGJsb2NrIHNpemUgdXNlZCBieSB0aGUKK2ZpbGVzeXN0ZW0uICBOb3JtYWxseSB0aGlzIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZQorZmlsZXN5c3RlbSB1cGVyYmxvY2suICBJZiBAdmFye2Jsb2NrX3NpemV9IGlzIG5vbi16ZXJvLCBpdCBtdXN0IG1hdGNoCit0aGUgYmxvY2sgc2l6ZSBmb3VuZCBpbiB0aGUgc3VwZXJibG9jaywgb3IgdGhlIGVycm9yCitAY29kZXtFWFQyX0VUX1VORVhQRUNURURfQkxPQ0tfU0laRX0gd2lsbCBiZSByZXR1cm5lZC4gIFRoZQorQHZhcntibG9ja19zaXplfSBwYXJhbWV0ZXIgaXMgYWxzbyB1c2VkIHRvIGhlbHAgZnVuZCB0aGUgc3VwZXJibG9jayB3aGVuCitAdmFye3N1cGVyYmxvY2t9IGlzIG5vbi16ZXJvLgorCitUaGUgQHZhcntmbGFnc30gYXJndW1lbnQgY29udGFpbnMgYSBiaXRtYXNrIG9mIGZsYWdzIHdoaWNoIGNvbnRyb2wgaG93Cit0aGUgZmlsZXN5c3RlbSBvcGVuIHNob3VsZCBiZSBoYW5kbGVkLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEVYVDJfRkxBR19SVworT3BlbiB0aGUgZmlsZXN5c3RlbSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gIFdpdGhvdXQgdGhpcyBmbGFnLCB0aGUKK2ZpbGVzeXN0ZW0gaXMgb3BlbmVkIGZvciByZWFkaW5nIG9ubHkuCisKK0BpdGVtIEVYVDJfRkxBR19GT1JDRQorT3BlbiB0aGUgZmlsZXN5c3RlbSByZWdhcmRsZXNzIG9mIHRoZSBmZWF0dXJlIHNldHMgbGlzdGVkIGluIHRoZQorc3VwZXJibG9jay4KKworQGVuZCB0YWJsZQorQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQ2xvc2luZyBhbmQgZmx1c2hpbmcgb3V0IGNoYW5nZXMsIEluaXRpYWxpemluZyBhIGZpbGVzeXN0ZW0sIE9wZW5pbmcgYW4gZXh0MiBmaWxlc3lzdGVtLCBGaWxlc3lzdGVtLWxldmVsIGZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBDbG9zaW5nIGFuZCBmbHVzaGluZyBvdXQgY2hhbmdlcworCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2ZsdXNoIChleHQyX2ZpbHN5cyBAdmFye2ZzfSkKKworV3JpdGUgYW55IGNoYW5nZXMgdG8gdGhlIGhpZ2gtbGV2ZWwgZmlsZXN5c3RlbSBkYXRhIHN0cnVjdHVyZXMgaW4gdGhlCitAdmFye2ZzfSBmaWxlc3lzdGVtLiAgVGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXMgd2lsbCBiZSB3cml0dGVuIG91dDoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0gVGhlIGZpbGVzeXN0ZW0gc3VwZXJibG9jaworQGl0ZW0gVGhlIGZpbGVzeXN0ZW0gZ3JvdXAgZGVzY3JpcHRvcnMKK0BpdGVtIFRoZSBmaWxlc3lzdGVtIGJpdG1hcHMsIGlmIHJlYWQgaW4gdmlhIEBjb2Rle2V4dDJmc19yZWFkX2JpdG1hcHN9LgorQGVuZCBpdGVtaXplCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGV4dDJmc19mcmVlIChleHQyX2ZpbHN5cyBAdmFye2ZzfSkKKworQ2xvc2UgdGhlIGlvX21hbmFnZXIgYWJzdHJhY3Rpb24gZm9yIEB2YXJ7ZnN9IGFuZCByZWxlYXNlIGFsbCBtZW1vcnkKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZXN5c3RlbSBoYW5kbGUuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19jbG9zZSAoZXh0Ml9maWxzeXMgQHZhcntmc30pCisKK0ZsdXNoIG91dCBhbnkgY2hhbmdlcyB0byB0aGUgaGlnaC1sZXZlbCBmaWxlc3lzdGVtIGRhdGEgc3RydWN0dXJlcyB1c2luZworQGNvZGV7ZXh0MmZzX2ZsdXNofSBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtYXJrZWQgZGlydHk7IHRoZW4gY2xvc2UgYW5kCitmcmVlIHRoZSBmaWxlc3lzdGVtIHVzaW5nIEBjb2Rle2V4dDJmc19mcmVlfS4KKworQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgSW5pdGlhbGl6aW5nIGEgZmlsZXN5c3RlbSwgRmlsZXN5c3RlbSBmbGFnIGZ1bmN0aW9ucywgQ2xvc2luZyBhbmQgZmx1c2hpbmcgb3V0IGNoYW5nZXMsIEZpbGVzeXN0ZW0tbGV2ZWwgZnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIEluaXRpYWxpemluZyBhIGZpbGVzeXN0ZW0KKworQW4gZXh0MiBmaWxlc3lzdGVtIGlzIGluaXRpYWxpemluZyBieSB0aGUgQGNvZGV7bWtlMmZzfSBwcm9ncmFtLiAgVGhlCit0d28gZnVuY3Rpb25zIGRlc2NyaWJlZCBoZXJlLCBAY29kZXtleHQyZnNfaW5pdGlhbGl6ZX0gYW5kCitAY29kZXtleHQyZnNfYWxsb2NhdGVfdGFibGVzfSBkbyBtdWNoIG9mIHRoZSBpbml0aWFsIHdvcmsgZm9yIHNldHRpbmcgdXAKK2EgZmlsZXN5c3RlbS4gIEhvd2V2ZXIsIHRoZXkgZG9uJ3QgZG8gdGhlIHdob2xlIGpvYi4gIEBjb2Rle21rZTJmc30KK2NhbGxzIEBjb2Rle2V4dDJmc19pbml0aWFsaXplfSB0byBzZXQgdXAgdGhlIGZpbGVzeXN0ZW0gc3VwZXJibG9jaywgYW5kCitjYWxscyBAY29kZXtleHQyZnNfYWxsb2NhdGVfdGFibGVzfSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGlub2RlCit0YWJsZSwgYW5kIHRoZSBpbm9kZSBhbmQgYmxvY2sgYml0bWFwcy4gIEluIGFkZGl0aW9uLCBAY29kZXtta2UyZnN9IG11c3QKK2Fsc28gaW5pdGlhbGl6ZSB0aGUgaW5vZGUgdGFibGVzIGJ5IGNsZWFyaW5nIHRoZW0gd2l0aCB6ZXJvcywgY3JlYXRlIHRoZQorcm9vdCBhbmQgbG9zdCtmb3VuZCBkaXJlY3RvcmllcywgYW5kIHJlc2VydmUgdGhlIHJlc2VydmVkIGlub2Rlcy4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19pbml0aWFsaXplIChjb25zdCBjaGFyICpAdmFye25hbWV9LCBpbnQgQHZhcntmbGFnc30sIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpAdmFye3BhcmFtfSwgaW9fbWFuYWdlciBAdmFye21hbmFnZXJ9LCBleHQyX2ZpbHN5cyAqQHZhcntyZXRfZnN9KQorCitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIEBjb2Rle21rZTJmc30gcHJvZ3JhbSB0byBpbml0aWFsaXplIGEKK2ZpbGVzeXN0ZW0uICBUaGUgQGNvZGV7ZXh0MmZzX2luaXRpYWxpemV9IGZ1bmN0aW9uIGNyZWF0ZXMgYSBmaWxlc3lzdGVtCitoYW5kbGUgd2hpY2ggaXMgcmV0dXJuZWQgaW4gQHZhcntyZXRfZnN9IHRoYXQgaGFzIGJlZW4gcHJvcGVybHkgc2V0dXAKK2ZvciBhIGZpbGVzeXN0ZW0gdG8gYmUgbG9jYXRlZCBpbiBAdmFye25hbWV9LCB1c2luZyB0aGUgaW9fbWFuYWdlcgorQHZhcnttYW5hZ2VyfS4gIFRoZSBwcm90b3R5cGUgc3VwZXJibG9jayBpbiBAdmFye3BhcmFtfSBpcyB1c2VkIHRvCitzdXBwbHkgcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBmaWxlc3lzdGVtLCB0aGUKK2Jsb2NrIHNpemUsIGV0Yy4gIAorCitUaGUgQGNvZGV7ZXh0MmZzX2luaXRpYWxpemV9IGZ1bmN0aW9uIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueSBJL087IHRoYXQKK3dpbGwgYmUgZG9uZSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIGNhbGxzIEBjb2Rle2V4dDJmc19jbG9zZX0gb3IKK0Bjb2Rle2V4dDJmc19mbHVzaH0uICBBbHNvLCB0aGlzIGZ1bmN0aW9uIG9ubHkgaW5pdGlhbGl6ZXMgdGhlCitzdXBlcmJsb2NrIGFuZCBncm91cCBkZXNjcmlwdG9yIHN0cnVjdHVyZXMuICBJdCBkb2VzIG5vdCBjcmVhdGUgdGhlCitpbm9kZSB0YWJsZSBvciB0aGUgcm9vdCBkaXJlY3RvcnkuICBUaGlzIG11c3QgYmUgZG9uZSBieSB0aGUgY2FsbGluZworYXBwbGljYXRpb24sIHN1Y2ggYXMgQGNvZGV7bWtlMmZzfS4KKworVGhlIGZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHNldCBpbiB0aGUgQHZhcntwYXJhbX0gcHJvdG90eXBlIHN1cGVyYmxvY2s7CitpZiBhIHZhbHVlIG9mIDAgaXMgZm91bmQgaW4gYSBmaWVsZCwgQGNvZGV7ZXh0MmZzX2luaXRpYWxpemV9IHdpbGwgdXNlIGEKK2RlZmF1bHQgdmFsdWUuICBUaGUgY2FsbGluZyBhcHBsaWNhdGlvbiBzaG91bGQgemVybyBvdXQgdGhlIHByb3RvdHlwZQorZW50aXJlIHN1cGVyYmxvY2ssIGFuZCB0aGVuIGZpbGwgaW4gYW55IGFwcHJvcHJpYXRlIHZhbHVlcy4KKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIHNfYmxvY2tzX2NvdW50CitUaGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgZmlsZXN5c3RlbS4gIFRoaXMgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBhbmQKK211c3QgYmUgc2V0IGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgorCitAaXRlbSBzX2lub2Rlc19jb3VudAorVGhlIG51bWJlciBvZiBpbm9kZXMgaW4gdGhlIGZpbGVzeXN0ZW0uICBUaGUKK2RlZmF1bHQgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiB0aGUgZmlsZXN5c3RlbSwKK2FuZCBjcmVhdGluZyBvbmUgaW5vZGUgZm9yIGV2ZXJ5IDQwOTYgYnl0ZXMuCisKK0BpdGVtIHNfcl9ibG9ja3NfY291bnQKK1RoZSBudW1iZXIgb2YgYmxvY2tzIHdoaWNoIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgdGhlIHN1cGVydXNlci4gIFRoZQorZGVmYXVsdCB2YWx1ZSBpcyB6ZXJvIGJsb2Nrcy4KKworQGl0ZW0gc19sb2dfYmxvY2tfc2l6ZQorVGhlIGJsb2Nrc2l6ZSBvZiB0aGUgZmlsZXN5c3RlbS4gIFZhbGlkIHZhbHVlcyBhcmUgMCAoMTAyNCBieXRlcyksIDEKKygyMDQ4IGJ5dGVzKSwgb3IgMiAoNDA5NiBieXRlcykuICBUaGUgZGVmYXVsdCBibG9ja3NpemUgaXMgMTAyNCBieXRlcy4KKworQGl0ZW0gc19sb2dfZnJhZ19zaXplCitUaGUgc2l6ZSBvZiBmcmFnbWVudHMuICBUaGUgZXh0MiBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZnJhZ21lbnRzCisoYW5kIG1heSBuZXZlciBzdXBwb3J0IGZyYWdtZW50cykuICBDdXJyZW50bHkgdGhpcyBmaWVsZCBtdXN0IGJlIHRoZQorc2FtZSBhcyBAY29kZXtzX2xvZ19ibG9ja19zaXplfS4KKworQGl0ZW0gc19maXJzdF9kYXRhX2Jsb2NrCitUaGUgZmlyc3QgZGF0YSBibG9jayBmb3IgdGhlIGZpbGVzeXN0ZW0uICBGb3IgZmlsZXN5c3RlbSB3aXRoIGEKK2Jsb2Nrc2l6ZSBvZiAxMDI0IGJ5dGVzLCB0aGlzIHZhbHVlIG11c3QgYmUgYXQgbGVhc3QgMSwgc2luY2UgdGhlCitzdXBlcmJsb2NrIGlzIGxvY2F0ZWQgaW4gYmxvY2sgbnVtYmVyIDEuICBGb3IgZmlsZXN5c3RlbXMgd2l0aCBsYXJnZXIKK2Jsb2Nrc2l6ZXMsIHRoZSBzdXBlcmJsb2NrIGlzIHN0aWxsIGxvY2F0ZWQgYXQgYW4gb2Zmc2V0IG9mIDEwMjQgYnl0ZXMsCitzbyB0aGUgc3VwZXJibG9jayBpcyBsb2NhdGVkIGluIGJsb2NrIG51bWJlciAwLiAgQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZQoraXMgc2V0IHRvIDEgZm9yIGZpbGVzeXN0ZW1zIHdpdGggYSBibG9jayBzaXplIG9mIDEwMjQgYnl0ZXMsIG9yIDAgZm9yCitmaWxlc3lzdGVtcyB3aXRoIGxhcmdlciBibG9ja3NpemVzLgorCitAaXRlbSBzX21heF9tbnRfY291bnQKK1RoaXMgZmllbGQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGZpbGVzeXN0ZW0gY2FuIGJlCittb3VudGVkIGJlZm9yZSBpdCBzaG91bGQgYmUgY2hlY2tlZCB1c2luZyBAY29kZXtlMmZzY2t9LiAgV2hlbgorQGNvZGV7ZTJmc2NrfSBpcyBydW4gd2l0aG91dCB0aGUgQHNhbXB7LWZ9IG9wdGlvbiwgQGNvZGV7ZTJmc2NrfSB3aWxsCitza2lwIHRoZSBmaWxlc3lzdGVtIGNoZWNrIGlmIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgZmlsZXN5c3RlbSBoYXMKK2JlZW4gbW91bnRlZCBpcyBsZXNzIHRoYW4gQGNvZGV7c19tYXhfbW50X2NvdW50fSBhbmQgaWYgdGhlIGludGVydmFsCitiZXR3ZWVuIHRoZSBsYXN0IHRpbWUgYSBmaWxlc3lzdGVtIGNoZWNrIHdhcyBwZXJmb3JtZWQgYW5kIHRoZSBjdXJyZW50Cit0aW1lIGlzIGxlc3MgdGhhbiBAY29kZXtzX2NoZWNraW50ZXJ2YWx9IChzZWUgYmVsb3cpLiAgVGhlIGRlZmF1bHQgdmFsdWUKK29mIEBjb2Rle3NfbWF4X21udF9jb3VudH0gaXMgMjAuCisKK0BpdGVtIHNfY2hlY2tpbnRlcnZhbAorVGhpcyBmaWVsZCBkZWZpbmVzIHRoZSBtaW5pbWFsIGludGVydmFsIGJldHdlZW4gZmlsZXN5c3RlbSBjaGVja3MuICBTZWUKK3RoZSBwcmV2aW91cyBlbnRyeSBmb3IgYSBkaXNjdXNzaW9uIG9mIGhvdyB0aGlzIGZpZWxkIGlzIHVzZWQgYnkKK0Bjb2Rle2UyZnNja30uICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIDE4MCBkYXlzIChzaXgKK21vbnRocykuCisKK0BpdGVtIHNfZXJyb3JzCitUaGlzIGZpZWxkIGRlZmluZXMgdGhlIGJlaGF2aW9yIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBrZXJuZWwgb2YKK2Vycm9ycyBhcmUgZGV0ZWN0ZWQgaW4gdGhlIGZpbGVzeXN0ZW0uICBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZToKKworQHRhYmxlIEBzYW1wCitAaXRlbSBFWFQyX0VSUk9SU19DT05USU5VRQorQ29udGludWUgZXhlY3V0aW9uIHdoZW4gZXJyb3JzIGFyZSBkZXRlY3RlZC4KKworQGl0ZW0gRVhUMl9FUlJPUlNfUk8KK1JlbW91bnQgdGhlIGZpbGVzeXN0ZW0gcmVhZC1vbmx5LgorCitAaXRlbSBFWFQyX0VSUk9SU19QQU5JQworUGFuaWMuCisKK0BlbmQgdGFibGUKKworVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgQHNhbXB7RVhUMl9FUlJPUlNfQ09OVElOVUV9LgorCitAZW5kIHRhYmxlCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2FsbG9jYXRlX3RhYmxlcyAoZXh0Ml9maWxzeXMgQHZhcntmc30pCitBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGlub2RlIHRhYmxlIGFuZCB0aGUgYmxvY2sgYW5kIGlub2RlIGJpdG1hcHMuICBUaGUKK2lub2RlIHRhYmxlcyBhbmQgYmxvY2sgYW5kIGlub2RlIGJpdG1hcHMgYXJlbid0IGFjdHVhbGx5IGluaXRpYWxpemVkOwordGhpcyBmdW5jdGlvbiBqdXN0IGFsbG9jYXRlcyB0aGUgc3BhY2UgZm9yIHRoZW0uCitAZW5kIGRlZnR5cGVmdW4KKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBGaWxlc3lzdGVtIGZsYWcgZnVuY3Rpb25zLCAgLCBJbml0aWFsaXppbmcgYSBmaWxlc3lzdGVtLCBGaWxlc3lzdGVtLWxldmVsIGZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBGaWxlc3lzdGVtIGZsYWcgZnVuY3Rpb25zCisKK1RoZSBmaWxlc3lzdGVtIGhhbmRsZSBoYXMgYSBudW1iZXIgb2YgZmxhZ3Mgd2hpY2ggY2FuIGJlIG1hbmlwdWxhdGVkCit1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLiAgU29tZSBvZiB0aGVzZSBmbGFncyBhZmZlY3QgaG93IHRoZQorbGliZXh0MmZzIGZpbGVzeXN0ZW0gYmVoYXZlczsgb3RoZXJzIGFyZSBwcm92aWRlZCBzb2xlbHkgZm9yIHRoZQorYXBwbGljYXRpb24ncyBjb252ZW5pZW5jZS4KKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfbWFya19jaGFuZ2VkIChleHQyX2ZpbHN5cyBAdmFye2ZzfSkKK0BkZWZ0eXBlZnVueCBpbnQgZXh0MmZzX3Rlc3RfY2hhbmdlZCAoZXh0Ml9maWxzeXMgQHZhcntmc30pCitUaGlzIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQuIAorSXQgaXMgbm90IHVzZWQgYnkgdGhlIGV4dDJmcyBsaWJyYXJ5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZXh0MmZzX21hcmtfc3VwZXJfZGlydHkgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorTWFyayB0aGUgZmlsZXN5c3RlbSBAdmFye2ZzfSBhcyBiZWluZyBkaXJ0eTsgdGhpcyB3aWxsIGNhdXNlCit0aGUgc3VwZXJibG9jayBpbmZvcm1hdGlvbiB0byBiZSBmbHVzaGVkIG91dCB3aGVuIEBjb2Rle2V4dDJmc19jbG9zZX0gaXMKK2NhbGxlZC4gIEBjb2Rle2V4dDJmc19tYXJrX3N1cGVyX2RpcnR5fSB3aWxsIGFsc28gc2V0IHRoZSBmaWxlc3lzdGVtIAorY2hhbmdlZCBmbGFnLiAgVGhlIGRpcnR5IGZsYWcgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIGJ5CitAY29kZXtleHQyZnNfZmx1c2h9IHdoZW4gdGhlIHN1cGVyYmxvY2sgaXMgd3JpdHRlbiB0byBkaXNrLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZXh0MmZzX21hcmtfdmFsaWQgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorQGRlZnR5cGVmdW54IHZvaWQgZXh0MmZzX3VubWFya192YWxpZCAoZXh0Ml9maWxzeXMgQHZhcntmc30pCitAZGVmdHlwZWZ1bnggaW50IGV4dDJmc190ZXN0X3ZhbGlkIChleHQyX2ZpbHN5cyBAdmFye2ZzfSkKK1RoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGZpbGVzeXN0ZW0gaXMgZnJlZSBvZiBlcnJvcnMuCitJdCBpcyBub3QgdXNlZCBieSBsaWJleHQyZnMsIGFuZCBpcyBzb2xlbHkgZm9yIHRoZSBhcHBsaWNhdGlvbidzIAorY29udmVuaWVuY2UuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfbWFya19pYl9kaXJ0eSAoZXh0Ml9maWxzeXMgQHZhcntmc30pCitAZGVmdHlwZWZ1bnggdm9pZCBleHQyZnNfbWFya19iYl9kaXJ0eSAoZXh0Ml9maWxzeXMgQHZhcntmc30pCitAZGVmdHlwZWZ1bnggaW50IGV4dDJmc190ZXN0X2liX2RpcnR5IChleHQyX2ZpbHN5cyBAdmFye2ZzfSkKK0BkZWZ0eXBlZnVueCBpbnQgZXh0MmZzX3Rlc3RfYmJfZGlydHkgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorVGhlc2UgZmxhZ3MgaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGlub2RlIG9yIGJsb2NrIGJpdG1hcHMgaGF2ZSBiZWVuCittb2RpZmllZC4gICBJZiB0aGUgZmxhZyBpcyBzZXQsIGl0IHdpbGwgY2F1c2UgdGhlIGFwcHJvcHJpYXRlIGJpdG1hcAordG8gYmUgd3JpdHRlbiB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzIGNsb3NlZCBvciBmbHVzaGVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgRmlsZSBJL08gRnVuY3Rpb25zLCBJbm9kZSBGdW5jdGlvbnMsIEZpbGVzeXN0ZW0tbGV2ZWwgZnVuY3Rpb25zLCBFWFQyRlMgTGlicmFyeSBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHNlY3Rpb24gRmlsZSBJL08gRnVuY3Rpb25zCisKK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgYSBjb252ZW5pZW50IGFic3RyYWN0aW9uIHRvIHJlYWQgb3IKK3dyaXRlIGEgZmlsZSBpbiBhbiBmaWxlc3lzdGVtLiAgVGhlIGludGVyZmFjZSBpcyBzaW1pbGFyIGluIHNwaXJpdCB0bwordGhlIExpbnV4L1BPU0lYIGZpbGUgSS9PIHN5c3RlbSBjYWxscy4KKworQG1lbnUKKyogRmlsZSBoYW5kbGUgbWFuaXB1bGF0aW9uOjogICAgCisqIFJlYWRpbmcgYW5kIHdyaXRpbmcgZGF0YTo6ICAgIAorKiBDaGFuZ2luZyB0aGUgZmlsZSBvZmZzZXQgOjogICAKKyogR2V0dGluZyB0aGUgZmlsZSBzaXplOjogICAgICAgCitAZW5kIG1lbnUKKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBGaWxlIGhhbmRsZSBtYW5pcHVsYXRpb24sIFJlYWRpbmcgYW5kIHdyaXRpbmcgZGF0YSwgRmlsZSBJL08gRnVuY3Rpb25zLCBGaWxlIEkvTyBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gRmlsZSBoYW5kbGUgbWFuaXB1bGF0aW9uCisKK1RoZSBmaWxlIGhhbmRsZSBmdW5jdGlvbnMgbXVjaCBsaWtlIGEgZmlsZSBkZXNjcmlwdG9yIGluIHRoZSBMaW51eC9QT1NJWAorZmlsZSBJL08gc3lzdGVtIGNhbGxzLiAgVW5saWtlIHRoZSBMaW51eC9QT1NJWCBzeXN0ZW0gY2FsbHMsIGZpbGVzIGFyZQorb3BlbmVkIHZpYSBpbm9kZSBudW1iZXJzIGluc3RlYWQgb2YgdmlhIHBhdGhuYW1lcy4gIFRvIHJlc29sdmUgYQorcGF0aG5hbWUgdG8gYW4gaW5vZGUgbnVtYmVyLCB1c2UgdGhlIGZ1bmN0aW9uIEBjb2Rle2V4dDJmc19uYW1laX0gb3IgdG8KK2NyZWF0ZSBhIG5ldyBmaWxlLCB1c2UgQGNvZGV7ZXh0MmZzX25ld19pbm9kZX0gYW5kIEBjb2Rle2V4dDJmc19saW5rfS4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19maWxlX29wZW4yIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIHN0cnVjdCBleHQyX2lub2RlICpAdmFye2lub2RlfSwgaW50IEB2YXJ7ZmxhZ3N9LCBleHQyX2ZpbGVfdCAqQHZhcntyZXR9KQorQGRlZnR5cGVmdW54IGVycmNvZGVfdCBleHQyZnNfZmlsZV9vcGVuIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIGludCBAdmFye2ZsYWdzfSwgZXh0Ml9maWxlX3QgKkB2YXJ7cmV0fSkKKworT3BlbnMgYSBmaWxlIGlkZW50aWZpZWQgYnkgaW5vZGUgbnVtYmVyIEB2YXJ7aW5vfSBpbiBmaWxlc3lzdGVtIEB2YXJ7ZnN9CithbmQgcmV0dXJucyBhIGZpbGUgaGFuZGxlIGluIEB2YXJ7cmV0fS4gIElmIGFuIGlub2RlIHN0cnVjdHVyZSBpcworcHJvdmlkZWQgaW4gQHZhcntpbm9kZX0sIHRoZW4gaXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHJlYWRpbmcgdGhlIGlub2RlCitmcm9tIHRoZSBmaWxlc3lzdGVtLgorCitUaGUgQHZhcntmbGFnc30gYXJndW1lbnQgY29udGFpbnMgYSBiaXRtYXNrIG9mIGZsYWdzIHdoaWNoIGNvbnRyb2wgaG93Cit0aGUgZmlsZSBzaG91bGQgYmUgb3BlbmVkLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEVYVDJfRklMRV9XUklURQorT3BlbiB0aGUgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gIFdpdGhvdXQgdGhpcyBmbGFnLCB0aGUgZmlsZSBpcworb3BlbmVkIGZvciB3cml0aW5nIG9ubHkuCisKK0BpdGVtIEVYVDJfRklMRV9DUkVBVEUKK0NyZWF0ZSB0aGUgZmlsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgorCitAZW5kIHRhYmxlCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXh0Ml9maWxzeXMgZXh0MmZzX2ZpbGVfZ2V0X2ZzIChleHQyX2ZpbGVfdCBAdmFye2ZpbGV9KQorUmV0dXJuIHRoZSBmaWxlc3lzdGVtIGhhbmRsZSB3aGVyZSB0aGUgb3BlbiBmaWxlIEB2YXJ7ZmlsZX0gd2FzIG9wZW5lZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfY2xvc2UgKGV4dDJfZmlsZV90IEB2YXJ7ZmlsZX0pCitDbG9zZSB0aGUgZmlsZSBoYW5kbGUgQHZhcntmaWxlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfZmx1c2ggKGV4dDJfZmlsZV90IEB2YXJ7ZmlsZX0pCitGb3JjZSBhbnkgZGF0YSB3cml0dGVuIHZpYSBAY29kZXtleHQyZnNfZmlsZV93cml0ZX0gdG8gZGlzay4KK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIFJlYWRpbmcgYW5kIHdyaXRpbmcgZGF0YSwgQ2hhbmdpbmcgdGhlIGZpbGUgb2Zmc2V0ICwgRmlsZSBoYW5kbGUgbWFuaXB1bGF0aW9uLCBGaWxlIEkvTyBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gUmVhZGluZyBhbmQgd3JpdGluZyBkYXRhCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfZmlsZV9yZWFkIChleHQyX2ZpbGVfdCBAdmFye2ZpbGV9LCB2b2lkICpAdmFye2J1Zn0sIHVuc2lnbmVkIGludCBAdmFye3dhbnRlZH0sIHVuc2lnbmVkIGludCAqQHZhcntnb3R9KQorUmVhZCBAdmFye3dhbnRlZH0gYnl0ZXMgb2YgZGF0YSBmcm9tIEB2YXJ7ZmlsZX0gc3RvcmUgaXQgaW4gdGhlIGJ1ZmZlcgorQHZhcntidWZ9LiAgVGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdhcyBhY3R1YWxseSByZWFkIGlzIHJldHVybmVkCit2aWEgQHZhcntnb3R9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfZmlsZV93cml0ZSAoZXh0Ml9maWxlX3QgQHZhcntmaWxlfSwgY29uc3Qgdm9pZCAqQHZhcntidWZ9LCB1bnNpZ25lZCBpbnQgQHZhcntuYnl0ZXN9LCB1bnNpZ25lZCBpbnQgKkB2YXJ7d3JpdHRlbn0pCitXcml0ZSBAdmFye3dhbnRlZH0gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBidWZmZXIgQHZhcntidWZ9IHRvIHRoZQorY3VycmVudCBmaWxlIHBvc2l0aW9uIG9mIEB2YXJ7ZmlsZX0uICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2FzIAorYWN0dWFsbHkgd3JpdHRlbiBpcyByZXR1cm5lZCB2aWEgQHZhcntnb3R9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQ2hhbmdpbmcgdGhlIGZpbGUgb2Zmc2V0ICwgR2V0dGluZyB0aGUgZmlsZSBzaXplLCBSZWFkaW5nIGFuZCB3cml0aW5nIGRhdGEsIEZpbGUgSS9PIEZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBDaGFuZ2luZyB0aGUgZmlsZSBvZmZzZXQKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19maWxlX2xsc2VlayAoZXh0Ml9maWxlX3QgQHZhcntmaWxlfSwgX191NjQgQHZhcntvZmZzZXR9LCBpbnQgQHZhcnt3aGVuY2V9LCBfX3U2NCAqQHZhcntyZXRfcG9zfSkKK0BkZWZ0eXBlZnVueCBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfbHNlZWsgKGV4dDJfZmlsZV90IEB2YXJ7ZmlsZX0sIGV4dDJfb2ZmX3QgQHZhcntvZmZzZXR9LCBpbnQgQHZhcnt3aGVuY2V9LCBleHQyX29mZl90ICpAdmFye3JldF9wb3N9KQorQ2hhbmdlIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gb2YgQHZhcntmaWxlfSBhY2NvcmRpbmcgdG8gdGhlCitkaXJlY3RpdmUgQHZhcnt3aGVuY2V9IGFzIGZvbGxvd3M6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gRVhUMl9TRUVLX1NFVAorVGhlIGZpbGUgcG9zaXRpb24gaXMgc2V0IHRvIEB2YXJ7b2Zmc2V0fSBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCitmaWxlLgorCitAaXRlbSBFWFQyX1NFRUtfQ1VSCitUaGUgZmlsZSBwb3NpdGlvbiBzZXQgdG8gaXRzIGN1cnJlbnQgbG9jYXRpb24gcGx1cyBAdmFye29mZnNldH0gYnl0ZXMuCisKK0BpdGVtIEVYVDJfU0VFS19FTkQKK1RoZSBmaWxlIHBvc2l0aW9uIGlzIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBwbHVzIEB2YXJ7b2Zmc2V0fQorYnl0ZXMuCitAZW5kIHRhYmxlCisKK1RoZSBjdXJyZW50IG9mZnNldCBpcyByZXR1cm5lZCB2aWEgQHZhcntyZXRfcG9zfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIEdldHRpbmcgdGhlIGZpbGUgc2l6ZSwgICwgQ2hhbmdpbmcgdGhlIGZpbGUgb2Zmc2V0ICwgRmlsZSBJL08gRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIEdldHRpbmcgdGhlIGZpbGUgc2l6ZQorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfZ2V0X2xzaXplIChleHQyX2ZpbGVfdCBAdmFye2ZpbGV9LCBfX3U2NCAqQHZhcntyZXRfc2l6ZX0pCitSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZpbGUgQHZhcntmaWxlfSBpbiBAdmFye3JldF9zaXplfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBleHQyX29mZl90IGV4dDJmc19maWxlX2dldF9zaXplIChleHQyX2ZpbGVfdCBAdmFye2ZpbGV9KQorUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmaWxlIEB2YXJ7ZmlsZX0uCitAZW5kIGRlZnR5cGVmdW4KKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBJbm9kZSBGdW5jdGlvbnMsIERpcmVjdG9yeSBmdW5jdGlvbnMsIEZpbGUgSS9PIEZ1bmN0aW9ucywgRVhUMkZTIExpYnJhcnkgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzZWN0aW9uIElub2RlIEZ1bmN0aW9ucworCitAbWVudQorKiBSZWFkaW5nIGFuZCB3cml0aW5nIGlub2Rlczo6ICAKKyogSXRlcmF0aW5nIG92ZXIgaW5vZGVzIGluIGEgZmlsZXN5c3RlbTo6ICAKKyogSXRlcmF0aW5nIG92ZXIgYmxvY2tzIGluIGFuIGlub2RlOjogIAorKiBJbm9kZSBDb252ZW5pZW5jZSBGdW5jdGlvbnM6OiAgCitAZW5kIG1lbnUKKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBSZWFkaW5nIGFuZCB3cml0aW5nIGlub2RlcywgSXRlcmF0aW5nIG92ZXIgaW5vZGVzIGluIGEgZmlsZXN5c3RlbSwgSW5vZGUgRnVuY3Rpb25zLCBJbm9kZSBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gUmVhZGluZyBhbmQgd3JpdGluZyBpbm9kZXMKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19yZWFkX2lub2RlIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIHN0cnVjdCBleHQyX2lub2RlICpAdmFye2lub2RlfSkKK1JlYWQgdGhlIGlub2RlIG51bWJlciBAdmFye2lub30gaW50byBAdmFye2lub2RlfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2lub2RlIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIHN0cnVjdCBleHQyX2lub2RlICpAdmFye2lub2RlfSkKK1dyaXRlIEB2YXJ7aW5vZGV9IHRvIGlub2RlIEB2YXJ7aW5vfS4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgSXRlcmF0aW5nIG92ZXIgaW5vZGVzIGluIGEgZmlsZXN5c3RlbSwgSXRlcmF0aW5nIG92ZXIgYmxvY2tzIGluIGFuIGlub2RlLCBSZWFkaW5nIGFuZCB3cml0aW5nIGlub2RlcywgSW5vZGUgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIEl0ZXJhdGluZyBvdmVyIGlub2RlcyBpbiBhIGZpbGVzeXN0ZW0KKworVGhlIGlub2RlX3NjYW4gYWJzdHJhY3Rpb24gaXMgdXNlZnVsIGZvciBpdGVyYXRpbmcgb3ZlciBhbGwgdGhlIGlub2RlcworaW4gYSBmaWxlc3lzdGVtLiAgCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfb3Blbl9pbm9kZV9zY2FuIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgaW50IEB2YXJ7YnVmZmVyX2Jsb2Nrc30sIGV4dDJfaW5vZGVfc2NhbiAqQHZhcntzY2FufSkKK0luaXRpYWxpemUgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSBAdmFye3NjYW59LiAgVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5CitAY29kZXtleHQyZnNfZ2V0X25leHRfaW5vZGV9LiAgVGhlIEB2YXJ7YnVmZmVyX2Jsb2Nrc30gcGFyYW1ldGVyCitjb250cm9scyBob3cgbWFueSBibG9ja3Mgb2YgdGhlIGlub2RlIHRhYmxlIGFyZSByZWFkIGluIGF0IGEgdGltZS4gIEEKK2xhcmdlIG51bWJlciBvZiBibG9ja3MgcmVxdWlyZXMgbW9yZSBtZW1vcnksIGJ1dCByZWR1Y2VzIHRoZSBvdmVyaGVhZCBpbgorc2Vla2luZyBhbmQgcmVhZGluZyBmcm9tIHRoZSBkaXNrLiAgSWYgQHZhcntidWZmZXJfYmxvY2tzfSBpcyB6ZXJvLCBhCitzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGV4dDJmc19jbG9zZV9pbm9kZV9zY2FuIChleHQyX2lub2RlX3NjYW4gQHZhcntzY2FufSkKK1JlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggQHZhcntzY2FufSBhbmQgaW52YWxpZGF0ZSBpdC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2dldF9uZXh0X2lub2RlIChleHQyX2lub2RlX3NjYW4gQHZhcntzY2FufSwgZXh0Ml9pbm9fdCAqQHZhcntpbm99LCBzdHJ1Y3QgZXh0Ml9pbm9kZSAqQHZhcntpbm9kZX0pCisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCBpbm9kZSBmcm9tIHRoZSBmaWxlc3lzdGVtOyB0aGUgaW5vZGUKK251bWJlciBvZiB0aGUgaW5vZGUgaXMgc3RvcmVkIGluIEB2YXJ7aW5vfSwgYW5kIHRoZSBpbm9kZSBpcyBzdG9yZWQgaW4KK0B2YXJ7aW5vZGV9LiAgCisKK0lmIHRoZSBpbm9kZSBpcyBsb2NhdGVkIGluIGEgYmxvY2sgdGhhdCBoYXMgYmVlbiBtYXJrZWQgYXMgYmFkLAorQGNvZGV7ZXh0MmZzX2dldF9uZXh0X2lub2RlfSB3aWxsIHJldHVybiB0aGUgZXJyb3IKK0Bjb2Rle0VYVDJfRVRfQkFEX0JMT0NLX0lOX0lOT0RFX1RBQkxFfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2lub2RlX3NjYW5fZ290b19ibG9ja2dyb3VwIChleHQyX2lub2RlX3NjYW4gQHZhcntzY2FufSwgaW50IEB2YXJ7Z3JvdXB9KQorU3RhcnQgdGhlIGlub2RlIHNjYW4gYXQgYSBwYXJ0aWN1bGFyIGV4dDIgYmxvY2tncm91cCwgQHZhcntncm91cH0uICAKK1RoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgYXQgYW55IHRpbWUgd2hpbGUgQHZhcntzY2FufSBpcyB2YWxpZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGV4dDJmc19zZXRfaW5vZGVfY2FsbGJhY2sgKGV4dDJfaW5vZGVfc2NhbiBAdmFye3NjYW59LCBlcnJjb2RlX3QgKCpkb25lX2dyb3VwKShleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9kZV9zY2FuIEB2YXJ7c2Nhbn0sIGRncnBfdCBAdmFye2dyb3VwfSwgdm9pZCAqIEB2YXJ7cHJpdmF0ZX0pLCB2b2lkICpAdmFye2RvbmVfZ3JvdXBfZGF0YX0pCitSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGJ5CitAY29kZXtleHQyX2dldF9uZXh0X2lub2RlfSB3aGVuIGFsbCBvZiB0aGUgaW5vZGVzIGluIGEgYmxvY2sgZ3JvdXAgaGF2ZQorYmVlbiBwcm9jZXNzZWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IGV4dDJmc19pbm9kZV9zY2FuX2ZsYWdzIChleHQyX2lub2RlX3NjYW4gQHZhcntzY2FufSwgaW50IEB2YXJ7c2V0X2ZsYWdzfSwgaW50IEB2YXJ7Y2xlYXJfZmxhZ3N9KQorCitTZXQgdGhlIHNjYW5fZmxhZ3MgQHZhcntzZXRfZmxhZ3N9IGFuZCBjbGVhciB0aGUgc2Nhbl9mbGFncyBAdmFye2NsZWFyX2ZsYWdzfS4KK1RoZSBmb2xsb3dpbmcgZmxhZ3MgY2FuIGJlIHNldCB1c2luZyB0aGlzIGludGVyZmFjZToKKworQHRhYmxlIEBzYW1wCisKK0BpdGVtIEVYVDJfU0ZfU0tJUF9NSVNTSU5HX0lUQUJMRSAKK1doZW4gYSBibG9jayBncm91cCBpcyBtaXNzaW5nIGFuIGlub2RlIHRhYmxlLCBza2lwIGl0LiAgSWYgdGhpcyBmbGFnIGlzCitub3Qgc2V0IEBjb2Rle2V4dDJmc19nZXRfbmV4dF9pbm9kZX0gd2lsbCByZXR1cm4gdGhlIGVycm9yCitFWFQyX0VUX01JU1NJTkdfSU5PREVfVEFCTEUuCisKK0BlbmQgdGFibGUKKworQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgSXRlcmF0aW5nIG92ZXIgYmxvY2tzIGluIGFuIGlub2RlLCBJbm9kZSBDb252ZW5pZW5jZSBGdW5jdGlvbnMsIEl0ZXJhdGluZyBvdmVyIGlub2RlcyBpbiBhIGZpbGVzeXN0ZW0sIElub2RlIEZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBJdGVyYXRpbmcgb3ZlciBibG9ja3MgaW4gYW4gaW5vZGUKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19ibG9ja19pdGVyYXRlIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIGludCBAdmFye2ZsYWdzfSwgY2hhciAqYmxvY2tfYnVmLCBpbnQgKCpmdW5jKShleHQyX2ZpbHN5cyBAdmFye2ZzfSwgYmxrX3QgKkB2YXJ7YmxvY2tucn0sIGludCBAdmFye2Jsb2NrY250fSwgdm9pZCAqQHZhcntwcml2YXRlfSksIHZvaWQgKkB2YXJ7cHJpdmF0ZX0pCisKK0l0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGJsb2NrcyBpbiBpbm9kZSBudW1iZXIgQHZhcntpbm99IGluIGZpbGVzeXN0ZW0KK0B2YXJ7ZnN9LCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBAdmFye2Z1bmN9IGZvciBlYWNoIGJsb2NrIGluIHRoZQoraW5vZGUuICBUaGUgQHZhcntibG9ja19idWZ9IHBhcmFtZXRlciBzaG91bGQgZWl0aGVyIGJlIE5VTEwsIG9yIGlmIHRoZQorQGNvZGV7ZXh0MmZzX2Jsb2NrX2l0ZXJhdGV9IGZ1bmN0aW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5LCB0aGUgb3ZlcmhlYWQKK29mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgc2NyYXRjaCBtZW1vcnkgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyBhCitwb2ludGVyIHRvIGEgc2NyYXRjaCBidWZmZXIgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgdGhyZWUgdGltZXMgdGhlCitmaWxlc3lzdGVtJ3MgYmxvY2tzaXplLiAgCisKK1RoZSBAdmFye2ZsYWdzfSBwYXJhbWV0ZXIgY29udHJvbHMgaG93IHRoZSBpdGVyYXRvciB3aWxsIGZ1bmN0aW9uOgorCitAdGFibGUgQHNhbXAKKworQGl0ZW0gQkxPQ0tfRkxBR19IT0xFCitUaGlzIGZsYWcgaW5kaWNpYXRlcyB0aGF0IHRoZSBpbnRlcmF0b3IgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbgorYmxvY2tzIHdoZXJlIHRoZSBibG9jayBudW1iZXIgaXMgemVybyAoYWxzbyBrbm93biBhcyBgYGhvbGVzJycuKSAgSXQgaXMKK2Fsc28ga25vd24gYXMgQkxPQ0tfRkxBR19BUFBFTkQsIHNpbmNlIGl0IGlzIGFsc28gdXNlZCBieSBmdW5jdGlvbnMKK3N1Y2ggYXMgZXh0MmZzX2V4cGFuZF9kaXIoKSB0byBhZGQgYSBuZXcgYmxvY2sgdG8gYW4gaW5vZGUuCisKK0BpdGVtIEJMT0NLX0ZMQUdfREVQVEhfVFJBVkVSU0UKK1RoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gZm9yIHRoZQoraW5kaXJlY3QsIGRvdWJseSBpbmRpcmVjdCwgZXRjLiBibG9ja3Mgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbGwKK29mIHRoZSBibG9ja3MgY29udGFpbmluZWQgaW4gdGhlIGluZGlyZWN0IGJsb2NrcyBhcmUgcHJvY2Vzc2VkLgorVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBnb2luZyB0byBiZSBkZWFsbG9jYXRpbmcgYmxvY2tzIGZyb20gYW4KK2lub2RlLgorCitAaXRlbSBCTE9DS19GTEFHX0RBVEFfT05MWQorVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBpdGVyYXRvciBmdW5jdGlvbiBzaG91bGQgYmUKK2NhbGxlZCBmb3IgZGF0YSBibG9ja3Mgb25seS4KKworQGVuZCB0YWJsZQorCitUaGUgY2FsbGJhY2sgZnVuY3Rpb24gQHZhcntmdW5jfSBpcyBjYWxsZWQgd2l0aCBhIG51bWJlciBvZiBwYXJhbWV0ZXJzOwordGhlIEB2YXJ7ZnN9IGFuZCBAdmFye3ByaXZhdGV9IHBhcmFtZXRlcnMgYXJlIHNlbGYtZXhwbGFuYXRvcnksIGFuZAordGhlaXIgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIHRoZSBwYXJhbWV0ZXJzIHRvCitAY29kZXtleHQyZnNfYmxvY2tfaXRlcmF0ZX0uICAoVGhlIEB2YXJ7cHJpdmF0ZX0gZGF0YSBzdHJ1Y3R1cmUgaXMKK2dlbmVyYWxseSB1c2VkIGJ5IGNhbGxlcnMgdG8gQGNvZGV7ZXh0MmZzX2Jsb2NrX2l0ZXJhdGV9IHNvIHRoYXQgc29tZQorcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBjYW4gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4gIFRoZSAKK0B2YXJ7YmxvY2tjbnR9IHBhcmFtZXRlciwgaWYgbm9uLW5lZ2F0aXZlLCBpbmRpY2F0ZXMgdGhlIGxvZ2ljYWwgYmxvY2sKK251bWJlciBvZiBhIGRhdGEgYmxvY2sgaW4gdGhlIGlub2RlLiAgSWYgQHZhcntibG9ja2NudH0gaXMgbGVzcyB0aGFuCit6ZXJvLCB0aGVuIEB2YXJ7ZnVuY30gd2FzIGNhbGxlZCBvbiBhIG1ldGFkYXRhIGJsb2NrLCBhbmQgQHZhcntibG9ja2NudH0KK3dpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgQkxPQ0tfQ09VTlRfSU5ELCBCTE9DS19DT1VOVF9ESU5ELAorQkxPQ0tfQ09VTlRfVElORCwgb3IgQkxPQ0tfQ09VTlRfVFJBTlNMQVRPUi4gIFRoZSBAdmFye2Jsb2NrbnJ9IGlzIGEKK3BvaW50ZXIgdG8gdGhlIGlub2RlIG9yIGluZGlyZWN0IGJsb2NrIGVudHJ5IGxpc3RpbmcgcGh5c2ljYWwgYmxvY2sKK251bWJlci4gIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBtYXkgbW9kaWZ5IHRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIsIGlmCitpdCByZXR1cm5zIHRoZSBAdmFye0JMT0NLX0NIQU5HRUR9IGZsYWcuCisKKworVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIEB2YXJ7ZnVuY30gcmV0dXJucyBhIHJlc3VsdCBjb2RlIHdoaWNoIGlzIGNvbXBvc2VkIG9mCit0aGUgbG9naWNhbCBPUiBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorCitAdGFibGUgQHNhbXAKKworQGl0ZW0gQkxPQ0tfQ0hBTkdFRAorCitUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgY2FsbGJhY2sgZnVuY3Rpb24gaGFzIG1vZGlmaWVkIHRoZSBwaHlzaWNhbAorYmxvY2sgbnVtYmVyIHBvaW50ZWQgdG8gYnkgQHZhcntibG9ja25yfS4KKworQGl0ZW0gQkxPQ0tfQUJPUlQKKworVGhpcyBmbGFnIHJlcXVlc3RzIHRoYXQgQGNvZGV7ZXh0MmZzX2Jsb2NrX2l0ZXJhdGV9IHRvIHN0b3AgaW1tZWRpYXRlbHkKK2FuZCByZXR1cm4gdG8gdGhlIGNhbGxlci4KKworQGVuZCB0YWJsZQorCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19ibG9ja19pdGVyYXRlMiAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntpbm99LCBpbnQgQHZhcntmbGFnc30sIGNoYXIgKkB2YXJ7YmxvY2t9X2J1ZiwgaW50ICgqZnVuYykoZXh0Ml9maWxzeXMgQHZhcntmc30sIGJsa190ICpAdmFye2Jsb2NrbnJ9LCBlMl9ibGtjbnRfdCBAdmFye2Jsb2NrY250fSwgYmxrX3QgQHZhcntyZWZfYmxrfSwgaW50ICBAdmFye3JlZl9vZmZzZXR9LCB2b2lkICpAdmFye3ByaXZhdGV9KSwgdm9pZCAqQHZhcntwcml2YXRlfSkKKworVGhpcyBmdW5jdGlvbiBpcyBtdWNoIGxpa2UgQGNvZGV7ZXh0MmZzX2Jsb2NrX2l0ZXJhdGV9LCBleGNlcHQgdGhhdCB0aGUKK0B2YXJ7YmxvY2tjbnR9IHR5cGUgaXMgYSA2NC1iaXQgc2lnbmVkIHF1YW50aXR5LCB0byBzdXBwb3J0IGxhcmdlcgorZmlsZXMsIGFuZCB0aGUgYWRkaXRpb24gb2YgdGhlIEB2YXJ7cmVmX2Jsa30gYW5kIEB2YXJ7cmVmX29mZnNldH0KK2FyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBpZGVudGlmeSB0aGUgbG9jYXRpb24KK29mIHRoZSBwaHlzaWNhbCBibG9jayBwb2ludGVkIHRvIGJ5IHBvaW50ZXIgQHZhcntibG9ja25yfS4gIElmCitAdmFye3JlZl9ibGt9IGlzIHplcm8sIHRoZW4gQHZhcntyZWZfb2Zmc2V0fSBjb250YWlucyB0aGUgb2Zmc2V0IGludG8KK3RoZSBAY29kZXtpX2Jsb2Nrc30gYXJyYXkuICBJZiBAdmFye3JlZl9ibGt9IGlzIG5vbi16ZXJvLCB0aGVuIHRoZSBwaHlzaWNhbAorYmxvY2sgbG9jYXRpb24gaXMgY29udGFpbmVkIGluc2lkZSBhbiBpbmRpcmVjdCBibG9jayBncm91cCwgYW5kCitAdmFye3JlZl9vZmZzZXR9IGNvbnRhaW5zIHRoZSBvZmZzZXQgaW50byB0aGUgaW5kaXJlY3QgYmxvY2suCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIElub2RlIENvbnZlbmllbmNlIEZ1bmN0aW9ucywgICwgSXRlcmF0aW5nIG92ZXIgYmxvY2tzIGluIGFuIGlub2RlLCBJbm9kZSBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBJbm9kZXMKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19nZXRfYmxvY2tzIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIGJsa190ICpAdmFye2Jsb2Nrc30pCisKK1JldHVybnMgYW4gYXJyYXkgb2YgYmxvY2tzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpcmVjdCwKK2luZGlyZWN0LCBkb3VibHkgaW5kaXJlY3QsIGFuZCB0cmlwbHkgaW5kaXJlY3QgYmxvY2tzIGFzIHN0b3JlZCBpbiB0aGUKK2lub2RlIHN0cnVjdHVyZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2RpcmVjdG9yeSAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntpbm99KQorUmV0dXJucyAwIGlmIEB2YXJ7aW5vfSBpcyBhIGRpcmVjdG9yeSwgYW5kIEBjb2Rle0VOT1RESVJ9IGlmIGl0IGlzIG5vdC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MgKHN0cnVjdCBleHQyX2lub2RlICpAdmFye2lub2RlfSkKKworUmV0dXJucyAxIGlmIHRoZSBpbm9kZSdzIGJsb2NrIGVudHJpZXMgYWN0dWFsbHkgdmFsaWQgYmxvY2sgZW50cmllcywgYW5kCiswIGlmIG5vdC4gIElub2RlcyB3aGljaCByZXByZXNlbnQgZGV2aWNlcyBhbmQgZmFzdCBzeW1ib2xpYyBsaW5rcyBkbyBub3QKK2NvbnRhaW4gdmFsaWQgYmxvY2sgZW50cmllcy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIERpcmVjdG9yeSBmdW5jdGlvbnMsIEJpdG1hcCBGdW5jdGlvbnMsIElub2RlIEZ1bmN0aW9ucywgRVhUMkZTIExpYnJhcnkgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzZWN0aW9uIERpcmVjdG9yeSBmdW5jdGlvbnMKKworQG1lbnUKKyogRGlyZWN0b3J5IGJsb2NrIGZ1bmN0aW9uczo6ICAgCisqIEl0ZXJhdGluZyBvdmVyIGEgZGlyZWN0b3J5OjogIAorKiBDcmVhdGluZyBhbmQgZXhwYW5kaW5nIGRpcmVjdG9yaWVzOjogIAorKiBDcmVhdGluZyBhbmQgcmVtb3ZpbmcgZGlyZWN0b3J5IGVudHJpZXM6OiAgCisqIExvb2tpbmcgdXAgZmlsZW5hbWVzOjogICAgICAgIAorKiBUcmFuc2xhdGluZyBpbm9kZSBudW1iZXJzIHRvIGZpbGVuYW1lczo6ICAKK0BlbmQgbWVudQorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIERpcmVjdG9yeSBibG9jayBmdW5jdGlvbnMsIEl0ZXJhdGluZyBvdmVyIGEgZGlyZWN0b3J5LCBEaXJlY3RvcnkgZnVuY3Rpb25zLCBEaXJlY3RvcnkgZnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIERpcmVjdG9yeSBibG9jayBmdW5jdGlvbnMKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19yZWFkX2Rpcl9ibG9jayAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGJsa190IEB2YXJ7YmxvY2t9LCB2b2lkICpAdmFye2J1Zn0pCisKK1RoaXMgZnVuY3Rpb24gcmVhZHMgYSBkaXJlY3RvcnkgYmxvY2ssIHBlcmZvcm1pbmcgYW55IG5lY2Vzc2FyeQorYnl0ZSBzd2FwcGluZyBpZiBuZWNlc3NhcnkuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc193cml0ZV9kaXJfYmxvY2sgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBibGtfdCBAdmFye2Jsb2NrfSwgdm9pZCAqQHZhcntidWZ9KQorCitUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIGRpcmVjdG9yeSBibG9jaywgcGVyZm9ybWluZyBhbnkgbmVjZXNzYXJ5CitieXRlIHN3YXBwaW5nIGlmIG5lY2Vzc2FyeS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX25ld19kaXJfYmxvY2sgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBleHQyX2lub190IEB2YXJ7ZGlyX2lub30sIGV4dDJfaW5vX3QgQHZhcntwYXJlbnRfaW5vfSwgY2hhciAqKkB2YXJ7YmxvY2t9KQorCitUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IGJsb2NrIGluIEB2YXJ7YmxvY2t9LiAgSWYKK0B2YXJ7ZGlyX2lub30gaXMgbm9uLXplcm8sIHRoZW4gQHZhcntkaXJfaW5mb30gYW5kIEB2YXJ7cGFyZW50X2lub30gaXMgdXNlZAordG8gaW5pdGlhbGl6ZSBkaXJlY3RvcnkgZW50cmllcyBmb3IgQGZpbGV7Ln0gYW5kIEBmaWxley4ufSwgcmVzcGVjdGl2ZWx5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgSXRlcmF0aW5nIG92ZXIgYSBkaXJlY3RvcnksIENyZWF0aW5nIGFuZCBleHBhbmRpbmcgZGlyZWN0b3JpZXMsIERpcmVjdG9yeSBibG9jayBmdW5jdGlvbnMsIERpcmVjdG9yeSBmdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gSXRlcmF0aW5nIG92ZXIgYSBkaXJlY3RvcnkKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19kaXJfaXRlcmF0ZSAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntkaXJ9LCBpbnQgQHZhcntmbGFnc30sIGNoYXIgKkB2YXJ7YmxvY2tfYnVmfSwgaW50ICgqQHZhcntmdW5jfSkoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpAdmFye2RpcmVudH0sIGludCBAdmFye29mZnNldH0sIGludCBAdmFye2Jsb2Nrc2l6ZX0sIGNoYXIgKkB2YXJ7YnVmfSwgdm9pZCAqQHZhcntwcml2YXRlfSksIHZvaWQgKkB2YXJ7cHJpdmF0ZX0pCisKK1RoaXMgZnVuY3Rpb24gaW50ZXJhdGVzIG92ZXIgYWxsIG9mIHRoZSBkaXJlY3RvcnkgZW50cmllcyBpbiB0aGUKK2RpcmVjdG9yeSBAdmFye2Rpcn0sIGNhbGxpbmcgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIEB2YXJ7ZnVuY30gZm9yIGVhY2gKK2RpcmVjdG9yeSBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5LiAgVGhlIEB2YXJ7YmxvY2tfYnVmfSBwYXJhbWV0ZXIgc2hvdWxkCitlaXRoZXIgYmUgTlVMTCwgb3IgaWYgdGhlIEBjb2Rle2V4dDJmc19kaXJfaXRlcmF0ZX0gZnVuY3Rpb24gaXMgCitjYWxsZWQgcmVwZWF0ZWRseSwgdGhlIG92ZXJoZWFkIG9mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgCitzY3JhdGNoIG1lbW9yeSBjYW4gYmUgYXZvaWRlZCBieSBwYXNzaW5nIGEgcG9pbnRlciB0byBhIHNjcmF0Y2ggYnVmZmVyCit3aGljaCBtdXN0IGJlIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgZmlsZXN5c3RlbSdzIGJsb2Nrc2l6ZS4gIAorCitUaGUgQHZhcntmbGFnc30gcGFyYW1ldGVyIGNvbnRyb2xzIGhvdyB0aGUgaXRlcmF0b3Igd2lsbCBmdW5jdGlvbjoKKworQHRhYmxlIEBzYW1wCisKK0BpdGVtIERJUkVOVF9GTEFHX0lOQ0xVREVfRU1QVFkKKworVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGV2ZW4gCitmb3IgZGVsZXRlZCBvciBlbXB0eSBkaXJlY3RvcnkgZW50cmllcy4KKworQGVuZCB0YWJsZQorCitAZW5kIGRlZnR5cGVmdW4KKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBDcmVhdGluZyBhbmQgZXhwYW5kaW5nIGRpcmVjdG9yaWVzLCBDcmVhdGluZyBhbmQgcmVtb3ZpbmcgZGlyZWN0b3J5IGVudHJpZXMsIEl0ZXJhdGluZyBvdmVyIGEgZGlyZWN0b3J5LCBEaXJlY3RvcnkgZnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIENyZWF0aW5nIGFuZCBleHBhbmRpbmcgZGlyZWN0b3JpZXMKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19ta2RpciAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntwYXJlbnR9LCBleHQyX2lub190IEB2YXJ7aW51bX0sIGNvbnN0IGNoYXIgKkB2YXJ7bmFtZX0pCisKK1RoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkuICBJZiBAdmFye2ludW19IGlzIHplcm8sIHRoZW4gYQorbmV3IGlub2RlIHdpbGwgYmUgYWxsb2NhdGVkOyBvdGhlcndpc2UsIHRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBjcmVhdGVkIGluCit0aGUgaW5vZGUgc3BlY2lmaWVkIGJ5IEB2YXJ7aW51bX0uICBJZiBAdmFye25hbWV9IHNwZWNpZmllcyB0aGUgbmFtZSBvZgordGhlIG5ldyBkaXJlY3Rvcnk7IGlmIGl0IGlzIG5vbi1OVUxMLCB0aGVuIHRoZSBuZXcgZGlyZWN0b3J5IHdpbGwgYmUKK2xpbmtlZCBpbnRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IEB2YXJ7cGFyZW50fS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2V4cGFuZF9kaXIgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBleHQyX2lub190IEB2YXJ7ZGlyfSkKKworVGhpcyBmdW5jdGlvbiBhZGRzIGEgbmV3IGVtcHR5IGRpcmVjdG9yeSBibG9jayBhbmQgYXBwZW5kcyBpdCB0byAKK3RoZSBkaXJlY3RvcnkgQHZhcntkaXJ9LiAgVGhpcyBhbGxvd3MgZnVuY3Rpb25zIHN1Y2ggYXMKK0Bjb2Rle2V4dDJmc19saW5rfSB0byBhZGQgbmV3IGRpcmVjdG9yeSBlbnRyaWVzIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGlzIGZ1bGwuCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIENyZWF0aW5nIGFuZCByZW1vdmluZyBkaXJlY3RvcnkgZW50cmllcywgTG9va2luZyB1cCBmaWxlbmFtZXMsIENyZWF0aW5nIGFuZCBleHBhbmRpbmcgZGlyZWN0b3JpZXMsIERpcmVjdG9yeSBmdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gQ3JlYXRpbmcgYW5kIHJlbW92aW5nIGRpcmVjdG9yeSBlbnRyaWVzCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfbGluayAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntkaXJ9LCBjb25zdCBjaGFyICpAdmFye25hbWV9LCBleHQyX2lub190IEB2YXJ7aW5vfSwgaW50IGZsYWdzKQorCitUaGlzIGZ1bmN0aW9uIGFkZHMgYSBuZXcgZGlyZWN0b3J5IGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgQHZhcntkaXJ9LCAKK3dpdGggQHZhcntuYW1lfSBhbmQgQHZhcntpbm99IHNwZWNpZnlpbmcgdGhlIG5hbWUgYW5kIGlub2RlIG51bWJlciBpbgordGhlIGRpcmVjdG9yeSBlbnRyeSwgcmVzcGVjdGl2ZWx5LiAgCisKK1RoZSBsb3cgMyBiaXRzIG9mIHRoZSBmbGFncyBmaWVsZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgdHlwZSBvZgoraW5vZGU6ICAgKE5vIG90aGVyIGZsYWdzIGFyZSBjdXJyZW50bHkgZGVmaW5lZC4pCisKK0B0YWJsZSBAc2FtcAorCitAaXRlbSBFWFQyX0ZUX1VOS05PV04KKworVGhlIGZpbGUgdHlwZSBpcyB1bmtub3duLgorCitAaXRlbSBFWFQyX0ZUX1JFR19GSUxFCisKK1RoZSBmaWxlIHR5cGUgaXMgYSBub3JtYWwgZmlsZS4KKworQGl0ZW0gRVhUMl9GVF9ESVIKKworVGhlIGZpbGUgdHlwZSBpcyBhIGRpcmVjdG9yeS4KKworQGl0ZW0gRVhUMl9GVF9DSFJERVYKKworVGhlIGZpbGUgdHlwZSBpcyBhIGNoYXJhY3RlciBkZXZpY2UuCisKK0BpdGVtIEVYVDJfRlRfQkxLREVWCisKK1RoZSBmaWxlIHR5cGUgaXMgYSBibG9jayBkZXZpY2UuCisKK0BpdGVtIEVYVDJfRlRfRklGTworCitUaGUgZmlsZSB0eXBlIGlzIGEgbmFtZWQgcGlwZS4KKworQGl0ZW0gRVhUMl9GVF9TT0NLCisKK1RoZSBmaWxlIHR5cGUgaXMgYSB1bml4IGRvbWFpbiBzb2NrZXQuCisKK0BpdGVtIEVYVDJfRlRfU1lNTElOSworCitUaGUgZmlsZSB0eXBlIGlzIGEgc3ltYm9saWMgbGluay4KK0BlbmQgdGFibGUgCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX3VubGluayAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntkaXJ9LCBjb25zdCBjaGFyICpAdmFye25hbWV9LCBleHQyX2lub190IEB2YXJ7aW5vfSwgaW50IEB2YXJ7ZmxhZ3N9KQorCitUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBkaXJlY3RvcnkgZW50cnkgZnJvbSBAdmFye2Rpcn0uCitUaGUgZGlyZWN0b3J5IGVudHJ5IHRvIGJlIHJlbW92ZWQgaXMgdGhlIGZpcnN0IG9uZSB3aGljaCBpcworbWF0Y2hlZCBieSBAdmFye25hbWV9IGFuZCBAdmFye2lub30uICBJZiBAdmFye25hbWV9IGlzIG5vbi1OVUxMLCAKK3RoZSBkaXJlY3RvcnkgZW50cnkncyBuYW1lIG11c3QgbWF0Y2ggQHZhcntuYW1lfS4gIElmIEB2YXJ7aW5vfSBpcworbm9uLXplcm8sIHRoZSBkaXJlY3RvcnkgZW50cnkncyBpbm9kZSBudW1iZXIgbXVzdCBtYXRjaCBAdmFye2lub30uCitObyBmbGFncyBhcmUgY3VycmVudGx5IGRlZmluZWQgZm9yIEBjb2Rle2V4dDJmc191bmxpbmt9OyBjYWxsZXJzIHNob3VsZAorcGFzcyBpbiB6ZXJvIHRvIHRoaXMgcGFyYW1ldGVyLgorCitAZW5kIGRlZnR5cGVmdW4KKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBMb29raW5nIHVwIGZpbGVuYW1lcywgVHJhbnNsYXRpbmcgaW5vZGUgbnVtYmVycyB0byBmaWxlbmFtZXMsIENyZWF0aW5nIGFuZCByZW1vdmluZyBkaXJlY3RvcnkgZW50cmllcywgRGlyZWN0b3J5IGZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBMb29raW5nIHVwIGZpbGVuYW1lcworCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2xvb2t1cCAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntkaXJ9LCBjb25zdCBjaGFyICpAdmFye25hbWV9LCBpbnQgQHZhcntuYW1lbGVufSwgY2hhciAqQHZhcntidWZ9LCBleHQyX2lub190ICpAdmFye2lub2RlfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX25hbWVpIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye3Jvb3R9LCBleHQyX2lub190IEB2YXJ7Y3dkfSwgY29uc3QgY2hhciAqQHZhcntuYW1lfSwgZXh0Ml9pbm9fdCAqQHZhcntpbm9kZX0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19uYW1laV9mb2xsb3cgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBleHQyX2lub190IEB2YXJ7cm9vdH0sIGV4dDJfaW5vX3QgQHZhcntjd2R9LCBjb25zdCBjaGFyICpAdmFye25hbWV9LCBleHQyX2lub190ICpAdmFye2lub2RlfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2ZvbGxvd19saW5rIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye3Jvb3R9LCBleHQyX2lub190IEB2YXJ7Y3dkfSwgZXh0Ml9pbm9fdCBAdmFye2lub2RlfSwgZXh0Ml9pbm9fdCAqQHZhcntyZXN9X2lub2RlKQorQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgVHJhbnNsYXRpbmcgaW5vZGUgbnVtYmVycyB0byBmaWxlbmFtZXMsICAsIExvb2tpbmcgdXAgZmlsZW5hbWVzLCBEaXJlY3RvcnkgZnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIFRyYW5zbGF0aW5nIGlub2RlIG51bWJlcnMgdG8gZmlsZW5hbWVzCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfZ2V0X3BhdGhuYW1lIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2Rpcn0sIGV4dDJfaW5vX3QgQHZhcntpbm99LCBjaGFyICoqQHZhcntuYW1lfSkKK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQml0bWFwIEZ1bmN0aW9ucywgRVhUMiBkYXRhIGFic3RyYWN0aW9ucywgRGlyZWN0b3J5IGZ1bmN0aW9ucywgRVhUMkZTIExpYnJhcnkgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzZWN0aW9uIEJpdG1hcCBGdW5jdGlvbnMKKworQG1lbnUKKyogUmVhZGluZyBhbmQgV3JpdGluZyBCaXRtYXBzOjogIAorKiBBbGxvY2F0aW5nIEJpdG1hcHM6OiAgICAgICAgICAKKyogRnJlZSBiaXRtYXBzOjogICAgICAgICAgICAgICAgCisqIEJpdG1hcCBPcGVyYXRpb25zOjogICAgICAgICAgIAorKiBDb21wYXJpbmcgYml0bWFwczo6ICAgICAgICAgICAKKyogTW9kaWZ5aW5nIEJpdG1hcHM6OiAgICAgICAgICAgCisqIFJlc2l6aW5nIEJpdG1hcHM6OiAgICAgICAgICAgIAorKiBDbGVhcmluZyBCaXRtYXBzOjogICAgICAgICAgICAKK0BlbmQgbWVudQorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIFJlYWRpbmcgYW5kIFdyaXRpbmcgQml0bWFwcywgQWxsb2NhdGluZyBCaXRtYXBzLCBCaXRtYXAgRnVuY3Rpb25zLCBCaXRtYXAgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIFJlYWRpbmcgYW5kIFdyaXRpbmcgQml0bWFwcworCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2lub2RlX2JpdG1hcCAoZXh0Ml9maWxzeXMgQHZhcntmc30pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc193cml0ZV9ibG9ja19iaXRtYXAgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9pbm9kZV9iaXRtYXAgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9ibG9ja19iaXRtYXAgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9iaXRtYXBzIChleHQyX2ZpbHN5cyBAdmFye2ZzfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2JpdG1hcHMgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQWxsb2NhdGluZyBCaXRtYXBzLCBGcmVlIGJpdG1hcHMsIFJlYWRpbmcgYW5kIFdyaXRpbmcgQml0bWFwcywgQml0bWFwIEZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBBbGxvY2F0aW5nIEJpdG1hcHMKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV9nZW5lcmljX2JpdG1hcCAoX191MzIgQHZhcntzdGFydH0sIF9fdTMyIEB2YXJ7ZW5kfSwgX3UzMiBAdmFye3JlYWxfZW5kfSwgY29uc3QgY2hhciAqQHZhcntkZXNjcn0sIGV4dDJmc19nZW5lcmljX2JpdG1hcCAqQHZhcntyZXR9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfYmxvY2tfYml0bWFwIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgY29uc3QgY2hhciAqQHZhcntkZXNjcn0sIGV4dDJmc19ibG9ja19iaXRtYXAgKkB2YXJ7cmV0fSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2FsbG9jYXRlX2lub2RlX2JpdG1hcCAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGNvbnN0IGNoYXIgKkB2YXJ7ZGVzY3J9LCBleHQyZnNfaW5vZGVfYml0bWFwICpAdmFye3JldH0pCitAZW5kIGRlZnR5cGVmdW4KKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBGcmVlIGJpdG1hcHMsIEJpdG1hcCBPcGVyYXRpb25zLCBBbGxvY2F0aW5nIEJpdG1hcHMsIEJpdG1hcCBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gRnJlZWluZyBiaXRtYXBzCisKKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfZnJlZV9nZW5lcmljX2JpdG1hcCAoZXh0MmZzX2lub2RlX2JpdG1hcCBAdmFye2JpdG1hcH0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfZnJlZV9ibG9ja19iaXRtYXAgKGV4dDJmc19ibG9ja19iaXRtYXAgQHZhcntiaXRtYXB9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwIChleHQyZnNfaW5vZGVfYml0bWFwIEB2YXJ7Yml0bWFwfSkKK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQml0bWFwIE9wZXJhdGlvbnMsIENvbXBhcmluZyBiaXRtYXBzLCBGcmVlIGJpdG1hcHMsIEJpdG1hcCBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gQml0bWFwIE9wZXJhdGlvbnMKKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfbWFya19ibG9ja19iaXRtYXAgKGV4dDJmc19ibG9ja19iaXRtYXAgQHZhcntiaXRtYXB9LCBibGtfdCBAdmFye2Jsb2NrfSkKKworQGRlZnR5cGVmdW54IHZvaWQgZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAgKGV4dDJmc19ibG9ja19iaXRtYXAgQHZhcntiaXRtYXB9LCBibGtfdCBAdmFye2Jsb2NrfSkKKworQGRlZnR5cGVmdW54IGludCBleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAgKGV4dDJmc19ibG9ja19iaXRtYXAgQHZhcntiaXRtYXB9LCBibGtfdCBAdmFye2Jsb2NrfSkKKworVGhlc2UgZnVuY3Rpb25zIHNldCwgY2xlYXIsIGFuZCB0ZXN0IGJpdHMgaW4gYSBibG9jayBiaXRtYXAgQHZhcntiaXRtYXB9LgorQGVuZCBkZWZ0eXBlZnVuCisKKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfbWFya19pbm9kZV9iaXRtYXAgKGV4dDJmc19pbm9kZV9iaXRtYXAgQHZhcntiaXRtYXB9LCBleHQyX2lub190IEB2YXJ7aW5vZGV9KQorCitAZGVmdHlwZWZ1bnggdm9pZCBleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcCAoZXh0MmZzX2lub2RlX2JpdG1hcCBAdmFye2JpdG1hcH0sIGV4dDJfaW5vX3QgQHZhcntpbm9kZX0pCisKK0BkZWZ0eXBlZnVueCBpbnQgZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwIChleHQyZnNfaW5vZGVfYml0bWFwIEB2YXJ7Yml0bWFwfSwgZXh0Ml9pbm9fdCBAdmFye2lub2RlfSkKKworVGhlc2UgZnVuY3Rpb25zIHNldCwgY2xlYXIsIGFuZCB0ZXN0IGJpdHMgaW4gYW4gaW5vZGUgYml0bWFwIEB2YXJ7Yml0bWFwfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGV4dDJmc19mYXN0X21hcmtfYmxvY2tfYml0bWFwIChleHQyZnNfYmxvY2tfYml0bWFwIEB2YXJ7Yml0bWFwfSwgYmxrX3QgQHZhcntibG9ja30pCisKK0BkZWZ0eXBlZnVueCB2b2lkIGV4dDJmc19mYXN0X3VubWFya19ibG9ja19iaXRtYXAgKGV4dDJmc19ibG9ja19iaXRtYXAgQHZhcntiaXRtYXB9LCBibGtfdCBAdmFye2Jsb2NrfSkKKworQGRlZnR5cGVmdW54IGludCBleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcCAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBAdmFye2JpdG1hcH0sIGJsa190IEB2YXJ7YmxvY2t9KQorCitAZGVmdHlwZWZ1bnggdm9pZCBleHQyZnNfZmFzdF9tYXJrX2lub2RlX2JpdG1hcCAoZXh0MmZzX2lub2RlX2JpdG1hcCBAdmFye2JpdG1hcH0sIGV4dDJfaW5vX3QgQHZhcntpbm9kZX0pCisKK0BkZWZ0eXBlZnVueCB2b2lkIGV4dDJmc19mYXN0X3VubWFya19pbm9kZV9iaXRtYXAgKGV4dDJmc19pbm9kZV9iaXRtYXAgQHZhcntiaXRtYXB9LCBleHQyX2lub190IEB2YXJ7aW5vZGV9KQorCitAZGVmdHlwZWZ1bnggaW50IGV4dDJmc19mYXN0X3Rlc3RfaW5vZGVfYml0bWFwIChleHQyZnNfaW5vZGVfYml0bWFwIEB2YXJ7Yml0bWFwfSwgZXh0Ml9pbm9fdCBAdmFye2lub2RlfSkKKworVGhlc2UgYGBmYXN0JycgZnVuY3Rpb25zIGFyZSBsaWtlIHRoZWlyIG5vcm1hbCBjb3VudGVycGFydHM7IGhvd2V2ZXIsCit0aGV5IGFyZSBpbXBsZW1lbnRlZCBhcyBpbmxpbmUgZnVuY3Rpb25zIGFuZCBkbyBub3QgcGVyZm9ybSBib3VuZHMKK2NoZWNrcyBvbiB0aGUgaW5vZGUgbnVtYmVyIG9yIGJsb2NrIG51bWJlcjsgdGhleSBhcmUgYXNzdW1lZCB0byBiZQorY29ycmVjdC4gIFRoZXkgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzcGVlZC1jcml0aWNhbCBhcHBsaWNhdGlvbnMsIHdoZXJlCit0aGUgaW5vZGUgb3IgYmxvY2sgbnVtYmVyIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGJ5IG90aGVyIG1lYW5zLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGJsa190IGV4dDJmc19nZXRfYmxvY2tfYml0bWFwX3N0YXJ0IChleHQyZnNfYmxvY2tfYml0bWFwIEB2YXJ7Yml0bWFwfSkKK0BkZWZ0eXBlZnVueCBleHQyX2lub190IGV4dDJmc19nZXRfaW5vZGVfYml0bWFwX3N0YXJ0IChleHQyZnNfaW5vZGVfYml0bWFwIEB2YXJ7Yml0bWFwfSkKK1JldHVybiB0aGUgZmlyc3QgaW5vZGUgb3IgYmxvY2sgd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBiaXRtYXAuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gYmxrX3QgZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfZW5kIChleHQyZnNfYmxvY2tfYml0bWFwIEB2YXJ7Yml0bWFwfSkKK0BkZWZ0eXBlZnVueCBleHQyX2lub190IGV4dDJmc19nZXRfaW5vZGVfYml0bWFwX2VuZCAoZXh0MmZzX2lub2RlX2JpdG1hcCBAdmFye2JpdG1hcH0pCisKK1JldHVybiB0aGUgbGFzdCBpbm9kZSBvciBibG9jayB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIGJpdG1hcC4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQ29tcGFyaW5nIGJpdG1hcHMsIE1vZGlmeWluZyBCaXRtYXBzLCBCaXRtYXAgT3BlcmF0aW9ucywgQml0bWFwIEZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBDb21wYXJpbmcgYml0bWFwcworCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2NvbXBhcmVfYmxvY2tfYml0bWFwIChleHQyZnNfYmxvY2tfYml0bWFwIEB2YXJ7Ym0xfSwgZXh0MmZzX2Jsb2NrX2JpdG1hcCBAdmFye2JtMn0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19jb21wYXJlX2lub2RlX2JpdG1hcCAoZXh0MmZzX2lub2RlX2JpdG1hcCBAdmFye2JtMX0sIGV4dDJmc19pbm9kZV9iaXRtYXAgQHZhcntibTJ9KQorQGVuZCBkZWZ0eXBlZnVuCisKKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBNb2RpZnlpbmcgQml0bWFwcywgUmVzaXppbmcgQml0bWFwcywgQ29tcGFyaW5nIGJpdG1hcHMsIEJpdG1hcCBGdW5jdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gTW9kaWZ5aW5nIEJpdG1hcHMKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19mdWRnZV9pbm9kZV9iaXRtYXBfZW5kIChleHQyZnNfaW5vZGVfYml0bWFwIEB2YXJ7Yml0bWFwfSwgZXh0Ml9pbm9fdCBAdmFye2VuZH0sIGV4dDJfaW5vX3QgKkB2YXJ7b2VuZH0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19mdWRnZV9ibG9ja19iaXRtYXBfZW5kIChleHQyZnNfYmxvY2tfYml0bWFwIEB2YXJ7Yml0bWFwfSwgYmxrX3QgQHZhcntlbmR9LCBibGtfdCAqQHZhcntvZW5kfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIFJlc2l6aW5nIEJpdG1hcHMsIENsZWFyaW5nIEJpdG1hcHMsIE1vZGlmeWluZyBCaXRtYXBzLCBCaXRtYXAgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIFJlc2l6aW5nIEJpdG1hcHMKKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19yZXNpemVfZ2VuZXJpY19iaXRtYXAgKF9fdTMyIEB2YXJ7bmV3X2VuZH0sIF9fdTMyIEB2YXJ7bmV3X3JlYWxfZW5kfSwgZXh0MmZzX2dlbmVyaWNfYml0bWFwIEB2YXJ7Ym1hcH0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19yZXNpemVfaW5vZGVfYml0bWFwIChfX3UzMiBAdmFye25ld19lbmR9LCBfX3UzMiBAdmFye25ld19yZWFsX2VuZH0sIGV4dDJmc19pbm9kZV9iaXRtYXAgQHZhcntibWFwfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX3Jlc2l6ZV9ibG9ja19iaXRtYXAgKF9fdTMyIEB2YXJ7bmV3X2VuZH0sIF9fdTMyIEB2YXJ7bmV3X3JlYWxfZW5kfSwgZXh0MmZzX2Jsb2NrX2JpdG1hcCBAdmFye2JtYXB9KQorQGVuZCBkZWZ0eXBlZnVuCisKKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBDbGVhcmluZyBCaXRtYXBzLCAgLCBSZXNpemluZyBCaXRtYXBzLCBCaXRtYXAgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzdWJzZWN0aW9uIENsZWFyaW5nIEJpdG1hcHMKKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfY2xlYXJfaW5vZGVfYml0bWFwIChleHQyZnNfaW5vZGVfYml0bWFwIEB2YXJ7Yml0bWFwfSkKKworVGhpcyBmdW5jdGlvbiBzZXRzIGFsbCBvZiB0aGUgYml0cyBpbiB0aGUgaW5vZGUgYml0bWFwIEB2YXJ7Yml0bWFwfSB0byAKK2JlIHplcm8uCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGV4dDJmc19jbGVhcl9ibG9ja19iaXRtYXAgKGV4dDJmc19ibG9ja19iaXRtYXAgQHZhcntiaXRtYXB9KQorCitUaGlzIGZ1bmN0aW9uIHNldHMgYWxsIG9mIHRoZSBiaXRzIGluIHRoZSBibG9jayBiaXRtYXAgQHZhcntiaXRtYXB9IHRvIAorYmUgemVyby4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgRVhUMiBkYXRhIGFic3RyYWN0aW9ucywgQnl0ZS1zd2FwcGluZyBmdW5jdGlvbnMsIEJpdG1hcCBGdW5jdGlvbnMsIEVYVDJGUyBMaWJyYXJ5IEZ1bmN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc2VjdGlvbiBFWFQyIGRhdGEgYWJzdHJhY3Rpb25zCisKK1RoZSBleHQyIGxpYnJhcnkgaGFzIGEgbnVtYmVyIG9mIGFic3RyYWN0aW9ucyB3aGljaCBhcmUgdXNlZnVsIGZvciBleHQyCit1dGlsaXR5IHByb2dyYW1zLiAgCisKK0BtZW51CisqIEJhZGJsb2NrcyBsaXN0IG1hbmFnZW1lbnQ6OiAgIAorKiBEaXJlY3RvcnktYmxvY2sgbGlzdCBtYW5hZ2VtZW50OjogIAorKiBJbm9kZSBjb3VudCBmdW5jdGlvbnM6OiAgICAgICAKK0BlbmQgbWVudQorCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIEJhZGJsb2NrcyBsaXN0IG1hbmFnZW1lbnQsIERpcmVjdG9yeS1ibG9jayBsaXN0IG1hbmFnZW1lbnQsIEVYVDIgZGF0YSBhYnN0cmFjdGlvbnMsIEVYVDIgZGF0YSBhYnN0cmFjdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gQmFkYmxvY2tzIGxpc3QgbWFuYWdlbWVudAorCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfY3JlYXRlIChleHQyX2JhZGJsb2Nrc19saXN0ICpAdmFye3JldH0sIGludCBAdmFye3NpemV9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2ZyZWUgKGV4dDJfYmFkYmxvY2tzX2xpc3QgQHZhcntiYn0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19iYWRibG9ja3NfbGlzdF9hZGQgKGV4dDJfYmFkYmxvY2tzX2xpc3QgQHZhcntiYn0sIGJsa190IEB2YXJ7YmxrfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X3Rlc3QgKGV4dDJfYmFkYmxvY2tzX2xpc3QgQHZhcntiYn0sIGJsa190IEB2YXJ7YmxrfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfYmVnaW4gKGV4dDJfYmFkYmxvY2tzX2xpc3QgQHZhcntiYn0sIGV4dDJfYmFkYmxvY2tzX2l0ZXJhdGUgKkB2YXJ7cmV0fSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBpbnQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGUgKGV4dDJfYmFkYmxvY2tzX2l0ZXJhdGUgaXRlciwgYmxrX3QgKkB2YXJ7YmxrfSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2VuZCAoZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZSBAdmFye2l0ZXJ9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfdXBkYXRlX2JiX2lub2RlIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9iYWRibG9ja3NfbGlzdCBAdmFye2JiX2xpc3R9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9iYl9pbm9kZSAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfYmFkYmxvY2tzX2xpc3QgKkB2YXJ7YmJfbGlzdH0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19yZWFkX2JiX0ZJTEUgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBGSUxFICpmLCBleHQyX2JhZGJsb2Nrc19saXN0ICpAdmFye2JiX2xpc3R9LCB2b2lkICgqaW52YWxpZCkoZXh0Ml9maWxzeXMgQHZhcntmc30sIGJsa190IEB2YXJ7YmxrfSkpCitAZW5kIGRlZnR5cGVmdW4KKworCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Bub2RlIERpcmVjdG9yeS1ibG9jayBsaXN0IG1hbmFnZW1lbnQsIElub2RlIGNvdW50IGZ1bmN0aW9ucywgQmFkYmxvY2tzIGxpc3QgbWFuYWdlbWVudCwgRVhUMiBkYXRhIGFic3RyYWN0aW9ucworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc3Vic2VjdGlvbiBEaXJlY3RvcnktYmxvY2sgbGlzdCBtYW5hZ2VtZW50CisKK1RoZSBkYmxpc3QgYWJzdHJhY3Rpb24gc3RvcmVzIGEgbGlzdCBvZiBibG9ja3MgYmVsb25naW5nIHRvCitkaXJlY3Rvcmllcy4gIFRoaXMgbGlzdCBjYW4gYmUgdXNlZnVsIHdoZW4gYSBwcm9ncmFtIG5lZWRzIHRvIGludGVyYXRlCitvdmVyIGFsbCBkaXJlY3RvcnkgZW50cmllcyBpbiBhIGZpbGVzeXN0ZW07IEBjb2Rle2UyZnNja30gZG9lcyB0aGlzIGluCitwYXNzIDIgb2YgaXRzIG9wZXJhdGlvbnMsIGFuZCBAY29kZXtkZWJ1Z2ZzfSBuZWVkcyB0byBkbyB0aGlzIHdoZW4gaXQgaXMKK3RyeWluZyB0byB0dXJuIGFuIGlub2RlIG51bWJlciBpbnRvIGEgcGF0aG5hbWUuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfaW5pdF9kYmxpc3QgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBleHQyX2RibGlzdCAqQHZhcntyZXRfZGJsaXN0fSkKKworQ3JlYXRlcyBhIGRibGlzdCBkYXRhIHN0cnVjdHVyZSBhbmQgcmV0dXJuIGl0IGluIEB2YXJ7cmV0X2RibGlzdH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfZnJlZV9kYmxpc3QgKGV4dDJfZGJsaXN0IEB2YXJ7ZGJsaXN0fSkKKworRnJlZSBhIGRibGlzdCBkYXRhIHN0cnVjdHVyZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2FkZF9kaXJfYmxvY2sgKGV4dDJfZGJsaXN0IEB2YXJ7ZGJsaXN0fSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIGJsa190IEB2YXJ7YmxrfSwgaW50IEB2YXJ7YmxvY2tjbnR9KQorCitBZGQgYW4gZW50cnkgdG8gdGhlIGRibGlzdCBkYXRhIHN0cnVjdHVyZS4gIFRoaXMgY2FsbCByZWNvcmRzIHRoZSBmYWN0Cit0aGF0IGJsb2NrIG51bWJlciBAdmFye2Jsb2NrY250fSBvZiBkaXJlY3RvcnkgaW5vZGUgQHZhcntpbm99IGlzIHN0b3JlZAoraW4gYmxvY2sgQHZhcntibGt9LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfc2V0X2Rpcl9ibG9jayAoZXh0Ml9kYmxpc3QgQHZhcntkYmxpc3R9LCBleHQyX2lub190IEB2YXJ7aW5vfSwgYmxrX3QgQHZhcntibGt9LCBpbnQgQHZhcntibG9ja2NudH0pCisKK0NoYW5nZSBhbiBlbnRyeSBpbiB0aGUgZGJsaXN0IGRhdGEgc3RydWN0dXJlOyB0aGlzIGNoYW5nZXMgdGhlIGxvY2F0aW9uCitvZiBibG9jayBudW1iZXIgQHZhcntibG9ja2NudH0gb2YgZGlyZWN0b3J5IGluZG9lIEB2YXJ7aW5vfSB0byBiZSBibG9jaworQHZhcntibGt9LiAKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2RibGlzdF9pdGVyYXRlIChleHQyX2RibGlzdCBAdmFye2RibGlzdH0sIGludCAoKmZ1bmMpKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqQHZhcntkYl9pbmZvfSwgdm9pZCAqQHZhcntwcml2YXRlfSksIHZvaWQgKkB2YXJ7cHJpdmF0ZX0pCisKK1RoaXMgaXRlcmF0b3IgY2FsbHMgQHZhcntmdW5jfSBmb3IgZXZlcnkgZW50cnkgaW4gdGhlIGRibGlzdCBkYXRhIHN0cnVjdHVyZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2RibGlzdF9kaXJfaXRlcmF0ZSAoZXh0Ml9kYmxpc3QgQHZhcntkYmxpc3R9LCBpbnQgZmxhZ3MsIGNoYXIgKkB2YXJ7YmxvY2tfYnVmfSwgaW50ICgqZnVuYykoZXh0Ml9pbm9fdCBAdmFye2Rpcn0sIGludCAgQHZhcntlbnRyeX0sIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqQHZhcntkaXJlbnR9LCBpbnQgQHZhcntvZmZzZXR9LCBpbnQgQHZhcntibG9ja3NpemV9LCBjaGFyICpAdmFye2J1Zn0sIHZvaWQgKkB2YXJ7cHJpdmF0ZX0pLCB2b2lkICpAdmFye3ByaXZhdGV9KQorCitUaGlzIGl0ZXJhdG9yIHRha2VzIHJlYWRzIGluIHRoZSBkaXJlY3RvcnkgYmxvY2sgaW5kaWNhdGVkIGluIGVhY2gKK2RibGlzdCBlbnRyeSwgYW5kIGNhbGxzIEB2YXJ7ZnVuY30gZm9yIGVhY2ggZGlyZWN0b3J5IGVudHJ5IGluIGVhY2gKK2RpcmVjdG9yeSBibG9jay4gIElmIEB2YXJ7ZGJsaXN0fSBjb250YWlucyBhbGwgdGhlIGRpcmVjdG9yeSBibG9ja3MgaW4gYQorZmlsZXN5c3RlbSwgdGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIGl0ZXJhdGUgb3ZlciBhbGwKK2RpcmVjdG9yeSBlbnRyaWVzIGZvciB0aGF0IGZpbGVzeXN0ZW0uCitAZW5kIGRlZnR5cGVmdW4KKworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitAbm9kZSBJbm9kZSBjb3VudCBmdW5jdGlvbnMsICAsIERpcmVjdG9yeS1ibG9jayBsaXN0IG1hbmFnZW1lbnQsIEVYVDIgZGF0YSBhYnN0cmFjdGlvbnMKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQHN1YnNlY3Rpb24gSW5vZGUgY291bnQgZnVuY3Rpb25zCisKK1RoZSBpY291bnQgYWJzdHJhY3Rpb24gaXMgYSBzcGVjaWFsaXplZCBkYXRhIHR5cGUgdXNlZCBieSBAY29kZXtlMmZzY2t9Cit0byBzdG9yZSBob3cgbWFueSB0aW1lcyBhIHBhcnRpY3VsYXIgaW5vZGUgaXMgcmVmZXJlbmNlZCBieSB0aGUKK2ZpbGVzeXN0ZW0uICBUaGlzIGlzIHVzZWQgdHdpY2U7IG9uY2UgdG8gc3RvcmUgdGhlIGFjdHVhbCBudW1iZXIgb2YgdGltZXMKK3RoYXQgdGhlIGlub2RlIGlzIHJlZmVyZW5jZTsgYW5kIG9uY2UgdG8gc3RvcmUgdGhlIGNsYWltZWQgbnVtYmVyIG9mIHRpbWVzCit0aGUgaW5vZGUgaXMgcmVmZXJlbmNlZCBhY2NvcmRpbmcgdG8gdGhlIGlub2RlIHN0cnVjdHVyZS4KKworVGhpcyBhYnN0cmFjdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBleHRyZW1lbHkgZWZmaWNpZW50IGZvciBzdG9yaW5nIHRoaXMKK3NvcnQgb2YgaW5mb3JtYXRpb24sIGJ5IHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9mCitpbm9kZSBjb3VudHMsIG5hbWVseSAoMSkgaW5vZGUgY291bnRzIGFyZSB2ZXJ5IG9mdGVuIHplcm8gKGJlY2F1c2UKK3RoZSBpbm9kZSBpcyBjdXJycmVudGx5IG5vdCBpbiB1c2UpLCBhbmQgKDIpIG1hbnkgZmlsZXMgaGF2ZSBhIGlub2RlCitjb3VudCBvZiAxIChiZWNhdXNlIHRoZXkgYXJlIGEgZmlsZSB3aGljaCBoYXMgbm8gYWRkaXRpb25hbCBoYXJkIGxpbmtzKS4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19jcmVhdGVfaWNvdW50MiAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGludCBAdmFye2ZsYWdzfSwgaW50IEB2YXJ7c2l6ZX0sIGV4dDJfaWNvdW50X3QgQHZhcntoaW50fSwgZXh0Ml9pY291bnRfdCAqQHZhcntyZXR9KQorCitDcmVhdGVzIGFuIGljb3VudCBzdHVjdHVyZSBmb3IgYSBmaWxlc3lzdGVtIEB2YXJ7ZnN9LCB3aXRoIGluaXRpYWwgc3BhY2UKK2ZvciBAdmFye3NpemV9IGlub2RlcyB3aG9zZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gMS4gIFRoZSBAdmFye2ZsYWdzfQorcGFyYW1ldGVyIGlzIGVpdGhlciAwIG9yIEBjb2Rle0VYVDJfSUNPVU5UX09QVF9JTkNSRU1FTlR9LCB3aGljaAoraW5kaWNhdGVzIHRoYXQgaWNvdW50IHN0cnVjdHVyZSBzaG91bGQgYmUgYWJsZSB0byBpbmNyZW1lbnQgaW5vZGUgY291bnRzCitxdWlja2x5LiAgVGhlIGljb3VudCBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgaW4gQHZhcntyZXR9LiAgVGhlIHJldHVybmVkCitpY291bnQgc3RydWN0dXJlIGluaXRpYWxseSBoYXMgYSBjb3VudCBvZiB6ZXJvIGZvciBhbGwgaW5vZGVzLgorCitUaGUgQHZhcntoaW50fSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gb3B0aW9uYWxseSBwYXNzIGluIGFub3RoZXIKK2ljb3VudCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBhcnJheSBvZiBpbm9kZXMgd2hvc2UKK2NvdW50IGlzIGdyZWF0ZXIgdGhhbiAxLiAgSXQgaXMgdXNlZCBwdXJlbHkgYXMgYSBzcGVlZCBvcHRpbWl6YXRpb24gc28KK3RoYXQgdGhlIGljb3VudCBzdHJ1Y3R1cmUgY2FuIGRldGVybWluZSBpbiBhZHZhbmNlIHdoaWNoIGlub2RlcyBhcmUKK2xpa2VseSB0byBjb250YWluIGEgY291bnQgZ3JhdGVyIHRoYW4gMS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkIGV4dDJmc19mcmVlX2ljb3VudCAoZXh0Ml9pY291bnRfdCBAdmFye2ljb3VudH0pCisKK0ZyZWVzIGFuIGljb3VudCBzdHJ1Y3R1cmUuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19pY291bnRfZmV0Y2ggKGV4dDJfaWNvdW50X3QgQHZhcntpY291bnR9LCBleHQyX2lub190IEB2YXJ7aW5vfSwgX191MTYgKkB2YXJ7cmV0fSkKKworUmV0dXJucyBpbiBAdmFye3JldH0gZmV0Y2hlcyB0aGUgY291bnQgZm9yIGEgcGFydGljdWxhciBpbm9kZSBAdmFye2lub30uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19pY291bnRfaW5jcmVtZW50IChleHQyX2ljb3VudF90IEB2YXJ7aWNvdW50fSwgZXh0Ml9pbm9fdCBAdmFye2lub30sIF9fdTE2ICpAdmFye3JldH0pCisKK0luY3JlbWVudHMgdGhlIHJlZiBjb3VudCBmb3IgaW5vZGUgQHZhcntpbm99LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfaWNvdW50X2RlY3JlbWVudCAoZXh0Ml9pY291bnRfdCBAdmFye2ljb3VudH0sIGV4dDJfaW5vX3QgQHZhcntpbm99LCBfX3UxNiAqQHZhcntyZXR9KQorCitEZWNyZW1lbnRzIHRoZSByZWYgY291bnQgZm9yIGlub2RlIEB2YXJ7aW5vfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9zdG9yZSAoZXh0Ml9pY291bnRfdCBAdmFye2ljb3VudH0sIGV4dDJfaW5vX3QgQHZhcntpbm99LCBfX3UxNiBAdmFye2NvdW50fSkKKworU2V0cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBpbm9kZSBAdmFye2lub30gdG8gYmUgQHZhcntjb3VudH0uCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXh0Ml9pbm9fdCBleHQyZnNfZ2V0X2ljb3VudF9zaXplIChleHQyX2ljb3VudF90IEB2YXJ7aWNvdW50fSkKKworUmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgaW5vZGVzIGluIEB2YXJ7aWNvdW50fSB3aGljaCBoYXMgYSBjb3VudAorZ3JlYXRlciB0aGFuIDEuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gZXJyY29kZV90IGV4dDJmc19pY291bnRfdmFsaWRhdGUgKGV4dDJfaWNvdW50X3QgQHZhcntpY291bnR9LCBGSUxFICpAdmFye2Z9KQorCitWYWxpZGF0ZXMgdGhlIGludGVybmFsIHJlcCBpbnZhcmlhbnQgb2YgQHZhcntpY291bnR9OyBpZiB0aGVyZSBhcmUgYW55Citwcm9ibGVtcywgcHJpbnQgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBAdmFye2Z9LiAgVGhpcyBmdW5jdGlvbiBpcworaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZyB1c2Ugb25seS4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQnl0ZS1zd2FwcGluZyBmdW5jdGlvbnMsIE90aGVyIGZ1bmN0aW9ucywgRVhUMiBkYXRhIGFic3RyYWN0aW9ucywgRVhUMkZTIExpYnJhcnkgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzZWN0aW9uIEJ5dGUtc3dhcHBpbmcgZnVuY3Rpb25zCisKK0BkZWZ0eXBlZnVuIHZvaWQgZXh0MmZzX3N3YXBfc3VwZXIgKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogQHZhcntzdXBlcn0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfc3dhcF9ncm91cF9kZXNjIChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpAdmFye2dkcH0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gdm9pZCBleHQyZnNfc3dhcF9pbm9kZSAoZXh0Ml9maWxzeXMgQHZhcntmc30sIHN0cnVjdCBleHQyX2lub2RlICpAdmFye3RvfSwgc3RydWN0IGV4dDJfaW5vZGUgKkB2YXJ7ZnJvbX0sIGludCBAdmFye2hvc3RvcmRlcn0pCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gaW50IGV4dDJmc19uYXRpdmVfZmxhZyAodm9pZCkKK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgT3RoZXIgZnVuY3Rpb25zLCAgLCBCeXRlLXN3YXBwaW5nIGZ1bmN0aW9ucywgRVhUMkZTIExpYnJhcnkgRnVuY3Rpb25zCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzZWN0aW9uIE90aGVyIGZ1bmN0aW9ucworCisvKiBhbGxvYy5jICovCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX25ld19pbm9kZSAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGV4dDJfaW5vX3QgQHZhcntkaXJ9LCBpbnQgQHZhcnttb2RlfSwgZXh0MmZzX2lub2RlX2JpdG1hcCBAdmFye21hcH0sIGV4dDJfaW5vX3QgKkB2YXJ7cmV0fSkKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX25ld19ibG9jayAoZXh0Ml9maWxzeXMgQHZhcntmc30sIGJsa190IEB2YXJ7Z29hbH0sIGV4dDJmc19ibG9ja19iaXRtYXAgQHZhcnttYXB9LCBibGtfdCAqQHZhcntyZXR9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfZ2V0X2ZyZWVfYmxvY2tzIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgYmxrX3QgQHZhcntzdGFydH0sIGJsa190IEB2YXJ7ZmluaXNofSwgaW50IEB2YXJ7bnVtfSwgZXh0MmZzX2Jsb2NrX2JpdG1hcCBAdmFye21hcH0sIGJsa190ICpAdmFye3JldH0pCitAZW5kIGRlZnR5cGVmdW4KKworLyogY2hlY2tfZGVzYy5jICovCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2Rlc2MgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9KQorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGVycmNvZGVfdCBleHQyZnNfZ2V0X251bV9kaXJzIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCAqQHZhcntyZXRfbnVtX2RpcnN9KQorQGVuZCBkZWZ0eXBlZnVuCisKKworLyogZ2V0c2l6ZS5jICovCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2dldF9kZXZpY2Vfc2l6ZSAoY29uc3QgY2hhciAqQHZhcntmaWxlfSwgaW50IEB2YXJ7YmxvY2tzaXplfSwgYmxrX3QgKkB2YXJ7cmV0YmxvY2tzfSkKK0BlbmQgZGVmdHlwZWZ1bgorCisKKy8qIGlzbW91bnRlZC5jICovCitAZGVmdHlwZWZ1biBlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQgKGNvbnN0IGNoYXIgKkB2YXJ7ZmlsZX0sIGludCAqQHZhcnttb3VudF9mbGFnc30pCitAZW5kIGRlZnR5cGVmdW4KKworLyogdmVyc2lvbi5jICovCisKK0BkZWZ0eXBlZnVuIGludCBleHQyZnNfZ2V0X2xpYnJhcnlfdmVyc2lvbiAoY29uc3QgY2hhciAqKkB2YXJ7dmVyX3N0cmluZ30sIGNvbnN0IGNoYXIgKipAdmFye2RhdGVfc3RyaW5nfSkKKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dDIgbGlicmFyeS4gIFRoZQorcmV0dXJuIHZhbHVlIGNvbnRhaW5zIGFuIGludGVnZXIgdmVyc2lvbiBjb2RlLCB3aGljaCBjb25zaXN0cyBvZiB0aGUKK21ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJyYXJ5IG11bHRpcGxpZWQgYnkgMTAwLCBwbHVzIHRoZSBtaW5vcgordmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuICBIZW5jZSwgaWYgdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyAxLjA4LAordGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgMTA4LgorCitJZiBAdmFye3Zlcl9zdHJpbmd9IGFuZC9vciBAdmFye2RhdGVfc3RyaW5nfSBhcmUgbm9uLU5VTEwsIHRoZXkgd2lsbCBiZQorc2V0IHRvIHBvaW50IGF0IGEgY29uc3RhbnQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxpYnJhcnkgdmVyc2lvbiBhbmQvb3IKK3JlbGVhc2UgZGF0ZSwgcmVzcGVjdGl2ZWx5LgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBleHQyZnNfcGFyc2VfdmVyc2lvbl9zdHJpbmcgKGNvbnN0IGNoYXIgKkB2YXJ7dmVyX3N0cmluZ30pCisKK1RoaXMgZnVuY3Rpb24gdGFrZXMgYSB2ZXJzaW9uIHN0cmluZyB3aGljaCBtYXkgaW5jbHVkZWQgaW4gYW4KK2FwcGxpY2F0aW9uIGFuZCByZXR1cm5zIGEgdmVyc2lvbiBjb2RlIHVzaW5nIHRoZSBzYW1lIGFsZ29yaXRobSB1c2VkIGJ5CitAY29kZXtleHQyZnNfZ2V0X2xpYnJhcnlfdmVyc2lvbn0uICBJdCBjYW4gYmUgdXNlZCBieSBwcm9ncmFtcyBpbmNsdWRlZAoraW4gdGhlIEBjb2Rle2UyZnNwcm9nc30gZGlzdHJpYnV0aW9uIHRvIGFzc3VyZSB0aGF0IHRoZXkgYXJlIHVzaW5nIGFuCit1cC10by1kYXRlIGV4dDIgc2hhcmVkIGxpYnJhcnkuCitAZW5kIGRlZnR5cGVmdW4KKworLyogaW5saW5lIGZ1bmN0aW9ucyAqLworQGRlZnR5cGVmdW4gaW50IGV4dDJmc19ncm91cF9vZl9ibGsgKGV4dDJfZmlsc3lzIEB2YXJ7ZnN9LCBibGtfdCBAdmFye2Jsa30pCisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYmxvY2sgZ3JvdXAgd2hpY2ggY29udGFpbnMgdGhlIGJsb2NrIEB2YXJ7YmxrfS4KKworQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIGludCBleHQyZnNfZ3JvdXBfb2ZfaW5vIChleHQyX2ZpbHN5cyBAdmFye2ZzfSwgZXh0Ml9pbm9fdCBAdmFye2lub30pCisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYmxvY2sgZ3JvdXAgd2hpY2ggY29udGFpbnMgdGhlIGlub2RlIEB2YXJ7aW5vfS4KK0BlbmQgZGVmdHlwZWZ1bgorCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgQ29uY2VwdCBJbmRleCwgRnVuY3Rpb24gSW5kZXgsIEVYVDJGUyBMaWJyYXJ5IEZ1bmN0aW9ucywgVG9wCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0B1bm51bWJlcmVkIENvbmNlcHQgSW5kZXgKK0BwcmludGluZGV4IGNwCisKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQG5vZGUgRnVuY3Rpb24gSW5kZXgsICAsIENvbmNlcHQgSW5kZXgsIFRvcAorQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAdW5udW1iZXJlZCBGdW5jdGlvbiBhbmQgVHlwZSBJbmRleAorQHByaW50aW5kZXggZm4KKworCitAY29udGVudHMKK0BieWUKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZG9jL3RleGluZm8udGV4IGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9kb2MvdGV4aW5mby50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkZDAxNAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZG9jL3RleGluZm8udGV4CkBAIC0wLDAgKzEsNzIyNiBAQAorJSB0ZXhpbmZvLnRleCAtLSBUZVggbWFjcm9zIHRvIGhhbmRsZSBUZXhpbmZvIGZpbGVzLgorJQorJSBMb2FkIHBsYWluIGlmIG5lY2Vzc2FyeSwgaS5lLiwgaWYgcnVubmluZyB1bmRlciBpbml0ZXguCitcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBmbXRuYW1lXGVuZGNzbmFtZVxyZWxheFxpbnB1dCBwbGFpblxmaQorJQorXGRlZlx0ZXhpbmZvdmVyc2lvbnsyMDA2LTAyLTEzLjE2fQorJQorJSBDb3B5cmlnaHQgKEMpIDE5ODUsIDE5ODYsIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsCislIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZQorJSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCislCislIFRoaXMgdGV4aW5mby50ZXggZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyUgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyUgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorJSB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCislCislIFRoaXMgdGV4aW5mby50ZXggZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorJSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorJSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCislCislIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCislIGFsb25nIHdpdGggdGhpcyB0ZXhpbmZvLnRleCBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKKyUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyUgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCislCislIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIHJlYWQgYnkgVGVYIHdoZW4gcHJvY2Vzc2luZworJSBhIFRleGluZm8gc291cmNlIGRvY3VtZW50LCB5b3UgbWF5IHVzZSB0aGUgcmVzdWx0IHdpdGhvdXQKKyUgcmVzdHJpY3Rpb24uICAoVGhpcyBoYXMgYmVlbiBvdXIgaW50ZW50IHNpbmNlIFRleGluZm8gd2FzIGludmVudGVkLikKKyUKKyUgUGxlYXNlIHRyeSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGV4aW5mby50ZXggYmVmb3JlIHN1Ym1pdHRpbmcgYnVnCislIHJlcG9ydHM7IHlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tOgorJSAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXhpbmZvLyAodGhlIFRleGluZm8gaG9tZSBwYWdlKSwgb3IKKyUgICBmdHA6Ly90dWcub3JnL3RleC90ZXhpbmZvLnRleAorJSAgICAgKGFuZCBhbGwgQ1RBTiBtaXJyb3JzLCBzZWUgaHR0cDovL3d3dy5jdGFuLm9yZykuCislIFRoZSB0ZXhpbmZvLnRleCBpbiBhbnkgZ2l2ZW4gZGlzdHJpYnV0aW9uIGNvdWxkIHdlbGwgYmUgb3V0CislIG9mIGRhdGUsIHNvIGlmIHRoYXQncyB3aGF0IHlvdSdyZSB1c2luZywgcGxlYXNlIGNoZWNrLgorJQorJSBTZW5kIGJ1ZyByZXBvcnRzIHRvIGJ1Zy10ZXhpbmZvQGdudS5vcmcuICBQbGVhc2UgaW5jbHVkZSBpbmNsdWRpbmcgYQorJSBjb21wbGV0ZSBkb2N1bWVudCBpbiBlYWNoIGJ1ZyByZXBvcnQgd2l0aCB3aGljaCB3ZSBjYW4gcmVwcm9kdWNlIHRoZQorJSBwcm9ibGVtLiAgUGF0Y2hlcyBhcmUsIG9mIGNvdXJzZSwgZ3JlYXRseSBhcHByZWNpYXRlZC4KKyUKKyUgVG8gcHJvY2VzcyBhIFRleGluZm8gbWFudWFsIHdpdGggVGVYLCBpdCdzIG1vc3QgcmVsaWFibGUgdG8gdXNlIHRoZQorJSB0ZXhpMmR2aSBzaGVsbCBzY3JpcHQgdGhhdCBjb21lcyB3aXRoIHRoZSBkaXN0cmlidXRpb24uICBGb3IgYSBzaW1wbGUKKyUgbWFudWFsIGZvby50ZXhpLCBob3dldmVyLCB5b3UgY2FuIGdldCBhd2F5IHdpdGggdGhpczoKKyUgICB0ZXggZm9vLnRleGkKKyUgICB0ZXhpbmRleCBmb28uPz8KKyUgICB0ZXggZm9vLnRleGkKKyUgICB0ZXggZm9vLnRleGkKKyUgICBkdmlwcyBmb28uZHZpIC1vICAjIG9yIHdoYXRldmVyOyB0aGlzIG1ha2VzIGZvby5wcy4KKyUgVGhlIGV4dHJhIFRlWCBydW5zIGdldCB0aGUgY3Jvc3MtcmVmZXJlbmNlIGluZm9ybWF0aW9uIGNvcnJlY3QuCislIFNvbWV0aW1lcyBvbmUgcnVuIGFmdGVyIHRleGluZGV4IHN1ZmZpY2VzLCBhbmQgc29tZXRpbWVzIHlvdSBuZWVkIG1vcmUKKyUgdGhhbiB0d287IHRleGkyZHZpIGRvZXMgaXQgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkuCislCislIEl0IGlzIHBvc3NpYmxlIHRvIGFkYXB0IHRleGluZm8udGV4IGZvciBvdGhlciBsYW5ndWFnZXMsIHRvIHNvbWUKKyUgZXh0ZW50LiAgWW91IGNhbiBnZXQgdGhlIGV4aXN0aW5nIGxhbmd1YWdlLXNwZWNpZmljIGZpbGVzIGZyb20gdGhlCislIGZ1bGwgVGV4aW5mbyBkaXN0cmlidXRpb24uCislCislIFRoZSBHTlUgVGV4aW5mbyBob21lIHBhZ2UgaXMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleGluZm8uCisKKworXG1lc3NhZ2V7TG9hZGluZyB0ZXhpbmZvIFt2ZXJzaW9uIFx0ZXhpbmZvdmVyc2lvbl06fQorCislIElmIGluIGEgLmZtdCBmaWxlLCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIKKyUgYW5kIHR1cm4gb24gYWN0aXZlIGNoYXJhY3RlcnMgdGhhdCB3ZSBjb3VsZG4ndCBkbyBlYXJsaWVyIGJlY2F1c2UKKyUgdGhleSBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnB1dCBmaWxlIG5hbWUuCitcZXZlcnlqb2J7XG1lc3NhZ2V7W1RleGluZm8gdmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dfSUKKyAgXGNhdGNvZGVgKz1cYWN0aXZlIFxjYXRjb2RlYFxfPVxhY3RpdmV9CisKK1xtZXNzYWdle0Jhc2ljcyx9CitcY2hhcmRlZlxvdGhlcj0xMgorCislIFdlIG5ldmVyIHdhbnQgcGxhaW4ncyBcb3V0ZXIgZGVmaW5pdGlvbiBvZiBcKyBpbiBUZXhpbmZvLgorJSBGb3IgQHRleCwgd2UgY2FuIHVzZSBcdGFiYWxpZ24uCitcbGV0XCsgPSBccmVsYXgKKworJSBTYXZlIHNvbWUgcGxhaW4gdGV4IG1hY3JvcyB3aG9zZSBuYW1lcyB3ZSB3aWxsIHJlZGVmaW5lLgorXGxldFxwdGV4Yj1cYgorXGxldFxwdGV4YnVsbGV0PVxidWxsZXQKK1xsZXRccHRleGM9XGMKK1xsZXRccHRleGNvbW1hPVwsCitcbGV0XHB0ZXhkb3Q9XC4KK1xsZXRccHRleGRvdHM9XGRvdHMKK1xsZXRccHRleGVuZD1cZW5kCitcbGV0XHB0ZXhlcXVpdj1cZXF1aXYKK1xsZXRccHRleGV4Y2xhbT1cIQorXGxldFxwdGV4Zm9vdG5vdGU9XGZvb3Rub3RlCitcbGV0XHB0ZXhndHI9PgorXGxldFxwdGV4aGF0PV4KK1xsZXRccHRleGk9XGkKK1xsZXRccHRleGluZGVudD1caW5kZW50CitcbGV0XHB0ZXhpbnNlcnQ9XGluc2VydAorXGxldFxwdGV4bGJyYWNlPVx7CitcbGV0XHB0ZXhsZXNzPTwKK1xsZXRccHRleG5ld3dyaXRlXG5ld3dyaXRlCitcbGV0XHB0ZXhub2luZGVudD1cbm9pbmRlbnQKK1xsZXRccHRleHBsdXM9KworXGxldFxwdGV4cmJyYWNlPVx9CitcbGV0XHB0ZXhzbGFzaD1cLworXGxldFxwdGV4c3Rhcj1cKgorXGxldFxwdGV4dD1cdAorCislIElmIHRoaXMgY2hhcmFjdGVyIGFwcGVhcnMgaW4gYW4gZXJyb3IgbWVzc2FnZSBvciBoZWxwIHN0cmluZywgaXQKKyUgc3RhcnRzIGEgbmV3IGxpbmUgaW4gdGhlIG91dHB1dC4KK1xuZXdsaW5lY2hhciA9IGBeXkoKKworJSBVc2UgVGVYIDMuMCdzIFxpbnB1dGxpbmVubyB0byBnZXQgdGhlIGxpbmUgbnVtYmVyLCBmb3IgYmV0dGVyIGVycm9yCislIG1lc3NhZ2VzLCBidXQgaWYgd2UncmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgVGVYLCBkb24ndCBkbyBhbnl0aGluZy4KKyUKK1xpZnhcaW5wdXRsaW5lbm9cdGhpc2lzdW5kZWZpbmVkCisgIFxsZXRcbGluZW51bWJlciA9IFxlbXB0eSAlIFByZS0zLjAuCitcZWxzZQorICBcZGVmXGxpbmVudW1iZXJ7bC5cdGhlXGlucHV0bGluZW5vOlxzcGFjZX0KK1xmaQorCislIFNldCB1cCBmaXhlZCB3b3JkcyBmb3IgRW5nbGlzaCBpZiBub3QgYWxyZWFkeSBzZXQuCitcaWZ4XHB1dHdvcmRBcHBlbmRpeFx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRBcHBlbmRpeHtBcHBlbmRpeH1cZmkKK1xpZnhccHV0d29yZENoYXB0ZXJcdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZENoYXB0ZXJ7Q2hhcHRlcn1cZmkKK1xpZnhccHV0d29yZGZpbGVcdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZGZpbGV7ZmlsZX1cZmkKK1xpZnhccHV0d29yZGluXHVuZGVmaW5lZCAgICAgICAgXGdkZWZccHV0d29yZGlue2lufVxmaQorXGlmeFxwdXR3b3JkSW5kZXhJc0VtcHR5XHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZEluZGV4SXNFbXB0eXsoSW5kZXggaXMgZW1wdHkpfVxmaQorXGlmeFxwdXR3b3JkSW5kZXhOb25leGlzdGVudFx1bmRlZmluZWQgXGdkZWZccHV0d29yZEluZGV4Tm9uZXhpc3RlbnR7KEluZGV4IGlzIG5vbmV4aXN0ZW50KX1cZmkKK1xpZnhccHV0d29yZEluZm9cdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZEluZm97SW5mb31cZmkKK1xpZnhccHV0d29yZEluc3RhbmNlVmFyaWFibGVvZlx1bmRlZmluZWQgXGdkZWZccHV0d29yZEluc3RhbmNlVmFyaWFibGVvZntJbnN0YW5jZSBWYXJpYWJsZSBvZn1cZmkKK1xpZnhccHV0d29yZE1ldGhvZG9uXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZE1ldGhvZG9ue01ldGhvZCBvbn1cZmkKK1xpZnhccHV0d29yZE5vVGl0bGVcdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZE5vVGl0bGV7Tm8gVGl0bGV9XGZpCitcaWZ4XHB1dHdvcmRvZlx1bmRlZmluZWQgICAgICAgIFxnZGVmXHB1dHdvcmRvZntvZn1cZmkKK1xpZnhccHV0d29yZG9uXHVuZGVmaW5lZCAgICAgICAgXGdkZWZccHV0d29yZG9ue29ufVxmaQorXGlmeFxwdXR3b3JkcGFnZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3JkcGFnZXtwYWdlfVxmaQorXGlmeFxwdXR3b3Jkc2VjdGlvblx1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3Jkc2VjdGlvbntzZWN0aW9ufVxmaQorXGlmeFxwdXR3b3JkU2VjdGlvblx1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkU2VjdGlvbntTZWN0aW9ufVxmaQorXGlmeFxwdXR3b3Jkc2VlXHVuZGVmaW5lZCAgICAgICBcZ2RlZlxwdXR3b3Jkc2Vle3NlZX1cZmkKK1xpZnhccHV0d29yZFNlZVx1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZFNlZXtTZWV9XGZpCitcaWZ4XHB1dHdvcmRTaG9ydFRPQ1x1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRTaG9ydFRPQ3tTaG9ydCBDb250ZW50c31cZmkKK1xpZnhccHV0d29yZFRPQ1x1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZFRPQ3tUYWJsZSBvZiBDb250ZW50c31cZmkKKyUKK1xpZnhccHV0d29yZE1KYW5cdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNSmFue0phbnVhcnl9XGZpCitcaWZ4XHB1dHdvcmRNRmViXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUZlYntGZWJydWFyeX1cZmkKK1xpZnhccHV0d29yZE1NYXJcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNTWFye01hcmNofVxmaQorXGlmeFxwdXR3b3JkTUFwclx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1BcHJ7QXByaWx9XGZpCitcaWZ4XHB1dHdvcmRNTWF5XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU1heXtNYXl9XGZpCitcaWZ4XHB1dHdvcmRNSnVuXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUp1bntKdW5lfVxmaQorXGlmeFxwdXR3b3JkTUp1bFx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1KdWx7SnVseX1cZmkKK1xpZnhccHV0d29yZE1BdWdcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNQXVne0F1Z3VzdH1cZmkKK1xpZnhccHV0d29yZE1TZXBcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNU2Vwe1NlcHRlbWJlcn1cZmkKK1xpZnhccHV0d29yZE1PY3RcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNT2N0e09jdG9iZXJ9XGZpCitcaWZ4XHB1dHdvcmRNTm92XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU5vdntOb3ZlbWJlcn1cZmkKK1xpZnhccHV0d29yZE1EZWNcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNRGVje0RlY2VtYmVyfVxmaQorJQorXGlmeFxwdXR3b3JkRGVmbWFjXHVuZGVmaW5lZCAgICBcZ2RlZlxwdXR3b3JkRGVmbWFje01hY3JvfVxmaQorXGlmeFxwdXR3b3JkRGVmc3BlY1x1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkRGVmc3BlY3tTcGVjaWFsIEZvcm19XGZpCitcaWZ4XHB1dHdvcmREZWZ2YXJcdW5kZWZpbmVkICAgIFxnZGVmXHB1dHdvcmREZWZ2YXJ7VmFyaWFibGV9XGZpCitcaWZ4XHB1dHdvcmREZWZvcHRcdW5kZWZpbmVkICAgIFxnZGVmXHB1dHdvcmREZWZvcHR7VXNlciBPcHRpb259XGZpCitcaWZ4XHB1dHdvcmREZWZmdW5jXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmREZWZmdW5je0Z1bmN0aW9ufVxmaQorCislIFNpbmNlIHRoZSBjYXRlZ29yeSBvZiBzcGFjZSBpcyBub3Qga25vd24sIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bC4KK1xjaGFyZGVmXHNwYWNlY2F0ID0gMTAKK1xkZWZcc3BhY2Vpc3NwYWNle1xjYXRjb2RlYFwgPVxzcGFjZWNhdH0KKworJSBJZ25vcmUgYSB0b2tlbi4KKyUKK1xkZWZcZ29iYmxlIzF7fQorCislIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCBpbnNpZGUgc2V2ZXJhbCBcZWRlZidzLgorXGRlZlxtYWtlY3NuYW1lIzF7XGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZSMxXGVuZGNzbmFtZX0KKworJSBIeXBoZW5hdGlvbiBmaXhlcy4KK1xoeXBoZW5hdGlvbnsKKyAgRmxvci1pLWRhIEdob3N0LXNjcmlwdCBHaG9zdC12aWV3IE1hYy1PUyBQb3N0LVNjcmlwdAorICBhcC1wZW4tZGl4IGJpdC1tYXAgYml0LW1hcHMKKyAgZGF0YS1iYXNlIGRhdGEtYmFzZXMgZXNoZWxsIGZhbGwtaW5nIGhhbGYtd2F5IGxvbmctZXN0IG1hbi11LXNjcmlwdAorICBtYW4tdS1zY3JpcHRzIG1pbmktYnVmLWZlciBtaW5pLWJ1Zi1mZXJzIG92ZXItdmlldyBwYXItYS1kaWdtCisgIHBhci1hLWRpZ21zIHJhdGgtZXIgcmVjLXRhbi1ndS1sYXIgcm8tYm90LWljcyBzZS12ZXJlLWx5IHNldC11cCBzcGEtY2VzCisgIHNwZWxsLWluZyBzcGVsbC1pbmdzCisgIHN0YW5kLWFsb25lIHN0cm9uZy1lc3QgdGltZS1zdGFtcCB0aW1lLXN0YW1wcyB3aGljaC1ldmVyIHdoaXRlLXNwYWNlCisgIHdpZGUtc3ByZWFkIHdyYXAtYXJvdW5kCit9CisKKyUgTWFyZ2luIHRvIGFkZCB0byByaWdodCBvZiBldmVuIHBhZ2VzLCB0byBsZWZ0IG9mIG9kZCBwYWdlcy4KK1xuZXdkaW1lblxiaW5kaW5nb2Zmc2V0CitcbmV3ZGltZW5cbm9ybWFsb2Zmc2V0CitcbmV3ZGltZW5ccGFnZXdpZHRoIFxuZXdkaW1lblxwYWdlaGVpZ2h0CisKKyUgRm9yIGEgZmluYWwgY29weSwgdGFrZSBvdXQgdGhlIHJlY3RhbmdsZXMKKyUgdGhhdCBtYXJrIG92ZXJmdWxsIGJveGVzIChpbiBjYXNlIHlvdSBoYXZlIGRlY2lkZWQKKyUgdGhhdCB0aGUgdGV4dCBsb29rcyBvayBldmVuIHRob3VnaCBpdCBwYXNzZXMgdGhlIG1hcmdpbikuCislCitcZGVmXGZpbmFsb3V0e1xvdmVyZnVsbHJ1bGU9MHB0fQorCislIEB8IGluc2VydHMgYSBjaGFuZ2ViYXIgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgbGluZS4gIEl0IHNob3VsZAorJSBzdXJyb3VuZCBhbnkgY2hhbmdlZCB0ZXh0LiAgVGhpcyBhcHByb2FjaCBkb2VzICpub3QqIHdvcmsgaWYgdGhlCislIGNoYW5nZSBzcGFucyBtb3JlIHRoYW4gdHdvIGxpbmVzIG9mIG91dHB1dC4gIFRvIGhhbmRsZSB0aGF0LCB3ZSB3b3VsZAorJSBoYXZlIGFkb3B0IGEgbXVjaCBtb3JlIGRpZmZpY3VsdCBhcHByb2FjaCAocHV0dGluZyBtYXJrcyBpbnRvIHRoZSBtYWluCislIHZlcnRpY2FsIGxpc3QgZm9yIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBlYWNoIGNoYW5nZSkuCislCitcZGVmXHx7JQorICAlIFx2YWRqdXN0IGNhbiBvbmx5IGJlIHVzZWQgaW4gaG9yaXpvbnRhbCBtb2RlLgorICBcbGVhdmV2bW9kZQorICAlCisgICUgQXBwZW5kIHRoaXMgdmVydGljYWwgbW9kZSBtYXRlcmlhbCBhZnRlciB0aGUgY3VycmVudCBsaW5lIGluIHRoZSBvdXRwdXQuCisgIFx2YWRqdXN0eyUKKyAgICAlIFdlIHdhbnQgdG8gaW5zZXJ0IGEgcnVsZSB3aXRoIHRoZSBoZWlnaHQgYW5kIGRlcHRoIG9mIHRoZSBjdXJyZW50CisgICAgJSBsZWFkaW5nOyB0aGF0IGlzIGV4YWN0bHkgd2hhdCBcc3RydXRib3ggaXMgc3VwcG9zZWQgdG8gcmVjb3JkLgorICAgIFx2c2tpcC1cYmFzZWxpbmVza2lwCisgICAgJQorICAgICUgXHZhZGp1c3QtaXRlbXMgYXJlIGluc2VydGVkIGF0IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHR5cGUuICBTbworICAgICUgdGhlIFxsbGFwIGhlcmUgbW92ZXMgb3V0IGludG8gdGhlIGxlZnQtaGFuZCBtYXJnaW4uCisgICAgXGxsYXB7JQorICAgICAgJQorICAgICAgJSBGb3IgYSB0aGlja2VyIG9yIHRoaW5uZXIgYmFyLCBjaGFuZ2UgdGhlIGAxcHQnLgorICAgICAgXHZydWxlIGhlaWdodFxiYXNlbGluZXNraXAgd2lkdGgxcHQKKyAgICAgICUKKyAgICAgICUgVGhpcyBpcyB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgYmFyIGFuZCB0aGUgdGV4dC4KKyAgICAgIFxoc2tpcCAxMnB0CisgICAgfSUKKyAgfSUKK30KKworJSBTb21ldGltZXMgaXQgaXMgY29udmVuaWVudCB0byBoYXZlIGV2ZXJ5dGhpbmcgaW4gdGhlIHRyYW5zY3JpcHQgZmlsZQorJSBhbmQgbm90aGluZyBvbiB0aGUgdGVybWluYWwuICBXZSBkb24ndCBqdXN0IGNhbGwgXHRyYWNpbmdhbGwgaGVyZSwKKyUgc2luY2UgdGhhdCBwcm9kdWNlcyBzb21lIHVzZWxlc3Mgb3V0cHV0IG9uIHRoZSB0ZXJtaW5hbC4gIFdlIGFsc28gbWFrZQorJSBzb21lIGVmZm9ydCB0byBvcmRlciB0aGUgdHJhY2luZyBjb21tYW5kcyB0byByZWR1Y2Ugb3V0cHV0IGluIHRoZSBsb2cKKyUgZmlsZTsgY2YuIHRyYWNlLnN0eSBpbiBMYVRlWC4KKyUKK1xkZWZcZ2xvZ2dpbmdhbGx7XGJlZ2luZ3JvdXAgXGdsb2JhbGRlZnMgPSAxIFxsb2dnaW5nYWxsIFxlbmRncm91cH0lCitcZGVmXGxvZ2dpbmdhbGx7JQorICBcdHJhY2luZ3N0YXRzMgorICBcdHJhY2luZ3BhZ2VzMQorICBcdHJhY2luZ2xvc3RjaGFyczIgICUgMiBnaXZlcyB1cyBtb3JlIGluIGV0ZXgKKyAgXHRyYWNpbmdwYXJhZ3JhcGhzMQorICBcdHJhY2luZ291dHB1dDEKKyAgXHRyYWNpbmdtYWNyb3MyCisgIFx0cmFjaW5ncmVzdG9yZXMxCisgIFxzaG93Ym94YnJlYWR0aFxtYXhkaW1lbiBcc2hvd2JveGRlcHRoXG1heGRpbWVuCisgIFxpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkXGVsc2UgJSBldGV4IGdpdmVzIHVzIG1vcmUgbG9nZ2luZworICAgIFx0cmFjaW5nc2NhbnRva2VuczEKKyAgICBcdHJhY2luZ2lmczEKKyAgICBcdHJhY2luZ2dyb3VwczEKKyAgICBcdHJhY2luZ25lc3RpbmcyCisgICAgXHRyYWNpbmdhc3NpZ25zMQorICBcZmkKKyAgXHRyYWNpbmdjb21tYW5kczMgICUgMyBnaXZlcyB1cyBtb3JlIGluIGV0ZXgKKyAgXGVycm9yY29udGV4dGxpbmVzMTYKK30lCisKKyUgYWRkIGNoZWNrIGZvciBcbGFzdHBlbmFsdHkgdG8gcGxhaW4ncyBkZWZpbml0aW9ucy4gIElmIHRoZSBsYXN0IHRoaW5nCislIHdlIGRpZCB3YXMgYSBcbm9icmVhaywgd2UgZG9uJ3Qgd2FudCB0byBpbnNlcnQgbW9yZSBzcGFjZS4KKyUKK1xkZWZcc21hbGxicmVha3tcaWZudW1cbGFzdHBlbmFsdHk8MTAwMDBccGFyXGlmZGltXGxhc3Rza2lwPFxzbWFsbHNraXBhbW91bnQKKyAgXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHktNTBcc21hbGxza2lwXGZpXGZpfQorXGRlZlxtZWRicmVha3tcaWZudW1cbGFzdHBlbmFsdHk8MTAwMDBccGFyXGlmZGltXGxhc3Rza2lwPFxtZWRza2lwYW1vdW50CisgIFxyZW1vdmVsYXN0c2tpcFxwZW5hbHR5LTEwMFxtZWRza2lwXGZpXGZpfQorXGRlZlxiaWdicmVha3tcaWZudW1cbGFzdHBlbmFsdHk8MTAwMDBccGFyXGlmZGltXGxhc3Rza2lwPFxiaWdza2lwYW1vdW50CisgIFxyZW1vdmVsYXN0c2tpcFxwZW5hbHR5LTIwMFxiaWdza2lwXGZpXGZpfQorCislIEZvciBAY3JvcG1hcmtzIGNvbW1hbmQuCislIERvIEBjcm9wbWFya3MgdG8gZ2V0IGNyb3AgbWFya3MuCislCitcbmV3aWZcaWZjcm9wbWFya3MKK1xsZXRcY3JvcG1hcmtzID0gXGNyb3BtYXJrc3RydWUKKyUKKyUgRGltZW5zaW9ucyB0byBhZGQgY3JvcG1hcmtzIGF0IGNvcm5lcnMuCislIEFkZGVkIGJ5IFAuIEEuIE1hY0theSwgMTIgTm92LiAxOTg2CislCitcbmV3ZGltZW5cb3V0ZXJoc2l6ZSBcbmV3ZGltZW5cb3V0ZXJ2c2l6ZSAlIHNldCBieSB0aGUgcGFwZXIgc2l6ZSByb3V0aW5lcworXG5ld2RpbWVuXGNvcm5lcmxvbmcgIFxjb3JuZXJsb25nPTFwYworXG5ld2RpbWVuXGNvcm5lcnRoaWNrIFxjb3JuZXJ0aGljaz0uM3B0CitcbmV3ZGltZW5cdG9wYW5kYm90dG9tbWFyZ2luIFx0b3BhbmRib3R0b21tYXJnaW49Ljc1aW4KKworJSBNYWluIG91dHB1dCByb3V0aW5lLgorXGNoYXJkZWZcUEFHRSA9IDI1NQorXG91dHB1dCA9IHtcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXFBBR0V9fQorCitcbmV3Ym94XGhlYWRsaW5lYm94CitcbmV3Ym94XGZvb3RsaW5lYm94CisKKyUgXG9uZXBhZ2VvdXQgdGFrZXMgYSB2Ym94IGFzIGFuIGFyZ3VtZW50LiAgTm90ZSB0aGF0IFxwYWdlY29udGVudHMKKyUgZG9lcyBpbnNlcnRpb25zLCBidXQgeW91IGhhdmUgdG8gY2FsbCBpdCB5b3Vyc2VsZi4KK1xkZWZcb25lcGFnZW91dCMxeyUKKyAgXGlmY3JvcG1hcmtzIFxob2Zmc2V0PTBwdCBcZWxzZSBcaG9mZnNldD1cbm9ybWFsb2Zmc2V0IFxmaQorICAlCisgIFxpZm9kZFxwYWdlbm8gIFxhZHZhbmNlXGhvZmZzZXQgYnkgXGJpbmRpbmdvZmZzZXQKKyAgXGVsc2UgXGFkdmFuY2VcaG9mZnNldCBieSAtXGJpbmRpbmdvZmZzZXRcZmkKKyAgJQorICAlIERvIHRoaXMgb3V0c2lkZSBvZiB0aGUgXHNoaXBvdXQgc28gQGNvZGUgZXRjLiB3aWxsIGJlIGV4cGFuZGVkIGluCisgICUgdGhlIGhlYWRsaW5lIGFzIHRoZXkgc2hvdWxkIGJlLCBub3QgdGFrZW4gbGl0ZXJhbGx5IChvdXRwdXR0aW5nICcnY29kZSkuCisgIFxzZXRib3hcaGVhZGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2VoZWFkbGluZX0lCisgIFxzZXRib3hcZm9vdGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2Vmb290bGluZX0lCisgICUKKyAgeyUKKyAgICAlIEhhdmUgdG8gZG8gdGhpcyBzdHVmZiBvdXRzaWRlIHRoZSBcc2hpcG91dCBiZWNhdXNlIHdlIHdhbnQgaXQgdG8KKyAgICAlIHRha2UgZWZmZWN0IGluIFx3cml0ZSdzLCB5ZXQgdGhlIGdyb3VwIGRlZmluZWQgYnkgdGhlIFx2Ym94IGVuZHMKKyAgICAlIGJlZm9yZSB0aGUgXHNoaXBvdXQgcnVucy4KKyAgICAlCisgICAgXGluZGV4ZHVtbWllcyAgICAgICAgICUgZG9uJ3QgZXhwYW5kIGNvbW1hbmRzIGluIHRoZSBvdXRwdXQuCisgICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUgICUgXCBpbiBpbmRleCBlbnRyaWVzIG11c3Qgbm90IHN0YXkgXCwgZS5nLiwgaWYKKyAgICAgICAgICAgICAgICUgdGhlIHBhZ2UgYnJlYWsgaGFwcGVucyB0byBiZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4YW1wbGUuCisgICAgICAgICAgICAgICAlIFdlIGRvbid0IHdhbnQgLnZyIChvciB3aGF0ZXZlcikgZW50cmllcyBsaWtlIHRoaXM6CisgICAgICAgICAgICAgICAlIFxlbnRyeXt7XHR0IFxpbmRleGJhY2tzbGFzaCB9YWNyb255bX17MzJ9e1xjb2RlIHtcYWNyb255bX19CisgICAgICAgICAgICAgICAlICJcYWNyb255bSIgd29uJ3Qgd29yayB3aGVuIGl0J3MgcmVhZCBiYWNrIGluOworICAgICAgICAgICAgICAgJSBpdCBuZWVkcyB0byBiZSAKKyAgICAgICAgICAgICAgICUge1xjb2RlIHt7XHR0IFxiYWNrc2xhc2hjdXJmb250IH1hY3JvbnltfQorICAgIFxzaGlwb3V0XHZib3h7JQorICAgICAgJSBEbyB0aGlzIGVhcmx5IHNvIHBkZiByZWZlcmVuY2VzIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UuCisgICAgICBcaWZwZGZtYWtlcGFnZWRlc3QgXHBkZmRlc3QgbmFtZXtcdGhlXHBhZ2Vub30geHl6XGZpCisgICAgICAlCisgICAgICBcaWZjcm9wbWFya3MgXHZib3ggdG8gXG91dGVydnNpemVcYmdyb3VwCisgICAgICAgIFxoc2l6ZSA9IFxvdXRlcmhzaXplCisgICAgICAgIFx2c2tpcC1cdG9wYW5kYm90dG9tbWFyZ2luCisgICAgICAgIFx2dG9wIHRvMHB0eyUKKyAgICAgICAgICBcbGluZXtcZXd0b3BcaGZpbFxld3RvcH0lCisgICAgICAgICAgXG5vaW50ZXJsaW5lc2tpcAorICAgICAgICAgIFxsaW5leyUKKyAgICAgICAgICAgIFx2Ym94e1xtb3ZlbGVmdFxjb3JuZXJ0aGlja1xuc3RvcH0lCisgICAgICAgICAgICBcaGZpbGwKKyAgICAgICAgICAgIFx2Ym94e1xtb3ZlcmlnaHRcY29ybmVydGhpY2tcbnN0b3B9JQorICAgICAgICAgIH0lCisgICAgICAgICAgXHZzc30lCisgICAgICAgIFx2c2tpcFx0b3BhbmRib3R0b21tYXJnaW4KKyAgICAgICAgXGxpbmVcYmdyb3VwCisgICAgICAgICAgXGhmaWwgJSBjZW50ZXIgdGhlIHBhZ2Ugd2l0aGluIHRoZSBvdXRlciAocGFnZSkgaHNpemUuCisgICAgICAgICAgXGlmb2RkXHBhZ2Vub1xoc2tpcFxiaW5kaW5nb2Zmc2V0XGZpCisgICAgICAgICAgXHZib3hcYmdyb3VwCisgICAgICBcZmkKKyAgICAgICUKKyAgICAgIFx1bnZib3hcaGVhZGxpbmVib3gKKyAgICAgIFxwYWdlYm9keXsjMX0lCisgICAgICBcaWZkaW1caHRcZm9vdGxpbmVib3ggPiAwcHQKKyAgICAgICAgJSBPbmx5IGxlYXZlIHRoaXMgc3BhY2UgaWYgdGhlIGZvb3RsaW5lIGlzIG5vbmVtcHR5LgorICAgICAgICAlIChXZSBsZXNzZW5lZCBcdnNpemUgZm9yIGl0IGluIFxvZGRmb290aW5neHh4LikKKyAgICAgICAgJSBUaGUgXGJhc2VsaW5lc2tpcD0yNHB0IGluIHBsYWluJ3MgXG1ha2Vmb290bGluZSBoYXMgbm8gZWZmZWN0LgorICAgICAgICBcdnNraXAgMlxiYXNlbGluZXNraXAKKyAgICAgICAgXHVudmJveFxmb290bGluZWJveAorICAgICAgXGZpCisgICAgICAlCisgICAgICBcaWZjcm9wbWFya3MKKyAgICAgICAgICBcZWdyb3VwICUgZW5kIG9mIFx2Ym94XGJncm91cAorICAgICAgICBcaGZpbFxlZ3JvdXAgJSBlbmQgb2YgKGNlbnRlcmluZykgXGxpbmVcYmdyb3VwCisgICAgICAgIFx2c2tpcFx0b3BhbmRib3R0b21tYXJnaW4gcGx1czFmaWxsIG1pbnVzMWZpbGwKKyAgICAgICAgXGJveG1heGRlcHRoID0gXGNvcm5lcnRoaWNrCisgICAgICAgIFx2Ym94IHRvMHB0e1x2c3MKKyAgICAgICAgICBcbGluZXslCisgICAgICAgICAgICBcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnNib3R9JQorICAgICAgICAgICAgXGhmaWxsCisgICAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zYm90fSUKKyAgICAgICAgICB9JQorICAgICAgICAgIFxub2ludGVybGluZXNraXAKKyAgICAgICAgICBcbGluZXtcZXdib3RcaGZpbFxld2JvdH0lCisgICAgICAgIH0lCisgICAgICBcZWdyb3VwICUgXHZib3ggZnJvbSBmaXJzdCBjcm9wbWFya3MgY2xhdXNlCisgICAgICBcZmkKKyAgICB9JSBlbmQgb2YgXHNoaXBvdXRcdmJveAorICB9JSBlbmQgb2YgZ3JvdXAgd2l0aCBcaW5kZXhkdW1taWVzCisgIFxhZHZhbmNlcGFnZW5vCisgIFxpZm51bVxvdXRwdXRwZW5hbHR5Pi0yMDAwMCBcZWxzZVxkb3N1cGVyZWplY3RcZmkKK30KKworXG5ld2luc2VydFxtYXJnaW4gXGRpbWVuXG1hcmdpbj1cbWF4ZGltZW4KKworXGRlZlxwYWdlYm9keSMxe1x2Ym94IHRvXHBhZ2VoZWlnaHR7XGJveG1heGRlcHRoPVxtYXhkZXB0aCAjMX19Cit7XGNhdGNvZGVgXEAgPTExCitcZ2RlZlxwYWdlY29udGVudHMjMXtcaWZ2b2lkXHRvcGluc1xlbHNlXHVudmJveFx0b3BpbnNcZmkKKyUgbWFyZ2luYWwgaGFja3MsIGp1aGFAdmlpc2EudXVjcCAoSnVoYSBUYWthbGEpCitcaWZ2b2lkXG1hcmdpblxlbHNlICUgbWFyZ2luYWwgaW5mbyBpcyBwcmVzZW50CisgIFxybGFwe1xrZXJuXGhzaXplXHZib3ggdG9cekB7XGtlcm4xcHRcYm94XG1hcmdpbiBcdnNzfX1cZmkKK1xkaW1lbkA9XGRwIzEgXHVudmJveCMxCitcaWZ2b2lkXGZvb3RpbnNcZWxzZVx2c2tpcFxza2lwXGZvb3RpbnNcZm9vdG5vdGVydWxlIFx1bnZib3hcZm9vdGluc1xmaQorXGlmckBnZ2VkYm90dG9tIFxrZXJuLVxkaW1lbkAgXHZmaWwgXGZpfQorfQorCislIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgdGhlIGNyb3BtYXJrcy4gIE5vdGUgdGhhdCB0aGV5IGFyZQorJSBvZmZzZXQgc28gdGhhdCB0aGUgc3BhY2UgYmV0d2VlbiB0aGVtIGlzIHRydWx5IFxvdXRlcmhzaXplIG9yIFxvdXRlcnZzaXplCislIChQLiBBLiBNYWNLYXksIDEyIE5vdmVtYmVyLCAxOTg2KQorJQorXGRlZlxld3RvcHtcdnJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoMHB0IHdpZHRoXGNvcm5lcmxvbmd9CitcZGVmXG5zdG9we1x2Ym94CisgIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoXGNvcm5lcmxvbmcgd2lkdGhcY29ybmVydGhpY2t9fQorXGRlZlxld2JvdHtcdnJ1bGUgaGVpZ2h0MHB0IGRlcHRoXGNvcm5lcnRoaWNrIHdpZHRoXGNvcm5lcmxvbmd9CitcZGVmXG5zYm90e1x2Ym94CisgIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcmxvbmcgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVydGhpY2t9fQorCislIFBhcnNlIGFuIGFyZ3VtZW50LCB0aGVuIHBhc3MgaXQgdG8gIzEuICBUaGUgYXJndW1lbnQgaXMgdGhlIHJlc3Qgb2YKKyUgdGhlIGlucHV0IGxpbmUgKGV4Y2VwdCB3ZSByZW1vdmUgYSB0cmFpbGluZyBjb21tZW50KS4gICMxIHNob3VsZCBiZSBhCislIG1hY3JvIHdoaWNoIGV4cGVjdHMgYW4gb3JkaW5hcnkgdW5kZWxpbWl0ZWQgVGVYIGFyZ3VtZW50LgorJQorXGRlZlxwYXJzZWFyZ3tccGFyc2Vhcmd1c2luZ3t9fQorXGRlZlxwYXJzZWFyZ3VzaW5nIzEjMnslCisgIFxkZWZcbmV4dHsjMn0lCisgIFxiZWdpbmdyb3VwCisgICAgXG9iZXlsaW5lcworICAgIFxzcGFjZWlzc3BhY2UKKyAgICAjMSUKKyAgICBccGFyc2VhcmdsaW5lXGVtcHR5JSBJbnNlcnQgdGhlIFxlbXB0eSB0b2tlbiwgc2VlIFxmaW5pc2hwYXJzZWFyZyBiZWxvdy4KK30KKwore1xvYmV5bGluZXMgJQorICBcZ2RlZlxwYXJzZWFyZ2xpbmUjMV5eTXslCisgICAgXGVuZGdyb3VwICUgRW5kIG9mIHRoZSBncm91cCBzdGFydGVkIGluIFxwYXJzZWFyZy4KKyAgICBcYXJncmVtb3ZlY29tbWVudCAjMVxjb21tZW50XEFyZ1Rlcm0lCisgIH0lCit9CisKKyUgRmlyc3QgcmVtb3ZlIGFueSBAY29tbWVudCwgdGhlbiBhbnkgQGMgY29tbWVudC4KK1xkZWZcYXJncmVtb3ZlY29tbWVudCMxXGNvbW1lbnQjMlxBcmdUZXJte1xhcmdyZW1vdmVjICMxXGNcQXJnVGVybX0KK1xkZWZcYXJncmVtb3ZlYyMxXGMjMlxBcmdUZXJte1xhcmdjaGVja3NwYWNlcyMxXF5eTVxBcmdUZXJtfQorCislIEVhY2ggb2NjdXJlbmNlIG9mIGBcXl5NJyBvciBgPHNwYWNlPlxeXk0nIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHNwYWNlLgorJQorJSBcYXJncmVtb3ZlYyBtaWdodCBsZWF2ZSB1cyB3aXRoIHRyYWlsaW5nIHNwYWNlLCBlLmcuLAorJSAgICBAZW5kIGl0ZW1pemUgIEBjIGZvbworJSBUaGlzIHNwYWNlIHRva2VuIHVuZGVyZ29lcyB0aGUgc2FtZSBwcm9jZWR1cmUgYW5kIGlzIGV2ZW50dWFsbHkgcmVtb3ZlZAorJSBieSBcZmluaXNocGFyc2VhcmcuCislCitcZGVmXGFyZ2NoZWNrc3BhY2VzIzFcXl5Ne1xhcmdjaGVja3NwYWNlc1gjMVxeXk0gXF5eTX0KK1xkZWZcYXJnY2hlY2tzcGFjZXNYIzEgXF5eTXtcYXJnY2hlY2tzcGFjZXNZIzFcXl5NfQorXGRlZlxhcmdjaGVja3NwYWNlc1kjMVxeXk0jMlxeXk0jM1xBcmdUZXJteyUKKyAgXGRlZlx0ZW1weyMzfSUKKyAgXGlmeFx0ZW1wXGVtcHR5CisgICAgJSBXZSBjYW5ub3QgdXNlIFxuZXh0IGhlcmUsIGFzIGl0IGhvbGRzIHRoZSBtYWNybyB0byBydW47CisgICAgJSB0aHVzIHdlIHJldXNlIFx0ZW1wLgorICAgIFxsZXRcdGVtcFxmaW5pc2hwYXJzZWFyZworICBcZWxzZQorICAgIFxsZXRcdGVtcFxhcmdjaGVja3NwYWNlcworICBcZmkKKyAgJSBQdXQgdGhlIHNwYWNlIHRva2VuIGluOgorICBcdGVtcCMxICMzXEFyZ1Rlcm0KK30KKworJSBJZiBhIF9kZWxpbWl0ZWRfIGFyZ3VtZW50IGlzIGVuY2xvc2VkIGluIGJyYWNlcywgdGhleSBnZXQgc3RyaXBwZWQ7IHNvCislIHRvIGdldCBfZXhhY3RseV8gdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIHdlIGhhZCB0byBwcmV2ZW50IHN1Y2ggc2l0dWF0aW9uLgorJSBXZSBwcmVwZW5kZWQgYW4gXGVtcHR5IHRva2VuIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBhbmQgd2UgZXhwYW5kIGl0IG5vdywKKyUganVzdCBiZWZvcmUgcGFzc2luZyB0aGUgY29udHJvbCB0byBcbmV4dC4KKyUgKFNpbWlsYXJpbHksIHdlIGhhdmUgdG8gdGhpbmsgYWJvdXQgIzMgb2YgXGFyZ2NoZWNrc3BhY2VzWSBhYm92ZTogaXQgaXMKKyUgZWl0aGVyIHRoZSBudWxsIHN0cmluZywgb3IgaXQgZW5kcyB3aXRoIFxeXk0tLS10aHVzIHRoZXJlIGlzIG5vIGRhbmdlcgorJSB0aGF0IGEgcGFpciBvZiBicmFjZXMgd291bGQgYmUgc3RyaXBwZWQuCislCislIEJ1dCBmaXJzdCwgd2UgaGF2ZSB0byByZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIHRva2VuLgorJQorXGRlZlxmaW5pc2hwYXJzZWFyZyMxIFxBcmdUZXJte1xleHBhbmRhZnRlclxuZXh0XGV4cGFuZGFmdGVyeyMxfX0KKworJSBccGFyc2VhcmdkZWZcZm9vey4uLn0KKyUJaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCislIFxkZWZcZm9ve1xwYXJzZWFyZ1xYZm9vfQorJSBcZGVmXFhmb28jMXsuLi59CislCislIEFjdHVhbGx5LCBJIHVzZSBcY3NuYW1lXHN0cmluZ1xmb29cZW5kY3NuYW1lLCBpZS4gXFxmb28sIGFzIGl0IGlzIG15CislIGZhdm91cml0ZSBUZVggdHJpY2suICAtLWthc2FsLCAxNm5vdjAzCisKK1xkZWZccGFyc2VhcmdkZWYjMXslCisgIFxleHBhbmRhZnRlciBcZG9wYXJzZWFyZ2RlZiBcY3NuYW1lXHN0cmluZyMxXGVuZGNzbmFtZSAjMSUKK30KK1xkZWZcZG9wYXJzZWFyZ2RlZiMxIzJ7JQorICBcZGVmIzJ7XHBhcnNlYXJnIzF9JQorICBcZGVmIzEjIzElCit9CisKKyUgU2V2ZXJhbCB1dGlsaXR5IGRlZmluaXRpb25zIHdpdGggYWN0aXZlIHNwYWNlOgoreworICBcb2JleXNwYWNlcworICBcZ2RlZlxvYmV5ZWRzcGFjZXsgfQorCisgICUgTWFrZSBlYWNoIHNwYWNlIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgcHJvZHVjZSBhIG5vcm1hbCBpbnRlcndvcmQKKyAgJSBzcGFjZSBpbiB0aGUgb3V0cHV0LiAgRG9uJ3QgYWxsb3cgYSBsaW5lIGJyZWFrIGF0IHRoaXMgc3BhY2UsIGFzIHRoaXMKKyAgJSBpcyB1c2VkIG9ubHkgaW4gZW52aXJvbm1lbnRzIGxpa2UgQGV4YW1wbGUsIHdoZXJlIGVhY2ggbGluZSBvZiBpbnB1dAorICAlIHNob3VsZCBwcm9kdWNlIGEgbGluZSBvZiBvdXRwdXQgYW55d2F5LgorICAlCisgIFxnZGVmXHNlcHNwYWNlc3tcb2JleXNwYWNlc1xsZXQgPVx0aWV9CisKKyAgJSBJZiBhbiBpbmRleCBjb21tYW5kIGlzIHVzZWQgaW4gYW4gQGV4YW1wbGUgZW52aXJvbm1lbnQsIGFueSBzcGFjZXMKKyAgJSB0aGVyZWluIHNob3VsZCBiZWNvbWUgcmVndWxhciBzcGFjZXMgaW4gdGhlIHJhdyBpbmRleCBmaWxlLCBub3QgdGhlCisgICUgZXhwYW5zaW9uIG9mIFx0aWUgKFxsZWF2ZXZtb2RlIFxwZW5hbHR5IFxATSBcICkuCisgIFxnZGVmXHVuc2Vwc3BhY2Vze1xsZXQgPVxzcGFjZX0KK30KKworCitcZGVmXGZsdXNoY3J7XGlmeFxwYXJcbGlzcHBhciBcZGVmXG5leHQjIzF7fVxlbHNlIFxsZXRcbmV4dD1ccmVsYXggXGZpIFxuZXh0fQorCislIERlZmluZSB0aGUgZnJhbWV3b3JrIGZvciBlbnZpcm9ubWVudHMgaW4gdGV4aW5mby50ZXguICBJdCdzIHVzZWQgbGlrZSB0aGlzOgorJQorJSAgIFxlbnZkZWZcZm9vey4uLn0KKyUgICBcZGVmXEVmb297Li4ufQorJQorJSBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBcZW52ZGVmIHRvIGluc2VydCBcYmVnaW5ncm91cCBiZWZvcmUgdGhlCislIGFjdHVhbCBib2R5OyBAZW5kIGNsb3NlcyB0aGUgZ3JvdXAgYWZ0ZXIgY2FsbGluZyBcRWZvby4gIFxlbnZkZWYgYWxzbworJSBkZWZpbmVzIFx0aGlzZW52LCBzbyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBrbm93bjsgQGVuZCBjaGVja3MKKyUgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgbmFtZSBtYXRjaGVzLiAgVGhlIFxjaGVja2VudiBtYWNybyBjYW4gYWxzbyBiZQorJSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgdGhlIG9uZSBleHBlY3RlZC4KKyUKKyUgTm9uLWZhbHNlIGNvbmRpdGlvbmFscyAoQGlmdGV4LCBAaWZzZXQpIGRvbid0IGZpdCBpbnRvIHRoaXMsIHNvIHRoZXkKKyUgYXJlIG5vdCB0cmVhdGVkIGFzIGVudmlyb21lbnRzOyB0aGV5IGRvbid0IG9wZW4gYSBncm91cC4gIChUaGUKKyUgaW1wbGVtZW50YXRpb24gb2YgQGVuZCB0YWtlcyBjYXJlIG5vdCB0byBjYWxsIFxlbmRncm91cCBpbiB0aGlzCislIHNwZWNpYWwgY2FzZS4pCisKKworJSBBdCBydW50aW1lLCBlbnZpcm9ubWVudHMgc3RhcnQgd2l0aCB0aGlzOgorXGRlZlxzdGFydGVudmlyb25tZW50IzF7XGJlZ2luZ3JvdXBcZGVmXHRoaXNlbnZ7IzF9fQorJSBpbml0aWFsaXplCitcbGV0XHRoaXNlbnZcZW1wdHkKKworJSAuLi4gYnV0IHRoZXkgZ2V0IGRlZmluZWQgdmlhIGBgXGVudmRlZlxmb297Li4ufScnOgorXGxvbmdcZGVmXGVudmRlZiMxIzJ7XGRlZiMxe1xzdGFydGVudmlyb25tZW50IzEjMn19CitcZGVmXGVudnBhcnNlYXJnZGVmIzEjMntccGFyc2VhcmdkZWYjMXtcc3RhcnRlbnZpcm9ubWVudCMxIzJ9fQorCislIENoZWNrIHdoZXRoZXIgd2UncmUgaW4gdGhlIHJpZ2h0IGVudmlyb25tZW50OgorXGRlZlxjaGVja2VudiMxeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0aGlzZW52XHRlbXAKKyAgXGVsc2UKKyAgICBcYmFkZW52ZXJyCisgIFxmaQorfQorCislIEV2aXJvbm1lbnQgbWlzbWF0Y2gsICMxIGV4cGVjdGVkOgorXGRlZlxiYWRlbnZlcnJ7JQorICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICBcZXJybWVzc2FnZXtUaGlzIGNvbW1hbmQgY2FuIGFwcGVhciBvbmx5IFxpbmVudmlyb25tZW50XHRlbXAsCisgICAgbm90IFxpbmVudmlyb25tZW50XHRoaXNlbnZ9JQorfQorXGRlZlxpbmVudmlyb25tZW50IzF7JQorICBcaWZ4IzFcZW1wdHkKKyAgICBvdXQgb2YgYW55IGVudmlyb25tZW50JQorICBcZWxzZQorICAgIGluIGVudmlyb25tZW50IFxleHBhbmRhZnRlclxzdHJpbmcjMSUKKyAgXGZpCit9CisKKyUgQGVuZCBmb28gZXhlY3V0ZXMgdGhlIGRlZmluaXRpb24gb2YgXEVmb28uCislIEJ1dCBmaXJzdCwgaXQgZXhlY3V0ZXMgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIFxjaGVja2VudgorJQorXHBhcnNlYXJnZGVmXGVuZHslCisgIFxpZiAxXGNzbmFtZSBpc2NvbmQuIzFcZW5kY3NuYW1lCisgIFxlbHNlCisgICAgJSBUaGUgZ2VuZXJhbCB3b3JkaW5nIG9mIFxiYWRlbnZlcnIgbWF5IG5vdCBiZSBpZGVhbCwgYnV0Li4uIC0ta2FzYWwsIDA2bm92MDMKKyAgICBcZXhwYW5kYWZ0ZXJcY2hlY2tlbnZcY3NuYW1lIzFcZW5kY3NuYW1lCisgICAgXGNzbmFtZSBFIzFcZW5kY3NuYW1lCisgICAgXGVuZGdyb3VwCisgIFxmaQorfQorCitcbmV3aGVscFxFTXNpbXBsZXtQcmVzcyBSRVRVUk4gdG8gY29udGludWUufQorCisKKyUlIFNpbXBsZSBzaW5nbGUtY2hhcmFjdGVyIEAgY29tbWFuZHMKKworJSBAQCBwcmludHMgYW4gQAorJSBLbHVkZ2UgdGhpcyB1bnRpbCB0aGUgZm9udHMgYXJlIHJpZ2h0IChncnIpLgorXGRlZlxAe3tcdHRcY2hhcjY0fX0KKworJSBUaGlzIGlzIHR1cm5lZCBvZmYgYmVjYXVzZSBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZAorJSBhbmQgeW91IGNhbiB1c2UgQHd7Li4ufSBhcm91bmQgYSBxdW90ZSB0byBzdXBwcmVzcyBsaWdhdHVyZXMuCislJSBEZWZpbmUgQGAgYW5kIEAnIHRvIGJlIHRoZSBzYW1lIGFzIGAgYW5kICcKKyUlIGJ1dCBzdXBwcmVzc2luZyBsaWdhdHVyZXMuCislXGRlZlxge3tgfX0KKyVcZGVmXCd7eyd9fQorCislIFVzZWQgdG8gZ2VuZXJhdGUgcXVvdGVkIGJyYWNlcy4KK1xkZWZcbXlsYnJhY2Uge3tcdHRcY2hhcjEyM319CitcZGVmXG15cmJyYWNlIHt7XHR0XGNoYXIxMjV9fQorXGxldFx7PVxteWxicmFjZQorXGxldFx9PVxteXJicmFjZQorXGJlZ2luZ3JvdXAKKyAgJSBEZWZpbml0aW9ucyB0byBwcm9kdWNlIFx7IGFuZCBcfSBjb21tYW5kcyBmb3IgaW5kaWNlcywKKyAgJSBhbmQgQHsgYW5kIEB9IGZvciB0aGUgYXV4L3RvYyBmaWxlcy4KKyAgXGNhdGNvZGVgXHsgPSBcb3RoZXIgXGNhdGNvZGVgXH0gPSBcb3RoZXIKKyAgXGNhdGNvZGVgXFsgPSAxIFxjYXRjb2RlYFxdID0gMgorICBcY2F0Y29kZWBcISA9IDAgXGNhdGNvZGVgXFwgPSBcb3RoZXIKKyAgIWdkZWYhbGJyYWNlY21kW1x7XSUKKyAgIWdkZWYhcmJyYWNlY21kW1x9XSUKKyAgIWdkZWYhbGJyYWNlYXRjbWRbQHtdJQorICAhZ2RlZiFyYnJhY2VhdGNtZFtAfV0lCishZW5kZ3JvdXAKKworJSBAY29tbWF7fSB0byBhdm9pZCAsIHBhcnNpbmcgcHJvYmxlbXMuCitcbGV0XGNvbW1hID0gLAorCislIEFjY2VudHM6IEAsIEBkb3RhY2NlbnQgQHJpbmdhY2NlbnQgQHViYXJhY2NlbnQgQHVkb3RhY2NlbnQKKyUgT3RoZXJzIGFyZSBkZWZpbmVkIGJ5IHBsYWluIFRlWDogQGAgQCcgQCIgQF4gQH4gQD0gQHUgQHYgQEguCitcbGV0XCwgPSBcYworXGxldFxkb3RhY2NlbnQgPSBcLgorXGRlZlxyaW5nYWNjZW50IzF7e1xhY2NlbnQyMyAjMX19CitcbGV0XHRpZWFjY2VudCA9IFx0CitcbGV0XHViYXJhY2NlbnQgPSBcYgorXGxldFx1ZG90YWNjZW50ID0gXGQKKworJSBPdGhlciBzcGVjaWFsIGNoYXJhY3RlcnM6IEBxdWVzdGlvbmRvd24gQGV4Y2xhbWRvd24gQG9yZGYgQG9yZG0KKyUgUGxhaW4gVGVYIGRlZmluZXM6IEBBQSBAQUUgQE8gQE9FIEBMIChwbHVzIGxvd2VyY2FzZSB2ZXJzaW9ucykgQHNzLgorXGRlZlxxdWVzdGlvbmRvd257P2B9CitcZGVmXGV4Y2xhbWRvd257IWB9CitcZGVmXG9yZGZ7XGxlYXZldm1vZGVccmFpc2UxZXhcaGJveHtcc2VsZWN0Zm9udHNcbGxsc2l6ZSBcdW5kZXJiYXJ7YX19fQorXGRlZlxvcmRte1xsZWF2ZXZtb2RlXHJhaXNlMWV4XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgXHVuZGVyYmFye299fX0KKworJSBEb3RsZXNzIGkgYW5kIGRvdGxlc3MgaiwgdXNlZCBmb3IgYWNjZW50cy4KK1xkZWZcaW1hY3Jve2l9CitcZGVmXGptYWNyb3tqfQorXGRlZlxkb3RsZXNzIzF7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcaW1hY3JvIFxwdGV4aQorICBcZWxzZVxpZnhcdGVtcFxqbWFjcm8gXGoKKyAgXGVsc2UgXGVycm1lc3NhZ2V7QGRvdGxlc3MgY2FuIGJlIHVzZWQgb25seSB3aXRoIGkgb3Igan0lCisgIFxmaVxmaQorfQorCislIFRoZSBcVGVYe30gbG9nbywgYXMgaW4gcGxhaW4sIGJ1dCByZXNldHRpbmcgdGhlIHNwYWNpbmcgc28gdGhhdCBhCislIHBlcmlvZCBmb2xsb3dpbmcgY291bnRzIGFzIGVuZGluZyBhIHNlbnRlbmNlLiAgKElkZWEgZm91bmQgaW4gbGF0ZXguKQorJQorXGVkZWZcVGVYe1xUZVggXHNwYWNlZmFjdG9yPTEwMDAgfQorCislIEBMYVRlWHt9IGxvZ28uICBOb3QgcXVpdGUgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgZGVmaW5pdGlvbiBpbgorJSBsYXRleC5sdHgsIHNpbmNlIHdlIHVzZSBhIGRpZmZlcmVudCBmb250IGZvciB0aGUgcmFpc2VkIEE7IGl0J3MgbW9zdAorJSBjb252ZW5pZW50IGZvciB1cyB0byB1c2UgYW4gZXhwbGljaXRseSBzbWFsbGVyIGZvbnQsIHJhdGhlciB0aGFuIHVzaW5nCislIHRoZSBcc2NyaXB0c3R5bGUgZm9udCAoc2luY2Ugd2UgZG9uJ3QgcmVzZXQgXHNjcmlwdHN0eWxlIGFuZAorJSBcc2NyaXB0c2NyaXB0c3R5bGUpLgorJQorXGRlZlxMYVRlWHslCisgIExca2Vybi0uMzZlbQorICB7XHNldGJveDA9XGhib3h7VH0lCisgICBcdmJveCB0byBcaHQwe1xoYm94e1xzZWxlY3Rmb250c1xsbGxzaXplIEF9XHZzc319JQorICBca2Vybi0uMTVlbQorICBcVGVYCit9CisKKyUgQmUgc3VyZSB3ZSdyZSBpbiBob3Jpem9udGFsIG1vZGUgd2hlbiBkb2luZyBhIHRpZSwgc2luY2Ugd2UgbWFrZSBzcGFjZQorJSBlcXVpdmFsZW50IHRvIHRoaXMgaW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudHMuIE90aGVyd2lzZSwgYSBzcGFjZQorJSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aWxsIHN0YXJ0IHdpdGggXHBlbmFsdHkgLS0gYW5kCislIHNpbmNlIFxwZW5hbHR5IGlzIHZhbGlkIGluIHZlcnRpY2FsIG1vZGUsIHdlJ2QgZW5kIHVwIHB1dHRpbmcgdGhlCislIHBlbmFsdHkgb24gdGhlIHZlcnRpY2FsIGxpc3QgaW5zdGVhZCBvZiBpbiB0aGUgbmV3IHBhcmFncmFwaC4KK3tcY2F0Y29kZWBAID0gMTEKKyAlIEF2b2lkIHVzaW5nIFxATSBkaXJlY3RseSwgYmVjYXVzZSB0aGF0IGNhdXNlcyB0cm91YmxlCisgJSBpZiB0aGUgZGVmaW5pdGlvbiBpcyB3cml0dGVuIGludG8gYW4gaW5kZXggZmlsZS4KKyBcZ2xvYmFsXGxldFx0aWVwZW5hbHR5ID0gXEBNCisgXGdkZWZcdGlle1xsZWF2ZXZtb2RlXHBlbmFsdHlcdGllcGVuYWx0eVwgfQorfQorCislIEA6IGZvcmNlcyBub3JtYWwgc2l6ZSB3aGl0ZXNwYWNlIGZvbGxvd2luZy4KK1xkZWZcOntcc3BhY2VmYWN0b3I9MTAwMCB9CisKKyUgQCogZm9yY2VzIGEgbGluZSBicmVhay4KK1xkZWZcKntcaGZpbFxicmVha1xoYm94e31caWdub3Jlc3BhY2VzfQorCislIEAvIGFsbG93cyBhIGxpbmUgYnJlYWsuCitcbGV0XC89XGFsbG93YnJlYWsKKworJSBALiBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgcGVyaW9kLgorXGRlZlwuey5cc3BhY2VmYWN0b3I9XGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvclxzcGFjZX0KKworJSBAISBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgYmFuZy4KK1xkZWZcIXshXHNwYWNlZmFjdG9yPVxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3Jcc3BhY2V9CisKKyUgQD8gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHF1ZXJ5LgorXGRlZlw/ez9cc3BhY2VmYWN0b3I9XGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvclxzcGFjZX0KKworJSBAZnJlbmNoc3BhY2luZyBvbnxvZmYgIHNheXMgd2hldGhlciB0byBwdXQgZXh0cmEgc3BhY2UgYWZ0ZXIgcHVuY3R1YXRpb24uCislIAorXGRlZlxvbndvcmR7b259CitcZGVmXG9mZndvcmR7b2ZmfQorJQorXHBhcnNlYXJnZGVmXGZyZW5jaHNwYWNpbmd7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcb253b3JkIFxwbGFpbmZyZW5jaHNwYWNpbmcKKyAgXGVsc2VcaWZ4XHRlbXBcb2Zmd29yZCBccGxhaW5ub25mcmVuY2hzcGFjaW5nCisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEBmcmVuY2hzcGFjaW5nIG9wdGlvbiBgXHRlbXAnLCBtdXN0IGJlIG9uL29mZn0lCisgIFxmaVxmaQorfQorCislIEB3IHByZXZlbnRzIGEgd29yZCBicmVhay4gIFdpdGhvdXQgdGhlIFxsZWF2ZXZtb2RlLCBAdyBhdCB0aGUKKyUgYmVnaW5uaW5nIG9mIGEgcGFyYWdyYXBoLCB3aGVuIFRlWCBpcyBzdGlsbCBpbiB2ZXJ0aWNhbCBtb2RlLCB3b3VsZAorJSBwcm9kdWNlIGEgd2hvbGUgbGluZSBvZiBvdXRwdXQgaW5zdGVhZCBvZiBzdGFydGluZyB0aGUgcGFyYWdyYXBoLgorXGRlZlx3IzF7XGxlYXZldm1vZGVcaGJveHsjMX19CisKKyUgQGdyb3VwIC4uLiBAZW5kIGdyb3VwIGZvcmNlcyAuLi4gdG8gYmUgYWxsIG9uIG9uZSBwYWdlLCBieSBlbmNsb3NpbmcKKyUgaXQgaW4gYSBUZVggdmJveC4gIFdlIHVzZSBcdnRvcCBpbnN0ZWFkIG9mIFx2Ym94IHRvIGNvbnN0cnVjdCB0aGUgYm94CislIHRvIGtlZXAgaXRzIGhlaWdodCB0aGF0IG9mIGEgbm9ybWFsIGxpbmUuICBBY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGZvcgorJSBcdG9wc2tpcCAocC4xMTQgb2YgdGhlIFRlWGJvb2spLCB0aGUgZ2x1ZSBpbnNlcnRlZCBpcworJSBtYXggKFx0b3Bza2lwIC0gXGh0IChmaXJzdCBpdGVtKSwgMCkuICBJZiB0aGF0IGhlaWdodCBpcyBsYXJnZSwKKyUgdGhlcmVmb3JlLCBubyBnbHVlIGlzIGluc2VydGVkLCBhbmQgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGhlYWRsaW5lIGFuZAorJSB0aGUgdGV4dCBpcyBzbWFsbCwgd2hpY2ggbG9va3MgYmFkLgorJQorJSBBbm90aGVyIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSBncm91cCBtaWdodCBiZSB2ZXJ5IGxhcmdlLiAgVGhpcyBjYW4KKyUgY2F1c2UgdGhlIGdsdWUgb24gdGhlIHByZXZpb3VzIHBhZ2UgdG8gYmUgdW5kdWx5IHN0cmV0Y2hlZCwgYmVjYXVzZSBpdAorJSBkb2VzIG5vdCBoYXZlIG11Y2ggbWF0ZXJpYWwuICBJbiB0aGlzIGNhc2UsIGl0J3MgYmV0dGVyIHRvIGFkZCBhbgorJSBleHBsaWNpdCBcdmZpbGwgc28gdGhhdCB0aGUgZXh0cmEgc3BhY2UgaXMgYXQgdGhlIGJvdHRvbS4gIFRoZQorJSB0aHJlc2hvbGQgZm9yIGRvaW5nIHRoaXMgaXMgaWYgdGhlIGdyb3VwIGlzIG1vcmUgdGhhbiBcdmZpbGxsaW1pdAorJSBwZXJjZW50IG9mIGEgcGFnZSAoXHZmaWxsbGltaXQgY2FuIGJlIGNoYW5nZWQgaW5zaWRlIG9mIEB0ZXgpLgorJQorXG5ld2JveFxncm91cGJveAorXGRlZlx2ZmlsbGxpbWl0ezAuN30KKyUKK1xlbnZkZWZcZ3JvdXB7JQorICBcaWZudW1cY2F0Y29kZWBcXl5NPVxhY3RpdmUgXGVsc2UKKyAgICBcZXJyaGVscCA9IFxncm91cGludmFsaWRoZWxwCisgICAgXGVycm1lc3NhZ2V7QGdyb3VwIGludmFsaWQgaW4gY29udGV4dCB3aGVyZSBmaWxsaW5nIGlzIGVuYWJsZWR9JQorICBcZmkKKyAgXHN0YXJ0c2F2aW5naW5zZXJ0cworICAlCisgIFxzZXRib3hcZ3JvdXBib3ggPSBcdnRvcFxiZ3JvdXAKKyAgICAlIERvIEBjb21tZW50IHNpbmNlIHdlIGFyZSBjYWxsZWQgaW5zaWRlIGFuIGVudmlyb25tZW50IHN1Y2ggYXMKKyAgICAlIEBleGFtcGxlLCB3aGVyZSBlYWNoIGVuZC1vZi1saW5lIGluIHRoZSBpbnB1dCBjYXVzZXMgYW4KKyAgICAlIGVuZC1vZi1saW5lIGluIHRoZSBvdXRwdXQuICBXZSBkb24ndCB3YW50IHRoZSBlbmQtb2YtbGluZSBhZnRlcgorICAgICUgdGhlIGBAZ3JvdXAnIHRvIHB1dCBleHRyYSBzcGFjZSBpbiB0aGUgb3V0cHV0LiAgU2luY2UgQGdyb3VwCisgICAgJSBzaG91bGQgYXBwZWFyIG9uIGEgbGluZSBieSBpdHNlbGYgKGFjY29yZGluZyB0byB0aGUgVGV4aW5mbworICAgICUgbWFudWFsKSwgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgZWF0aW5nIGFueSB1c2VyIHRleHQuCisgICAgXGNvbW1lbnQKK30KKyUKKyUgVGhlIFx2dG9wIHByb2R1Y2VzIGEgYm94IHdpdGggbm9ybWFsIGhlaWdodCBhbmQgbGFyZ2UgZGVwdGg7IHRodXMsIFRlWCBwdXRzCislIFxiYXNlbGluZXNraXAgZ2x1ZSBiZWZvcmUgaXQsIGFuZCAod2hlbiB0aGUgbmV4dCBsaW5lIG9mIHRleHQgaXMgZG9uZSkKKyUgXGxpbmVza2lwIGdsdWUgYWZ0ZXIgaXQuICBUaHVzLCBzcGFjZSBiZWxvdyBpcyBub3QgcXVpdGUgZXF1YWwgdG8gc3BhY2UKKyUgYWJvdmUuICBCdXQgaXQncyBwcmV0dHkgY2xvc2UuCitcZGVmXEVncm91cHslCisgICAgJSBUbyBnZXQgY29ycmVjdCBpbnRlcmxpbmUgc3BhY2UgYmV0d2VlbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBncm91cAorICAgICUgYW5kIHRoZSBmaXJzdCBsaW5lIGFmdGVyd2FyZHMsIHdlIGhhdmUgdG8gcHJvcGFnYXRlIFxwcmV2ZGVwdGguCisgICAgXGVuZGdyYWYgJSBOb3QgXHBhciwgYXMgaXQgbWF5IGhhdmUgYmVlbiBzZXQgdG8gXGxpc3BwYXIuCisgICAgXGdsb2JhbFxkaW1lbjEgPSBccHJldmRlcHRoCisgIFxlZ3JvdXAgICAgICAgICAgICUgRW5kIHRoZSBcdnRvcC4KKyAgJSBcZGltZW4wIGlzIHRoZSB2ZXJ0aWNhbCBzaXplIG9mIHRoZSBncm91cCdzIGJveC4KKyAgXGRpbWVuMCA9IFxodFxncm91cGJveCAgXGFkdmFuY2VcZGltZW4wIGJ5IFxkcFxncm91cGJveAorICAlIFxkaW1lbjIgaXMgaG93IG11Y2ggc3BhY2UgaXMgbGVmdCBvbiB0aGUgcGFnZSAobW9yZSBvciBsZXNzKS4KKyAgXGRpbWVuMiA9IFxwYWdlaGVpZ2h0ICAgXGFkdmFuY2VcZGltZW4yIGJ5IC1ccGFnZXRvdGFsCisgICUgaWYgdGhlIGdyb3VwIGRvZXNuJ3QgZml0IG9uIHRoZSBjdXJyZW50IHBhZ2UsIGFuZCBpdCdzIGEgYmlnIGJpZworICAlIGdyb3VwLCBmb3JjZSBhIHBhZ2UgYnJlYWsuCisgIFxpZmRpbSBcZGltZW4wID4gXGRpbWVuMgorICAgIFxpZmRpbSBccGFnZXRvdGFsIDwgXHZmaWxsbGltaXRccGFnZWhlaWdodAorICAgICAgXHBhZ2UKKyAgICBcZmkKKyAgXGZpCisgIFxib3hcZ3JvdXBib3gKKyAgXHByZXZkZXB0aCA9IFxkaW1lbjEKKyAgXGNoZWNraW5zZXJ0cworfQorJQorJSBUZVggcHV0cyBpbiBhbiBcZXNjYXBlY2hhciAoaS5lLiwgYEAnKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWxwCislIG1lc3NhZ2UsIHNvIHRoaXMgZW5kcyB1cCBwcmludGluZyBgQGdyb3VwIGNhbiBvbmx5IC4uLicuCislCitcbmV3aGVscFxncm91cGludmFsaWRoZWxweyUKK2dyb3VwIGNhbiBvbmx5IGJlIHVzZWQgaW4gZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGV4YW1wbGUsXl5KJQord2hlcmUgZWFjaCBsaW5lIG9mIGlucHV0IHByb2R1Y2VzIGEgbGluZSBvZiBvdXRwdXQufQorCislIEBuZWVkIHNwYWNlLWluLW1pbHMKKyUgZm9yY2VzIGEgcGFnZSBicmVhayBpZiB0aGVyZSBpcyBub3Qgc3BhY2UtaW4tbWlscyByZW1haW5pbmcuCisKK1xuZXdkaW1lblxtaWwgIFxtaWw9MC4wMDFpbgorCislIE9sZCBkZWZpbml0aW9uLS1kaWRuJ3Qgd29yay4KKyVccGFyc2VhcmdkZWZcbmVlZHtccGFyICUKKyUlIFRoaXMgbWV0aG9kIHRyaWVzIHRvIG1ha2UgVGVYIGJyZWFrIHRoZSBwYWdlIG5hdHVyYWxseQorJSUgaWYgdGhlIGRlcHRoIG9mIHRoZSBib3ggZG9lcyBub3QgZml0LgorJXtcYmFzZWxpbmVza2lwPTBwdCUKKyVcdnRvcCB0byAjMVxtaWx7XHZmaWx9XGtlcm4gLSMxXG1pbFxub2JyZWFrCislXHByZXZkZXB0aD0tMTAwMHB0CislfX0KKworXHBhcnNlYXJnZGVmXG5lZWR7JQorICAlIEVuc3VyZSB2ZXJ0aWNhbCBtb2RlLCBzbyB3ZSBkb24ndCBtYWtlIGEgYmlnIGJveCBpbiB0aGUgbWlkZGxlIG9mIGEKKyAgJSBwYXJhZ3JhcGguCisgIFxwYXIKKyAgJQorICAlIElmIHRoZSBAbmVlZCB2YWx1ZSBpcyBsZXNzIHRoYW4gb25lIGxpbmUgc3BhY2UsIGl0J3MgdXNlbGVzcy4KKyAgXGRpbWVuMCA9ICMxXG1pbAorICBcZGltZW4yID0gXGh0XHN0cnV0Ym94CisgIFxhZHZhbmNlXGRpbWVuMiBieSBcZHBcc3RydXRib3gKKyAgXGlmZGltXGRpbWVuMCA+IFxkaW1lbjIKKyAgICAlCisgICAgJSBEbyBhIFxzdHJ1dCBqdXN0IHRvIG1ha2UgdGhlIGhlaWdodCBvZiB0aGlzIGJveCBiZSBub3JtYWwsIHNvIHRoZQorICAgICUgbm9ybWFsIGxlYWRpbmcgaXMgaW5zZXJ0ZWQgcmVsYXRpdmUgdG8gdGhlIHByZWNlZGluZyBsaW5lLgorICAgICUgQW5kIGEgcGFnZSBicmVhayBoZXJlIGlzIGZpbmUuCisgICAgXHZ0b3AgdG8gIzFcbWlse1xzdHJ1dFx2ZmlsfSUKKyAgICAlCisgICAgJSBUZVggZG9lcyBub3QgZXZlbiBjb25zaWRlciBwYWdlIGJyZWFrcyBpZiBhIHBlbmFsdHkgYWRkZWQgdG8gdGhlCisgICAgJSBtYWluIHZlcnRpY2FsIGxpc3QgaXMgMTAwMDAgb3IgbW9yZS4gIEJ1dCBpbiBvcmRlciB0byBzZWUgaWYgdGhlCisgICAgJSBlbXB0eSBib3ggd2UganVzdCBhZGRlZCBmaXRzIG9uIHRoZSBwYWdlLCB3ZSBtdXN0IG1ha2UgaXQgY29uc2lkZXIKKyAgICAlIHBhZ2UgYnJlYWtzLiAgT24gdGhlIG90aGVyIGhhbmQsIHdlIGRvbid0IHdhbnQgdG8gYWN0dWFsbHkgYnJlYWsgdGhlCisgICAgJSBwYWdlIGFmdGVyIHRoZSBlbXB0eSBib3guICBTbyB3ZSB1c2UgYSBwZW5hbHR5IG9mIDk5OTkuCisgICAgJQorICAgICUgVGhlcmUgaXMgYW4gZXh0cmVtZWx5IHNtYWxsIGNoYW5jZSB0aGF0IFRlWCB3aWxsIGFjdHVhbGx5IGJyZWFrIHRoZQorICAgICUgcGFnZSBhdCB0aGlzIFxwZW5hbHR5LCBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgZmVhc2libGUgYnJlYWtwb2ludHMgaW4KKyAgICAlIHNpZ2h0LiAgKElmIHRoZSB1c2VyIGlzIHVzaW5nIGxvdHMgb2YgYmlnIEBncm91cCBjb21tYW5kcywgd2hpY2gKKyAgICAlIGFsbW9zdC1idXQtbm90LXF1aXRlIGZpbGwgdXAgYSBwYWdlLCBUZVggd2lsbCBoYXZlIGEgaGFyZCB0aW1lIGRvaW5nCisgICAgJSBnb29kIHBhZ2UgYnJlYWtpbmcsIGZvciBleGFtcGxlLikgIEhvd2V2ZXIsIEkgY291bGQgbm90IGNvbnN0cnVjdCBhbgorICAgICUgZXhhbXBsZSB3aGVyZSBhIHBhZ2UgYnJva2UgYXQgdGhpcyBccGVuYWx0eTsgaWYgaXQgaGFwcGVucyBpbiBhIHJlYWwKKyAgICAlIGRvY3VtZW50LCB0aGVuIHdlIGNhbiByZWNvbnNpZGVyIG91ciBzdHJhdGVneS4KKyAgICBccGVuYWx0eTk5OTkKKyAgICAlCisgICAgJSBCYWNrIHVwIGJ5IHRoZSBzaXplIG9mIHRoZSBib3gsIHdoZXRoZXIgd2UgZGlkIGEgcGFnZSBicmVhayBvciBub3QuCisgICAgXGtlcm4gLSMxXG1pbAorICAgICUKKyAgICAlIERvIG5vdCBhbGxvdyBhIHBhZ2UgYnJlYWsgcmlnaHQgYWZ0ZXIgdGhpcyBrZXJuLgorICAgIFxub2JyZWFrCisgIFxmaQorfQorCislIEBiciAgIGZvcmNlcyBwYXJhZ3JhcGggYnJlYWsgKGFuZCBpcyB1bmRvY3VtZW50ZWQpLgorCitcbGV0XGJyID0gXHBhcgorCislIEBwYWdlIGZvcmNlcyB0aGUgc3RhcnQgb2YgYSBuZXcgcGFnZS4KKyUKK1xkZWZccGFnZXtccGFyXHZmaWxsXHN1cGVyZWplY3R9CisKKyUgQGV4ZGVudCB0ZXh0Li4uLgorJSBvdXRwdXRzIHRleHQgb24gc2VwYXJhdGUgbGluZSBpbiByb21hbiBmb250LCBzdGFydGluZyBhdCBzdGFuZGFyZCBwYWdlIG1hcmdpbgorCislIFRoaXMgcmVjb3JkcyB0aGUgYW1vdW50IG9mIGluZGVudCBpbiB0aGUgaW5uZXJtb3N0IGVudmlyb25tZW50LgorJSBUaGF0J3MgaG93IG11Y2ggXGV4ZGVudCBzaG91bGQgdGFrZSBvdXQuCitcbmV3c2tpcFxleGRlbnRhbW91bnQKKworJSBUaGlzIGRlZm4gaXMgdXNlZCBpbnNpZGUgZmlsbCBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZGVmdW4uCitccGFyc2VhcmdkZWZcZXhkZW50e1xoZmlsXGJyZWFrXGhib3h7XGtlcm4gLVxleGRlbnRhbW91bnR7XHJtIzF9fVxoZmlsXGJyZWFrfQorCislIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBub2ZpbGwgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGV4YW1wbGUuCitccGFyc2VhcmdkZWZcbm9maWxsZXhkZW50e3tcYWR2YW5jZSBcbGVmdHNraXAgYnkgLVxleGRlbnRhbW91bnQKKyAgXGxlZnRsaW5le1xoc2tpcFxsZWZ0c2tpcHtccm0jMX19fX0KKworJSBAaW5tYXJnaW57V0hJQ0h9e1RFWFR9IHB1dHMgVEVYVCBpbiB0aGUgV0hJQ0ggbWFyZ2luIG5leHQgdG8gdGhlIGN1cnJlbnQKKyUgcGFyYWdyYXBoLiAgRm9yIG1vcmUgZ2VuZXJhbCBwdXJwb3NlcywgdXNlIHRoZSBcbWFyZ2luIGluc2VydGlvbgorJSBjbGFzcy4gIFdISUNIIGlzIGBsJyBvciBgcicuCislCitcbmV3c2tpcFxpbm1hcmdpbnNwYWNpbmcgXGlubWFyZ2luc3BhY2luZz0xY20KK1xkZWZcc3RydXRkZXB0aHtcZHBcc3RydXRib3h9CislCitcZGVmXGRvaW5tYXJnaW4jMSMye1xzdHJ1dFx2YWRqdXN0eyUKKyAgXG5vYnJlYWsKKyAgXGtlcm4tXHN0cnV0ZGVwdGgKKyAgXHZ0b3AgdG8gXHN0cnV0ZGVwdGh7JQorICAgIFxiYXNlbGluZXNraXA9XHN0cnV0ZGVwdGgKKyAgICBcdnNzCisgICAgJSBpZiB5b3UgaGF2ZSBtdWx0aXBsZSBsaW5lcyBvZiBzdHVmZiB0byBwdXQgaGVyZSwgeW91J2xsIG5lZWQgdG8KKyAgICAlIG1ha2UgdGhlIHZib3ggeW91cnNlbGYgb2YgdGhlIGFwcHJvcHJpYXRlIHNpemUuCisgICAgXGlmeCMxbCUKKyAgICAgIFxsbGFwe1xpZ25vcmVzcGFjZXMgIzJcaHNraXBcaW5tYXJnaW5zcGFjaW5nfSUKKyAgICBcZWxzZQorICAgICAgXHJsYXB7XGhza2lwXGhzaXplIFxoc2tpcFxpbm1hcmdpbnNwYWNpbmcgXGlnbm9yZXNwYWNlcyAjMn0lCisgICAgXGZpCisgICAgXG51bGwKKyAgfSUKK319CitcZGVmXGlubGVmdG1hcmdpbntcZG9pbm1hcmdpbiBsfQorXGRlZlxpbnJpZ2h0bWFyZ2lue1xkb2lubWFyZ2luIHJ9CislCislIEBpbm1hcmdpbntURVhUIFssIFJJR0hULVRFWFRdfQorJSAoaWYgUklHSFQtVEVYVCBpcyBnaXZlbiwgdXNlIFRFWFQgZm9yIGxlZnQgcGFnZSwgUklHSFQtVEVYVCBmb3IgcmlnaHQ7CislIGVsc2UgdXNlIFRFWFQgZm9yIGJvdGgpLgorJQorXGRlZlxpbm1hcmdpbiMxe1xwYXJzZWlubWFyZ2luICMxLCxcZmluaXNofQorXGRlZlxwYXJzZWlubWFyZ2luIzEsIzIsIzNcZmluaXNoeyUgbm90IHBlcmZlY3QsIGJ1dCBiZXR0ZXIgdGhhbiBub3RoaW5nLgorICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQorICBcaWZkaW1cd2QwID4gMHB0CisgICAgXGRlZlxsZWZ0dGV4dHsjMX0lICBoYXZlIGJvdGggdGV4dHMKKyAgICBcZGVmXHJpZ2h0dGV4dHsjMn0lCisgIFxlbHNlCisgICAgXGRlZlxsZWZ0dGV4dHsjMX0lICBoYXZlIG9ubHkgb25lIHRleHQKKyAgICBcZGVmXHJpZ2h0dGV4dHsjMX0lCisgIFxmaQorICAlCisgIFxpZm9kZFxwYWdlbm8KKyAgICBcZGVmXHRlbXB7XGlucmlnaHRtYXJnaW5ccmlnaHR0ZXh0fSUgb2RkIHBhZ2UgLT4gb3V0c2lkZSBpcyByaWdodCBtYXJnaW4KKyAgXGVsc2UKKyAgICBcZGVmXHRlbXB7XGlubGVmdG1hcmdpblxsZWZ0dGV4dH0lCisgIFxmaQorICBcdGVtcAorfQorCislIEBpbmNsdWRlIGZpbGUgICAgaW5zZXJ0IHRleHQgb2YgdGhhdCBmaWxlIGFzIGlucHV0LgorJQorXGRlZlxpbmNsdWRle1xwYXJzZWFyZ3VzaW5nXGZpbGVuYW1lY2F0Y29kZXNcaW5jbHVkZXp6en0KK1xkZWZcaW5jbHVkZXp6eiMxeyUKKyAgXHB1c2h0aGlzZmlsZXN0YWNrCisgIFxkZWZcdGhpc2ZpbGV7IzF9JQorICB7JQorICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgXGRlZlx0ZW1we1xpbnB1dCAjMSB9JQorICAgIFxleHBhbmRhZnRlcgorICB9XHRlbXAKKyAgXHBvcHRoaXNmaWxlc3RhY2sKK30KK1xkZWZcZmlsZW5hbWVjYXRjb2Rlc3slCisgIFxjYXRjb2RlYFxcPVxvdGhlcgorICBcY2F0Y29kZWB+PVxvdGhlcgorICBcY2F0Y29kZWBePVxvdGhlcgorICBcY2F0Y29kZWBfPVxvdGhlcgorICBcY2F0Y29kZWB8PVxvdGhlcgorICBcY2F0Y29kZWA8PVxvdGhlcgorICBcY2F0Y29kZWA+PVxvdGhlcgorICBcY2F0Y29kZWArPVxvdGhlcgorICBcY2F0Y29kZWAtPVxvdGhlcgorfQorCitcZGVmXHB1c2h0aGlzZmlsZXN0YWNreyUKKyAgXGV4cGFuZGFmdGVyXHB1c2h0aGlzZmlsZXN0YWNrWFxwb3B0aGlzZmlsZXN0YWNrXFN0YWNrVGVybQorfQorXGRlZlxwdXNodGhpc2ZpbGVzdGFja1h7JQorICBcZXhwYW5kYWZ0ZXJccHVzaHRoaXNmaWxlc3RhY2tZXHRoaXNmaWxlXFN0YWNrVGVybQorfQorXGRlZlxwdXNodGhpc2ZpbGVzdGFja1kgIzFcU3RhY2tUZXJtICMyXFN0YWNrVGVybSB7JQorICBcZ2RlZlxwb3B0aGlzZmlsZXN0YWNre1xnZGVmXHRoaXNmaWxleyMxfVxnZGVmXHBvcHRoaXNmaWxlc3RhY2t7IzJ9fSUKK30KKworXGRlZlxwb3B0aGlzZmlsZXN0YWNre1xlcnJ0aGlzZmlsZXN0YWNrZW1wdHl9CitcZGVmXGVycnRoaXNmaWxlc3RhY2tlbXB0eXtcZXJybWVzc2FnZXtJbnRlcm5hbCBlcnJvcjoKKyAgdGhlIHN0YWNrIG9mIGZpbGVuYW1lcyBpcyBlbXB0eS59fQorCitcZGVmXHRoaXNmaWxle30KKworJSBAY2VudGVyIGxpbmUKKyUgb3V0cHV0cyB0aGF0IGxpbmUsIGNlbnRlcmVkLgorJQorXHBhcnNlYXJnZGVmXGNlbnRlcnslCisgIFxpZmhtb2RlCisgICAgXGxldFxuZXh0XGNlbnRlckgKKyAgXGVsc2UKKyAgICBcbGV0XG5leHRcY2VudGVyVgorICBcZmkKKyAgXG5leHR7XGhmaWwgXGlnbm9yZXNwYWNlcyMxXHVuc2tpcCBcaGZpbH0lCit9CitcZGVmXGNlbnRlckgjMXslCisgIHslCisgICAgXGhmaWxcYnJlYWsKKyAgICBcYWR2YW5jZVxoc2l6ZSBieSAtXGxlZnRza2lwCisgICAgXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKKyAgICBcbGluZXsjMX0lCisgICAgXGJyZWFrCisgIH0lCit9CitcZGVmXGNlbnRlclYjMXtcbGluZXtca2VyblxsZWZ0c2tpcCAjMVxrZXJuXHJpZ2h0c2tpcH19CisKKyUgQHNwIG4gICBvdXRwdXRzIG4gbGluZXMgb2YgdmVydGljYWwgc3BhY2UKKworXHBhcnNlYXJnZGVmXHNwe1x2c2tpcCAjMVxiYXNlbGluZXNraXB9CisKKyUgQGNvbW1lbnQgLi4ubGluZSB3aGljaCBpcyBpZ25vcmVkLi4uCislIEBjIGlzIHRoZSBzYW1lIGFzIEBjb21tZW50CislIEBpZ25vcmUgLi4uIEBlbmQgaWdub3JlICBpcyBhbm90aGVyIHdheSB0byB3cml0ZSBhIGNvbW1lbnQKKworXGRlZlxjb21tZW50e1xiZWdpbmdyb3VwIFxjYXRjb2RlYFxeXk09XG90aGVyJQorXGNhdGNvZGVgXEA9XG90aGVyIFxjYXRjb2RlYFx7PVxvdGhlciBcY2F0Y29kZWBcfT1cb3RoZXIlCitcY29tbWVudHh4eH0KK3tcY2F0Y29kZWBcXl5NPVxvdGhlciBcZ2RlZlxjb21tZW50eHh4IzFeXk17XGVuZGdyb3VwfX0KKworXGxldFxjPVxjb21tZW50CisKKyUgQHBhcmFncmFwaGluZGVudCBOQ0hBUlMKKyUgV2UnbGwgdXNlIGVtcyBmb3IgTkNIQVJTLCBjbG9zZSBlbm91Z2guCislIE5DSEFSUyBjYW4gYWxzbyBiZSB0aGUgd29yZCBgYXNpcycgb3IgYG5vbmUnLgorJSBXZSBjYW5ub3QgZmVhc2libHkgaW1wbGVtZW50IEBwYXJhZ3JhcGhpbmRlbnQgYXNpcywgdGhvdWdoLgorJQorXGRlZlxhc2lzd29yZHthc2lzfSAlIG5vIHRyYW5zbGF0aW9uLCB0aGVzZSBhcmUga2V5d29yZHMKK1xkZWZcbm9uZXdvcmR7bm9uZX0KKyUKK1xwYXJzZWFyZ2RlZlxwYXJhZ3JhcGhpbmRlbnR7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcYXNpc3dvcmQKKyAgXGVsc2UKKyAgICBcaWZ4XHRlbXBcbm9uZXdvcmQKKyAgICAgIFxkZWZhdWx0cGFyaW5kZW50ID0gMHB0CisgICAgXGVsc2UKKyAgICAgIFxkZWZhdWx0cGFyaW5kZW50ID0gIzFlbQorICAgIFxmaQorICBcZmkKKyAgXHBhcmluZGVudCA9IFxkZWZhdWx0cGFyaW5kZW50Cit9CisKKyUgQGV4YW1wbGVpbmRlbnQgTkNIQVJTCislIFdlJ2xsIHVzZSBlbXMgZm9yIE5DSEFSUyBsaWtlIEBwYXJhZ3JhcGhpbmRlbnQuCislIEl0IHNlZW1zIEBleGFtcGxlaW5kZW50IGFzaXMgaXNuJ3QgbmVjZXNzYXJ5LCBidXQKKyUgSSBwcmVzZXJ2ZSBpdCB0byBtYWtlIGl0IHNpbWlsYXIgdG8gQHBhcmFncmFwaGluZGVudC4KK1xwYXJzZWFyZ2RlZlxleGFtcGxlaW5kZW50eyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGFzaXN3b3JkCisgIFxlbHNlCisgICAgXGlmeFx0ZW1wXG5vbmV3b3JkCisgICAgICBcbGlzcG5hcnJvd2luZyA9IDBwdAorICAgIFxlbHNlCisgICAgICBcbGlzcG5hcnJvd2luZyA9ICMxZW0KKyAgICBcZmkKKyAgXGZpCit9CisKKyUgQGZpcnN0cGFyYWdyYXBoaW5kZW50IFdPUkQKKyUgSWYgV09SRCBpcyBgbm9uZScsIHRoZW4gc3VwcHJlc3MgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IHBhcmFncmFwaAorJSBhZnRlciBhIHNlY3Rpb24gaGVhZGluZy4gIElmIFdPUkQgaXMgYGluc2VydCcsIHRoZW4gZG8gaW5kZW50IGF0IHN1Y2gKKyUgcGFyYWdyYXBocy4KKyUKKyUgVGhlIHBhcmFncmFwaCBpbmRlbnRhdGlvbiBpcyBzdXBwcmVzc2VkIG9yIG5vdCBieSBjYWxsaW5nCislIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50LCB3aGljaCB0aGUgc2VjdGlvbmluZyBjb21tYW5kcyBkby4KKyUgV2Ugc3dpdGNoIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgYmFjayBhbmQgZm9ydGggYWNjb3JkaW5nIHRvIFdPUkQuCislIEJ5IGRlZmF1bHQsIHdlIHN1cHByZXNzIGluZGVudGF0aW9uLgorJQorXGRlZlxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50e1xkb3N1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnR9CitcZGVmXGluc2VydHdvcmR7aW5zZXJ0fQorJQorXHBhcnNlYXJnZGVmXGZpcnN0cGFyYWdyYXBoaW5kZW50eyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXG5vbmV3b3JkCisgICAgXGxldFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50ID0gXGRvc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudAorICBcZWxzZVxpZnhcdGVtcFxpbnNlcnR3b3JkCisgICAgXGxldFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50ID0gXHJlbGF4CisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEBmaXJzdHBhcmFncmFwaGluZGVudCBvcHRpb24gYFx0ZW1wJ30lCisgIFxmaVxmaQorfQorCislIEhlcmUgaXMgaG93IHdlIGFjdHVhbGx5IHN1cHByZXNzIGluZGVudGF0aW9uLiAgUmVkZWZpbmUgXGV2ZXJ5cGFyIHRvCislIFxrZXJuIGJhY2t3YXJkcyBieSBccGFyaW5kZW50LCBhbmQgdGhlbiByZXNldCBpdHNlbGYgdG8gZW1wdHkuCislCislIFdlIGFsc28gbWFrZSBcaW5kZW50IGl0c2VsZiBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgdW50aWwgdGhlIG5leHQKKyUgcGFyYWdyYXBoLgorJQorXGdkZWZcZG9zdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50eyUKKyAgXGdkZWZcaW5kZW50eyUKKyAgICBccmVzdG9yZWZpcnN0cGFyYWdyYXBoaW5kZW50CisgICAgXGluZGVudAorICB9JQorICBcZ2RlZlxub2luZGVudHslCisgICAgXHJlc3RvcmVmaXJzdHBhcmFncmFwaGluZGVudAorICAgIFxub2luZGVudAorICB9JQorICBcZ2xvYmFsXGV2ZXJ5cGFyID0geyUKKyAgICBca2VybiAtXHBhcmluZGVudAorICAgIFxyZXN0b3JlZmlyc3RwYXJhZ3JhcGhpbmRlbnQKKyAgfSUKK30KKworXGdkZWZccmVzdG9yZWZpcnN0cGFyYWdyYXBoaW5kZW50eyUKKyAgXGdsb2JhbCBcbGV0IFxpbmRlbnQgPSBccHRleGluZGVudAorICBcZ2xvYmFsIFxsZXQgXG5vaW5kZW50ID0gXHB0ZXhub2luZGVudAorICBcZ2xvYmFsIFxldmVyeXBhciA9IHt9JQorfQorCisKKyUgQGFzaXMganVzdCB5aWVsZHMgaXRzIGFyZ3VtZW50LiAgVXNlZCB3aXRoIEB0YWJsZSwgZm9yIGV4YW1wbGUuCislCitcZGVmXGFzaXMjMXsjMX0KKworJSBAbWF0aCBvdXRwdXRzIGl0cyBhcmd1bWVudCBpbiBtYXRoIG1vZGUuCislCislIE9uZSBjb21wbGljYXRpb246IF8gdXN1YWxseSBtZWFucyBzdWJzY3JpcHRzLCBidXQgaXQgY291bGQgYWxzbyBtZWFuCislIGFuIGFjdHVhbCBfIGNoYXJhY3RlciwgYXMgaW4gQG1hdGh7QHZhcntzb21lX3ZhcmlhYmxlfSArIDF9LiAgU28gbWFrZQorJSBfIGFjdGl2ZSwgYW5kIGRpc3Rpbmd1aXNoIGJ5IHNlZWluZyBpZiB0aGUgY3VycmVudCBmYW1pbHkgaXMgXHNsZmFtLAorJSB3aGljaCBpcyB3aGF0IEB2YXIgdXNlcy4KK3sKKyAgXGNhdGNvZGVgXF8gPSBcYWN0aXZlCisgIFxnZGVmXG1hdGh1bmRlcnNjb3JleyUKKyAgICBcY2F0Y29kZWBcXz1cYWN0aXZlCisgICAgXGRlZl97XGlmbnVtXGZhbT1cc2xmYW0gXF9cZWxzZVxzYlxmaX0lCisgIH0KK30KKyUgQW5vdGhlciBjb21wbGljYXRpb246IHdlIHdhbnQgXFwgKGFuZCBAXCkgdG8gb3V0cHV0IGEgXCBjaGFyYWN0ZXIuCislIEZZSSwgcGxhaW4udGV4IHVzZXMgXFwgYXMgYSB0ZW1wb3JhcnkgY29udHJvbCBzZXF1ZW5jZSAod2h5PyksIGJ1dAorJSB0aGlzIGlzIG5vdCBhZHZlcnRpc2VkIGFuZCB3ZSBkb24ndCBjYXJlLiAgVGV4aW5mbyBkb2VzIG5vdAorJSBvdGhlcndpc2UgZGVmaW5lIEBcLgorJQorJSBUaGUgXG1hdGhjaGFyIGlzIGNsYXNzPTA9b3JkaW5hcnksIGZhbWlseT03PXR0ZmFtLCBwb3NpdGlvbj01Qz1cLgorXGRlZlxtYXRoYmFja3NsYXNoe1xpZm51bVxmYW09XHR0ZmFtIFxtYXRoY2hhciIwNzVDIFxlbHNlXGJhY2tzbGFzaCBcZml9CislCitcZGVmXG1hdGh7JQorICBcdGV4CisgIFxtYXRodW5kZXJzY29yZQorICBcbGV0XFwgPSBcbWF0aGJhY2tzbGFzaAorICBcbWF0aGFjdGl2ZQorICAkXGZpbmlzaG1hdGgKK30KK1xkZWZcZmluaXNobWF0aCMxeyMxJFxlbmRncm91cH0gICUgQ2xvc2UgdGhlIGdyb3VwIG9wZW5lZCBieSBcdGV4LgorCislIFNvbWUgYWN0aXZlIGNoYXJhY3RlcnMgKHN1Y2ggYXMgPCkgYXJlIHNwYWNlZCBkaWZmZXJlbnRseSBpbiBtYXRoLgorJSBXZSBoYXZlIHRvIHJlc2V0IHRoZWlyIGRlZmluaXRpb25zIGluIGNhc2UgdGhlIEBtYXRoIHdhcyBhbiBhcmd1bWVudAorJSB0byBhIGNvbW1hbmQgd2hpY2ggc2V0cyB0aGUgY2F0Y29kZXMgKHN1Y2ggYXMgQGl0ZW0gb3IgQHNlY3Rpb24pLgorJQoreworICBcY2F0Y29kZWBeID0gXGFjdGl2ZQorICBcY2F0Y29kZWA8ID0gXGFjdGl2ZQorICBcY2F0Y29kZWA+ID0gXGFjdGl2ZQorICBcY2F0Y29kZWArID0gXGFjdGl2ZQorICBcZ2RlZlxtYXRoYWN0aXZleyUKKyAgICBcbGV0XiA9IFxwdGV4aGF0CisgICAgXGxldDwgPSBccHRleGxlc3MKKyAgICBcbGV0PiA9IFxwdGV4Z3RyCisgICAgXGxldCsgPSBccHRleHBsdXMKKyAgfQorfQorCislIEBidWxsZXQgYW5kIEBtaW51cyBuZWVkIHRoZSBzYW1lIHRyZWF0bWVudCBhcyBAbWF0aCwganVzdCBhYm92ZS4KK1xkZWZcYnVsbGV0eyRccHRleGJ1bGxldCR9CitcZGVmXG1pbnVzeyQtJH0KKworJSBAZG90c3t9IG91dHB1dHMgYW4gZWxsaXBzaXMgdXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KKyUgV2UgZG8gLjVlbSBwZXIgcGVyaW9kIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHNwYWNpbmcgaW4gYSB0eXBld3JpdGVyCislIGZvbnQgYXMgdGhyZWUgYWN0dWFsIHBlcmlvZCBjaGFyYWN0ZXJzLgorJQorXGRlZlxkb3RzeyUKKyAgXGxlYXZldm1vZGUKKyAgXGhib3ggdG8gMS41ZW17JQorICAgIFxoc2tpcCAwcHQgcGx1cyAwLjI1ZmlsCisgICAgLlxoZmlsLlxoZmlsLiUKKyAgICBcaHNraXAgMHB0IHBsdXMgMC41ZmlsCisgIH0lCit9CisKKyUgQGVuZGRvdHN7fSBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgZWxsaXBzaXMuCislCitcZGVmXGVuZGRvdHN7JQorICBcZG90cworICBcc3BhY2VmYWN0b3I9XGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvcgorfQorCislIEBjb21tYXt9IGlzIHNvIGNvbW1hcyBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0ZXh0IHdpdGhvdXQgbWVzc2luZyB1cAorJSBUZXhpbmZvJ3MgcGFyc2luZy4KKyUKK1xsZXRcY29tbWEgPSAsCisKKyUgQHJlZmlsbCBpcyBhIG5vLW9wLgorXGxldFxyZWZpbGw9XHJlbGF4CisKKyUgSWYgd29ya2luZyBvbiBhIGxhcmdlIGRvY3VtZW50IGluIGNoYXB0ZXJzLCBpdCBpcyBjb252ZW5pZW50IHRvCislIGJlIGFibGUgdG8gZGlzYWJsZSBpbmRleGluZywgY3Jvc3MtcmVmZXJlbmNpbmcsIGFuZCBjb250ZW50cywgZm9yIHRlc3QgcnVucy4KKyUgVGhpcyBpcyBkb25lIHdpdGggQG5vdmFsaWRhdGUgKGJlZm9yZSBAc2V0ZmlsZW5hbWUpLgorJQorXG5ld2lmXGlmbGlua3MgXGxpbmtzdHJ1ZSAlIGJ5IGRlZmF1bHQgd2Ugd2FudCB0aGUgYXV4IGZpbGVzLgorXGxldFxub3ZhbGlkYXRlID0gXGxpbmtzZmFsc2UKKworJSBAc2V0ZmlsZW5hbWUgaXMgZG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IHRleGluZm8gZmlsZS4KKyUgU28gb3BlbiBoZXJlIHRoZSBmaWxlcyB3ZSBuZWVkIHRvIGhhdmUgb3BlbiB3aGlsZSByZWFkaW5nIHRoZSBpbnB1dC4KKyUgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWtlIGEgLmZtdCBmaWxlIGZvciB0ZXhpbmZvLgorXGRlZlxzZXRmaWxlbmFtZXslCisgICBcZml4YmFja3NsYXNoICAlIFR1cm4gb2ZmIGhhY2sgdG8gc3dhbGxvdyBgXGlucHV0IHRleGluZm8nLgorICAgXGlmbGlua3MKKyAgICAgXHRyeWF1eGZpbGUKKyAgICAgJSBPcGVuIHRoZSBuZXcgYXV4IGZpbGUuICBUZVggd2lsbCBjbG9zZSBpdCBhdXRvbWF0aWNhbGx5IGF0IGV4aXQuCisgICAgIFxpbW1lZGlhdGVcb3Blbm91dFxhdXhmaWxlPVxqb2JuYW1lLmF1eAorICAgXGZpICUgXG9wZW5pbmRpY2VzIG5lZWRzIHRvIGRvIHNvbWUgd29yayBpbiBhbnkgY2FzZS4KKyAgIFxvcGVuaW5kaWNlcworICAgXGxldFxzZXRmaWxlbmFtZT1cY29tbWVudCAlIElnbm9yZSBleHRyYSBAc2V0ZmlsZW5hbWUgY21kcy4KKyAgICUKKyAgICUgSWYgdGV4aW5mby5jbmYgaXMgcHJlc2VudCBvbiB0aGUgc3lzdGVtLCByZWFkIGl0LgorICAgJSBVc2VmdWwgZm9yIHNpdGUtd2lkZSBAYWZvdXJwYXBlciwgZXRjLgorICAgXG9wZW5pbiAxIHRleGluZm8uY25mCisgICBcaWZlb2YgMSBcZWxzZSBcaW5wdXQgdGV4aW5mby5jbmYgXGZpCisgICBcY2xvc2VpbiAxCisgICAlCisgICBcY29tbWVudCAlIElnbm9yZSB0aGUgYWN0dWFsIGZpbGVuYW1lLgorfQorCislIENhbGxlZCBmcm9tIFxzZXRmaWxlbmFtZS4KKyUKK1xkZWZcb3BlbmluZGljZXN7JQorICBcbmV3aW5kZXh7Y3B9JQorICBcbmV3Y29kZWluZGV4e2ZufSUKKyAgXG5ld2NvZGVpbmRleHt2cn0lCisgIFxuZXdjb2RlaW5kZXh7dHB9JQorICBcbmV3Y29kZWluZGV4e2t5fSUKKyAgXG5ld2NvZGVpbmRleHtwZ30lCit9CisKKyUgQGJ5ZS4KK1xvdXRlclxkZWZcYnlle1xwYWdlYWxpZ25tYWNyb1x0cmFjaW5nc3RhdHM9MVxwdGV4ZW5kfQorCisKK1xtZXNzYWdle3BkZix9CislIGFkb2JlIGBwb3J0YWJsZScgZG9jdW1lbnQgZm9ybWF0CitcbmV3Y291bnRcdGVtcG51bQorXG5ld2NvdW50XGxua2NvdW50CitcbmV3dG9rc1xmaWxlbmFtZQorXG5ld2NvdW50XGZpbGVuYW1lbGVuZ3RoCitcbmV3Y291bnRccGduCitcbmV3dG9rc1x0b2tzQQorXG5ld3Rva3NcdG9rc0IKK1xuZXd0b2tzXHRva3NDCitcbmV3dG9rc1x0b2tzRAorXG5ld2JveFxib3hBCitcbmV3Y291bnRcY291bnRBCitcbmV3aWZcaWZwZGYKK1xuZXdpZlxpZnBkZm1ha2VwYWdlZGVzdAorCislIHdoZW4gcGRmdGV4IGlzIHJ1biBpbiBkdmkgbW9kZSwgXHBkZm91dHB1dCBpcyBkZWZpbmVkIChzbyBccGRmb3V0cHV0PTEKKyUgY2FuIGJlIHNldCkuICBTbyB3ZSB0ZXN0IGZvciBccmVsYXggYW5kIDAgYXMgd2VsbCBhcyBcdW5kZWZpbmVkLAorJSBib3Jyb3dlZCBmcm9tIGlmcGRmLnN0eS4KK1xpZnhccGRmb3V0cHV0XHVuZGVmaW5lZAorXGVsc2UKKyAgXGlmeFxwZGZvdXRwdXRccmVsYXgKKyAgXGVsc2UKKyAgICBcaWZjYXNlXHBkZm91dHB1dAorICAgIFxlbHNlCisgICAgICBccGRmdHJ1ZQorICAgIFxmaQorICBcZmkKK1xmaQorCislIFBERiB1c2VzIFBvc3RTY3JpcHQgc3RyaW5nIGNvbnN0YW50cyBmb3IgdGhlIG5hbWVzIG9mIHhyZWYgdGFyZ2V0cywKKyUgZm9yIGRpc3BsYXkgaW4gdGhlIG91dGxpbmVzLCBhbmQgaW4gb3RoZXIgcGxhY2VzLiAgVGh1cywgd2UgaGF2ZSB0bworJSBkb3VibGUgYW55IGJhY2tzbGFzaGVzLiAgT3RoZXJ3aXNlLCBhIG5hbWUgbGlrZSAiXG5vZGUiIHdpbGwgYmUKKyUgaW50ZXJwcmV0ZWQgYXMgYSBuZXdsaW5lIChcbiksIGZvbGxvd2VkIGJ5IG8sIGQsIGUuICBOb3QgZ29vZC4KKyUgaHR0cDovL3d3dy5udGcubmwvcGlwZXJtYWlsL250Zy1wZGZ0ZXgvMjAwNC1KdWx5LzAwMDY1NC5odG1sCislIChhbmQgcmVsYXRlZCBtZXNzYWdlcywgdGhlIGZpbmFsIG91dGNvbWUgaXMgdGhhdCBpdCBpcyB1cCB0byB0aGUgVGVYCislIHVzZXIgdG8gZG91YmxlIHRoZSBiYWNrc2xhc2hlcyBhbmQgb3RoZXJ3aXNlIG1ha2UgdGhlIHN0cmluZyB2YWxpZCwgc28KKyUgdGhhdCdzIHdoYXQgd2UgZG8pLgorCislIGRvdWJsZSBhY3RpdmUgYmFja3NsYXNoZXMuCislIAore1xjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9XGFjdGl2ZQorIEBnZGVmQGFjdGl2ZWJhY2tzbGFzaGRvdWJsZXslCisgICBAY2F0Y29kZWBAXD1AYWN0aXZlCisgICBAbGV0XD1AZG91YmxlYmFja3NsYXNofQorfQorCislIFRvIGhhbmRsZSBwYXJlbnMsIHdlIG11c3QgYWRvcHQgYSBkaWZmZXJlbnQgYXBwcm9hY2gsIHNpbmNlIHBhcmVucyBhcmUKKyUgbm90IGFjdGl2ZSBjaGFyYWN0ZXJzLiAgaHlwZXJyZWYuZHR4ICh3aGljaCBoYXMgdGhlIHNhbWUgcHJvYmxlbSBhcworJSB1cykgaGFuZGxlcyBpdCB3aXRoIHRoaXMgYW1hemluZyBtYWNybyB0byByZXBsYWNlIHRva2Vucy4gIEkndmUKKyUgdGlua2VyZWQgd2l0aCBpdCBhIGxpdHRsZSBmb3IgdGV4aW5mbywgYnV0IGl0J3MgZGVmaW5pdGVseSBmcm9tIHRoZXJlLgorJSAKKyUgIzEgaXMgdGhlIHRva2VucyB0byByZXBsYWNlLgorJSAjMiBpcyB0aGUgcmVwbGFjZW1lbnQuCislICMzIGlzIHRoZSBjb250cm9sIHNlcXVlbmNlIHdpdGggdGhlIHN0cmluZy4KKyUgCitcZGVmXEh5UHNkU3Vic3QjMSMyIzN7JQorICBcZGVmXEh5UHNkUmVwbGFjZSMjMSMxIyMyXEVORHslCisgICAgIyMxJQorICAgIFxpZnhcXCMjMlxcJQorICAgIFxlbHNlCisgICAgICAjMiUKKyAgICAgIFxIeVJldHVybkFmdGVyRml7JQorICAgICAgICBcSHlQc2RSZXBsYWNlIyMyXEVORAorICAgICAgfSUKKyAgICBcZmkKKyAgfSUKKyAgXHhkZWYjM3tcZXhwYW5kYWZ0ZXJcSHlQc2RSZXBsYWNlIzMjMVxFTkR9JQorfQorXGxvbmdcZGVmXEh5UmV0dXJuQWZ0ZXJGaSMxXGZpe1xmaSMxfQorCislICMxIGlzIGEgY29udHJvbCBzZXF1ZW5jZSBpbiB3aGljaCB0byBkbyB0aGUgcmVwbGFjZW1lbnRzLgorXGRlZlxiYWNrc2xhc2hwYXJlbnMjMXslCisgIFx4ZGVmIzF7IzF9JSByZWRlZmluZSBpdCBhcyBpdHMgZXhwYW5zaW9uOyB0aGUgZGVmaW5pdGlvbiBpcyBzaW1wbHkKKyAgICAgICAgICAgICAlIFxsYXN0bm9kZSB3aGVuIGNhbGxlZCBmcm9tIFxzZXRyZWYgLT4gXHBkZm1rZGVzdC4KKyAgXEh5UHNkU3Vic3R7KH17XHJlYWxiYWNrc2xhc2gofXsjMX0lCisgIFxIeVBzZFN1YnN0eyl9e1xyZWFsYmFja3NsYXNoKX17IzF9JQorfQorCitcaWZwZGYKKyAgXGlucHV0IHBkZmNvbG9yCisgIFxwZGZjYXRhbG9ney9QYWdlTW9kZSAvVXNlT3V0bGluZXN9JQorICBcZGVmXGRvcGRmaW1hZ2UjMSMyIzN7JQorICAgIFxkZWZcaW1hZ2V3aWR0aHsjMn0lCisgICAgXGRlZlxpbWFnZWhlaWdodHsjM30lCisgICAgJSB3aXRob3V0IFxpbW1lZGlhdGUsIHBkZnRleCBzZWcgZmF1bHRzIHdoZW4gdGhlIHNhbWUgaW1hZ2UgaXMKKyAgICAlIGluY2x1ZGVkIHR3aWNlLiAgKFZlcnNpb24gMy4xNDE1OS1wcmUtMS4wLXVub2ZmaWNpYWwtMjAwMTA3MDQuKQorICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uIDwgMTQKKyAgICAgIFxpbW1lZGlhdGVccGRmaW1hZ2UKKyAgICBcZWxzZQorICAgICAgXGltbWVkaWF0ZVxwZGZ4aW1hZ2UKKyAgICBcZmkKKyAgICAgIFxpZnhcZW1wdHlcaW1hZ2V3aWR0aFxlbHNlIHdpZHRoIFxpbWFnZXdpZHRoIFxmaQorICAgICAgXGlmeFxlbXB0eVxpbWFnZWhlaWdodFxlbHNlIGhlaWdodCBcaW1hZ2VoZWlnaHQgXGZpCisgICAgICBcaWZudW1ccGRmdGV4dmVyc2lvbjwxMworICAgICAgICAgIzEucGRmJQorICAgICAgIFxlbHNlCisgICAgICAgICB7IzEucGRmfSUKKyAgICAgICBcZmkKKyAgICBcaWZudW1ccGRmdGV4dmVyc2lvbiA8IDE0IFxlbHNlCisgICAgICBccGRmcmVmeGltYWdlIFxwZGZsYXN0eGltYWdlCisgICAgXGZpfQorICBcZGVmXHBkZm1rZGVzdCMxe3slCisgICAgJSBXZSBoYXZlIHRvIHNldCBkdW1taWVzIHNvIGNvbW1hbmRzIHN1Y2ggYXMgQGNvZGUsIGFuZCBjaGFyYWN0ZXJzCisgICAgJSBzdWNoIGFzIFwsIGFyZW4ndCBleHBhbmRlZCB3aGVuIHByZXNlbnQgaW4gYSBzZWN0aW9uIHRpdGxlLgorICAgIFxhdGR1bW1pZXMKKyAgICBcYWN0aXZlYmFja3NsYXNoZG91YmxlCisgICAgXGRlZlxwZGZkZXN0bmFtZXsjMX0lCisgICAgXGJhY2tzbGFzaHBhcmVuc1xwZGZkZXN0bmFtZQorICAgIFxwZGZkZXN0IG5hbWV7XHBkZmRlc3RuYW1lfSB4eXolCisgIH19JQorICAlCisgICUgdXNlZCB0byBtYXJrIHRhcmdldCBuYW1lczsgbXVzdCBiZSBleHBhbmRhYmxlLgorICBcZGVmXHBkZm1rcGduIzF7IzF9JQorICAlCisgIFxsZXRcbGlua2NvbG9yID0gXEJsdWUgICUgd2FzIEN5YW4sIGJ1dCB0aGF0IHNlZW1zIGxpZ2h0PworICBcZGVmXGVuZGxpbmt7XEJsYWNrXHBkZmVuZGxpbmt9CisgICUgQWRkaW5nIG91dGxpbmVzIHRvIFBERjsgbWFjcm9zIGZvciBjYWxjdWxhdGluZyBzdHJ1Y3R1cmUgb2Ygb3V0bGluZXMKKyAgJSBjb21lIGZyb20gUGV0ciBPbHNhaworICBcZGVmXGV4cG51bWJlciMxe1xleHBhbmRhZnRlclxpZnhcY3NuYW1lIzFcZW5kY3NuYW1lXHJlbGF4IDAlCisgICAgXGVsc2UgXGNzbmFtZSMxXGVuZGNzbmFtZSBcZml9CisgIFxkZWZcYWR2YW5jZW51bWJlciMxe1x0ZW1wbnVtPVxleHBudW1iZXJ7IzF9XHJlbGF4CisgICAgXGFkdmFuY2VcdGVtcG51bSBieSAxCisgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFcZW5kY3NuYW1le1x0aGVcdGVtcG51bX19CisgICUKKyAgJSAjMSBpcyB0aGUgc2VjdGlvbiB0ZXh0LCB3aGljaCBpcyB3aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZQorICAlIG91dGxpbmUgYnkgdGhlIHBkZiB2aWV3ZXIuICAjMiBpcyB0aGUgcGRmIGV4cHJlc3Npb24gZm9yIHRoZSBudW1iZXIKKyAgJSBvZiBzdWJlbnRyaWVzIChvciBlbXB0eSwgZm9yIHN1YnN1YnNlY3Rpb25zKS4gICMzIGlzIHRoZSBub2RlIHRleHQsCisgICUgd2hpY2ggbWlnaHQgYmUgZW1wdHkgaWYgdGhpcyB0b2MgZW50cnkgaGFkIG5vIGNvcnJlc3BvbmRpbmcgbm9kZS4KKyAgJSAjNCBpcyB0aGUgcGFnZSBudW1iZXIKKyAgJQorICBcZGVmXGRvcGRmb3V0bGluZSMxIzIjMyM0eyUKKyAgICAlIEdlbmVyYXRlIGEgbGluayB0byB0aGUgbm9kZSB0ZXh0IGlmIHRoYXQgZXhpc3RzOyBlbHNlLCB1c2UgdGhlCisgICAgJSBwYWdlIG51bWJlci4gIFdlIGNvdWxkIGdlbmVyYXRlIGEgZGVzdGluYXRpb24gZm9yIHRoZSBzZWN0aW9uCisgICAgJSB0ZXh0IGluIHRoZSBjYXNlIHdoZXJlIGEgc2VjdGlvbiBoYXMgbm8gbm9kZSwgYnV0IGl0IGRvZXNuJ3QKKyAgICAlIHNlZW0gd29ydGggdGhlIHRyb3VibGUsIHNpbmNlIG1vc3QgZG9jdW1lbnRzIGFyZSBub3JtYWxseSBzdHJ1Y3R1cmVkLgorICAgIFxkZWZccGRmb3V0bGluZWRlc3R7IzN9JQorICAgIFxpZnhccGRmb3V0bGluZWRlc3RcZW1wdHkKKyAgICAgIFxkZWZccGRmb3V0bGluZWRlc3R7IzR9JQorICAgIFxlbHNlCisgICAgICAlIERvdWJsZWQgYmFja3NsYXNoZXMgaW4gdGhlIG5hbWUuCisgICAgICB7XGFjdGl2ZWJhY2tzbGFzaGRvdWJsZSBceGRlZlxwZGZvdXRsaW5lZGVzdHsjM30lCisgICAgICAgXGJhY2tzbGFzaHBhcmVuc1xwZGZvdXRsaW5lZGVzdH0lCisgICAgXGZpCisgICAgJQorICAgICUgQWxzbyBkb3VibGUgdGhlIGJhY2tzbGFzaGVzIGluIHRoZSBkaXNwbGF5IHN0cmluZy4KKyAgICB7XGFjdGl2ZWJhY2tzbGFzaGRvdWJsZSBceGRlZlxwZGZvdXRsaW5ldGV4dHsjMX0lCisgICAgIFxiYWNrc2xhc2hwYXJlbnNccGRmb3V0bGluZXRleHR9JQorICAgICUKKyAgICBccGRmb3V0bGluZSBnb3RvIG5hbWV7XHBkZm1rcGdue1xwZGZvdXRsaW5lZGVzdH19IzJ7XHBkZm91dGxpbmV0ZXh0fSUKKyAgfQorICAlCisgIFxkZWZccGRmbWFrZW91dGxpbmVzeyUKKyAgICBcYmVnaW5ncm91cAorICAgICAgJSBUaGFuaCdzIGhhY2sgLyBwcm9wZXIgYnJhY2VzIGluIGJvb2ttYXJrcworICAgICAgXGVkZWZcbXlsYnJhY2V7XGlmdHJ1ZSBcc3RyaW5ne1xlbHNlfVxmaX1cbGV0XHs9XG15bGJyYWNlCisgICAgICBcZWRlZlxteXJicmFjZXtcaWZmYWxzZXtcZWxzZVxzdHJpbmd9XGZpfVxsZXRcfT1cbXlyYnJhY2UKKyAgICAgICUKKyAgICAgICUgUmVhZCB0b2Mgc2lsZW50bHksIHRvIGdldCBjb3VudHMgb2Ygc3ViZW50cmllcyBmb3IgXHBkZm91dGxpbmUuCisgICAgICBcZGVmXG51bWNoYXBlbnRyeSMjMSMjMiMjMyMjNHslCisJXGRlZlx0aGlzY2hhcG51bXsjIzJ9JQorCVxkZWZcdGhpc3NlY251bXswfSUKKwlcZGVmXHRoaXNzdWJzZWNudW17MH0lCisgICAgICB9JQorICAgICAgXGRlZlxudW1zZWNlbnRyeSMjMSMjMiMjMyMjNHslCisJXGFkdmFuY2VudW1iZXJ7Y2hhcFx0aGlzY2hhcG51bX0lCisJXGRlZlx0aGlzc2VjbnVteyMjMn0lCisJXGRlZlx0aGlzc3Vic2VjbnVtezB9JQorICAgICAgfSUKKyAgICAgIFxkZWZcbnVtc3Vic2VjZW50cnkjIzEjIzIjIzMjIzR7JQorCVxhZHZhbmNlbnVtYmVye3NlY1x0aGlzc2VjbnVtfSUKKwlcZGVmXHRoaXNzdWJzZWNudW17IyMyfSUKKyAgICAgIH0lCisgICAgICBcZGVmXG51bXN1YnN1YnNlY2VudHJ5IyMxIyMyIyMzIyM0eyUKKwlcYWR2YW5jZW51bWJlcntzdWJzZWNcdGhpc3N1YnNlY251bX0lCisgICAgICB9JQorICAgICAgXGRlZlx0aGlzY2hhcG51bXswfSUKKyAgICAgIFxkZWZcdGhpc3NlY251bXswfSUKKyAgICAgIFxkZWZcdGhpc3N1YnNlY251bXswfSUKKyAgICAgICUKKyAgICAgICUgdXNlIFxkZWYgcmF0aGVyIHRoYW4gXGxldCBoZXJlIGJlY2F1c2Ugd2UgcmVkZWZpbmUgXGNoYXBlbnRyeSBldAorICAgICAgJSBhbC4gYSBzZWNvbmQgdGltZSwgYmVsb3cuCisgICAgICBcZGVmXGFwcGVudHJ5e1xudW1jaGFwZW50cnl9JQorICAgICAgXGRlZlxhcHBzZWNlbnRyeXtcbnVtc2VjZW50cnl9JQorICAgICAgXGRlZlxhcHBzdWJzZWNlbnRyeXtcbnVtc3Vic2VjZW50cnl9JQorICAgICAgXGRlZlxhcHBzdWJzdWJzZWNlbnRyeXtcbnVtc3Vic3Vic2VjZW50cnl9JQorICAgICAgXGRlZlx1bm5jaGFwZW50cnl7XG51bWNoYXBlbnRyeX0lCisgICAgICBcZGVmXHVubnNlY2VudHJ5e1xudW1zZWNlbnRyeX0lCisgICAgICBcZGVmXHVubnN1YnNlY2VudHJ5e1xudW1zdWJzZWNlbnRyeX0lCisgICAgICBcZGVmXHVubnN1YnN1YnNlY2VudHJ5e1xudW1zdWJzdWJzZWNlbnRyeX0lCisgICAgICBccmVhZGRhdGFmaWxle3RvY30lCisgICAgICAlCisgICAgICAlIFJlYWQgdG9jIHNlY29uZCB0aW1lLCB0aGlzIHRpbWUgYWN0dWFsbHkgcHJvZHVjaW5nIHRoZSBvdXRsaW5lcy4KKyAgICAgICUgVGhlIGAtJyBtZWFucyB0YWtlIHRoZSBcZXhwbnVtYmVyIGFzIHRoZSBhYnNvbHV0ZSBudW1iZXIgb2YKKyAgICAgICUgc3ViZW50cmllcywgd2hpY2ggd2UgY2FsY3VsYXRlZCBvbiBvdXIgZmlyc3QgcmVhZCBvZiB0aGUgLnRvYyBhYm92ZS4KKyAgICAgICUKKyAgICAgICUgV2UgdXNlIHRoZSBub2RlIG5hbWVzIGFzIHRoZSBkZXN0aW5hdGlvbnMuCisgICAgICBcZGVmXG51bWNoYXBlbnRyeSMjMSMjMiMjMyMjNHslCisgICAgICAgIFxkb3BkZm91dGxpbmV7IyMxfXtjb3VudC1cZXhwbnVtYmVye2NoYXAjIzJ9fXsjIzN9eyMjNH19JQorICAgICAgXGRlZlxudW1zZWNlbnRyeSMjMSMjMiMjMyMjNHslCisgICAgICAgIFxkb3BkZm91dGxpbmV7IyMxfXtjb3VudC1cZXhwbnVtYmVye3NlYyMjMn19eyMjM317IyM0fX0lCisgICAgICBcZGVmXG51bXN1YnNlY2VudHJ5IyMxIyMyIyMzIyM0eyUKKyAgICAgICAgXGRvcGRmb3V0bGluZXsjIzF9e2NvdW50LVxleHBudW1iZXJ7c3Vic2VjIyMyfX17IyMzfXsjIzR9fSUKKyAgICAgIFxkZWZcbnVtc3Vic3Vic2VjZW50cnkjIzEjIzIjIzMjIzR7JSBjb3VudCBpcyBhbHdheXMgemVybworICAgICAgICBcZG9wZGZvdXRsaW5leyMjMX17fXsjIzN9eyMjNH19JQorICAgICAgJQorICAgICAgJSBQREYgb3V0bGluZXMgYXJlIGRpc3BsYXllZCB1c2luZyBzeXN0ZW0gZm9udHMsIGluc3RlYWQgb2YKKyAgICAgICUgZG9jdW1lbnQgZm9udHMuICBUaGVyZWZvcmUgd2UgY2Fubm90IHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMsCisgICAgICAlIHNpbmNlIHRoZSBlbmNvZGluZyBpcyB1bmtub3duLiAgRm9yIGV4YW1wbGUsIHRoZSBlb2dvbmVrIGZyb20KKyAgICAgICUgTGF0aW4gMiAoMHhlYSkgZ2V0cyB0cmFuc2xhdGVkIHRvIGEgfCBjaGFyYWN0ZXIuICBJbmZvIGZyb20KKyAgICAgICUgU3Rhc3playBXYXdyeWtpZXdpY3osIDE5IEphbiAyMDA0IDA0OjA5OjI0ICswMTAwLgorICAgICAgJQorICAgICAgJSB4eCB0byBkbyB0aGlzIHJpZ2h0LCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSA4LWJpdCBjaGFyYWN0ZXJzIHRvCisgICAgICAlIHRoZWlyICJiZXN0IiBlcXVpdmFsZW50LCBiYXNlZCBvbiB0aGUgQGRvY3VtZW50ZW5jb2RpbmcuICBSaWdodAorICAgICAgJSBub3csIEkgZ3Vlc3Mgd2UnbGwganVzdCBsZXQgdGhlIHBkZiByZWFkZXIgaGF2ZSBpdHMgd2F5LgorICAgICAgXGluZGV4bm9mb250cworICAgICAgXHNldHVwZGF0YWZpbGUKKyAgICAgIFxjYXRjb2RlYFxcPVxhY3RpdmUgXG90aGVyYmFja3NsYXNoCisgICAgICBcaW5wdXQgXGpvYm5hbWUudG9jCisgICAgXGVuZGdyb3VwCisgIH0KKyAgJQorICBcZGVmXHNraXBzcGFjZXMjMXtcZGVmXFBQeyMxfVxkZWZcRHt8fSUKKyAgICBcaWZ4XFBQXERcbGV0XG5leHRzcFxyZWxheAorICAgIFxlbHNlXGxldFxuZXh0c3Bcc2tpcHNwYWNlcworICAgICAgXGlmeFxwXHNwYWNlXGVsc2VcYWRkdG9rZW5ze1xmaWxlbmFtZX17XFBQfSUKKyAgICAgICAgXGFkdmFuY2VcZmlsZW5hbWVsZW5ndGggYnkgMQorICAgICAgXGZpCisgICAgXGZpCisgICAgXG5leHRzcH0KKyAgXGRlZlxnZXRmaWxlbmFtZSMxe1xmaWxlbmFtZWxlbmd0aD0wXGV4cGFuZGFmdGVyXHNraXBzcGFjZXMjMXxccmVsYXh9CisgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uIDwgMTQKKyAgICBcbGV0IFxzdGFydGxpbmsgXHBkZmFubm90bGluaworICBcZWxzZQorICAgIFxsZXQgXHN0YXJ0bGluayBccGRmc3RhcnRsaW5rCisgIFxmaQorICAlIG1ha2UgYSBsaXZlIHVybCBpbiBwZGYgb3V0cHV0LgorICBcZGVmXHBkZnVybCMxeyUKKyAgICBcYmVnaW5ncm91cAorICAgICAgJSBpdCBzZWVtcyB3ZSByZWFsbHkgbmVlZCB5ZXQgYW5vdGhlciBzZXQgb2YgZHVtbWllczsgaGF2ZSBub3QKKyAgICAgICUgdHJpZWQgdG8gZmlndXJlIG91dCB3aGF0IGVhY2ggY29tbWFuZCBzaG91bGQgZG8gaW4gdGhlIGNvbnRleHQKKyAgICAgICUgb2YgQHVybC4gIGZvciBub3csIGp1c3QgbWFrZSBALyBhIG5vLW9wLCB0aGF0J3MgdGhlIG9ubHkgb25lCisgICAgICAlIHBlb3BsZSBoYXZlIGFjdHVhbGx5IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoLgorICAgICAgJSAKKyAgICAgIFxub3JtYWx0dXJub2ZmYWN0aXZlCisgICAgICBcZGVmXEB7QH0lCisgICAgICBcbGV0XC89XGVtcHR5CisgICAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgICAgXGxlYXZldm1vZGVcUmVkCisgICAgICBcc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSUKKyAgICAgICAgdXNlcnsvU3VidHlwZSAvTGluayAvQSA8PCAvUyAvVVJJIC9VUkkgKCMxKSA+Pn0lCisgICAgXGVuZGdyb3VwfQorICBcZGVmXHBkZmdldHRva3MjMS57XHNldGJveFxib3hBPVxoYm94e1x0b2tzQT17IzEufVx0b2tzQj17fVxtYWtldG9rc319CisgIFxkZWZcYWRkdG9rZW5zIzEjMntcZWRlZlxhZGR0b2tze1xub2V4cGFuZCMxPXtcdGhlIzEjMn19XGFkZHRva3N9CisgIFxkZWZcYWRuIzF7XGFkZHRva2Vuc3tcdG9rc0N9eyMxfVxnbG9iYWxcY291bnRBPTFcbGV0XG5leHQ9XG1ha2V0b2tzfQorICBcZGVmXHBvcHRva3MjMSMyfEVORFRPS1N8e1xsZXRcZmlyc3Q9IzFcdG9rc0Q9eyMxfVx0b2tzQT17IzJ9fQorICBcZGVmXG1ha2V0b2tzeyUKKyAgICBcZXhwYW5kYWZ0ZXJccG9wdG9rc1x0aGVcdG9rc0F8RU5EVE9LU3xccmVsYXgKKyAgICBcaWZ4XGZpcnN0MFxhZG4wCisgICAgXGVsc2VcaWZ4XGZpcnN0MVxhZG4xIFxlbHNlXGlmeFxmaXJzdDJcYWRuMiBcZWxzZVxpZnhcZmlyc3QzXGFkbjMKKyAgICBcZWxzZVxpZnhcZmlyc3Q0XGFkbjQgXGVsc2VcaWZ4XGZpcnN0NVxhZG41IFxlbHNlXGlmeFxmaXJzdDZcYWRuNgorICAgIFxlbHNlXGlmeFxmaXJzdDdcYWRuNyBcZWxzZVxpZnhcZmlyc3Q4XGFkbjggXGVsc2VcaWZ4XGZpcnN0OVxhZG45CisgICAgXGVsc2UKKyAgICAgIFxpZm51bTA9XGNvdW50QVxlbHNlXG1ha2VsaW5rXGZpCisgICAgICBcaWZ4XGZpcnN0LlxsZXRcbmV4dD1cZG9uZVxlbHNlCisgICAgICAgIFxsZXRcbmV4dD1cbWFrZXRva3MKKyAgICAgICAgXGFkZHRva2Vuc3tcdG9rc0J9e1x0aGVcdG9rc0R9CisgICAgICAgIFxpZnhcZmlyc3QsXGFkZHRva2Vuc3tcdG9rc0J9e1xzcGFjZX1cZmkKKyAgICAgIFxmaQorICAgIFxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaQorICAgIFxuZXh0fQorICBcZGVmXG1ha2VsaW5re1xhZGR0b2tlbnN7XHRva3NCfSUKKyAgICB7XG5vZXhwYW5kXHBkZmxpbmt7XHRoZVx0b2tzQ319XHRva3NDPXt9XGdsb2JhbFxjb3VudEE9MH0KKyAgXGRlZlxwZGZsaW5rIzF7JQorICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19IGdvdG8gbmFtZXtccGRmbWtwZ257IzF9fQorICAgIFxsaW5rY29sb3IgIzFcZW5kbGlua30KKyAgXGRlZlxkb25le1xlZGVmXHN0e1xnbG9iYWxcbm9leHBhbmRcdG9rc0E9e1x0aGVcdG9rc0J9fVxzdH0KK1xlbHNlCisgIFxsZXRccGRmbWtkZXN0ID0gXGdvYmJsZQorICBcbGV0XHBkZnVybCA9IFxnb2JibGUKKyAgXGxldFxlbmRsaW5rID0gXHJlbGF4CisgIFxsZXRcbGlua2NvbG9yID0gXHJlbGF4CisgIFxsZXRccGRmbWFrZW91dGxpbmVzID0gXHJlbGF4CitcZmkgICUgXGlmeFxwZGZvdXRwdXQKKworCitcbWVzc2FnZXtmb250cyx9CisKKyUgQ2hhbmdlIHRoZSBjdXJyZW50IGZvbnQgc3R5bGUgdG8gIzEsIHJlbWVtYmVyaW5nIGl0IGluIFxjdXJmb250c3R5bGUuCislIEZvciBub3csIHdlIGRvIG5vdCBhY2N1bXVsYXRlIGZvbnQgc3R5bGVzOiBAYntAaXtmb299fSBwcmludHMgZm9vIGluCislIGl0YWxpY3MsIG5vdCBib2xkIGl0YWxpY3MuCislCitcZGVmXHNldGZvbnRzdHlsZSMxeyUKKyAgXGRlZlxjdXJmb250c3R5bGV7IzF9JSBub3QgYXMgYSBjb250cm9sIHNlcXVlbmNlLCBiZWNhdXNlIHdlIGFyZSBcZWRlZidkLgorICBcY3NuYW1lIHRlbiMxXGVuZGNzbmFtZSAgJSBjaGFuZ2UgdGhlIGN1cnJlbnQgZm9udAorfQorCislIFNlbGVjdCAjMSBmb250cyB3aXRoIHRoZSBjdXJyZW50IHN0eWxlLgorJQorXGRlZlxzZWxlY3Rmb250cyMxe1xjc25hbWUgIzFmb250c1xlbmRjc25hbWUgXGNzbmFtZVxjdXJmb250c3R5bGVcZW5kY3NuYW1lfQorCitcZGVmXHJte1xmYW09MCBcc2V0Zm9udHN0eWxle3JtfX0KK1xkZWZcaXR7XGZhbT1caXRmYW0gXHNldGZvbnRzdHlsZXtpdH19CitcZGVmXHNse1xmYW09XHNsZmFtIFxzZXRmb250c3R5bGV7c2x9fQorXGRlZlxiZntcZmFtPVxiZmZhbSBcc2V0Zm9udHN0eWxle2JmfX1cZGVmXGJmc3R5bGVuYW1le2JmfQorXGRlZlx0dHtcZmFtPVx0dGZhbSBcc2V0Zm9udHN0eWxle3R0fX0KKworJSBUZXhpbmZvIHNvcnQgb2Ygc3VwcG9ydHMgdGhlIHNhbnMgc2VyaWYgZm9udCBzdHlsZSwgd2hpY2ggcGxhaW4gVGVYIGRvZXMgbm90LgorJSBTbyB3ZSBzZXQgdXAgYSBcc2YuCitcbmV3ZmFtXHNmZmFtCitcZGVmXHNme1xmYW09XHNmZmFtIFxzZXRmb250c3R5bGV7c2Z9fQorXGxldFxsaSA9IFxzZiAlIFNvbWV0aW1lcyB3ZSBjYWxsIGl0IFxsaSwgbm90IFxzZi4KKworJSBXZSBkb24ndCBuZWVkIG1hdGggZm9yIHRoaXMgZm9udCBzdHlsZS4KK1xkZWZcdHRzbHtcc2V0Zm9udHN0eWxle3R0c2x9fQorCislIERlZmF1bHQgbGVhZGluZy4KK1xuZXdkaW1lblx0ZXh0bGVhZGluZyAgXHRleHRsZWFkaW5nID0gMTMuMnB0CisKKyUgU2V0IHRoZSBiYXNlbGluZXNraXAgdG8gIzEsIGFuZCB0aGUgbGluZXNraXAgYW5kIHN0cnV0IHNpemUKKyUgY29ycmVzcG9uZGluZ2x5LiAgVGhlcmUgaXMgbm8gZGVlcCBtZWFuaW5nIGJlaGluZCB0aGVzZSBtYWdpYyBudW1iZXJzCislIHVzZWQgYXMgZmFjdG9yczsgdGhleSBqdXN0IG1hdGNoIChjbG9zZWx5IGVub3VnaCkgd2hhdCBLbnV0aCBkZWZpbmVkLgorJQorXGRlZlxsaW5lc2tpcGZhY3RvcnsuMDgzMzN9CitcZGVmXHN0cnV0aGVpZ2h0cGVyY2VudHsuNzA4MzN9CitcZGVmXHN0cnV0ZGVwdGhwZXJjZW50IHsuMjkxNjd9CislCitcZGVmXHNldGxlYWRpbmcjMXslCisgIFxub3JtYWxiYXNlbGluZXNraXAgPSAjMVxyZWxheAorICBcbm9ybWFsbGluZXNraXAgPSBcbGluZXNraXBmYWN0b3Jcbm9ybWFsYmFzZWxpbmVza2lwCisgIFxub3JtYWxiYXNlbGluZXMKKyAgXHNldGJveFxzdHJ1dGJveCA9XGhib3h7JQorICAgIFx2cnVsZSB3aWR0aDBwdCBoZWlnaHRcc3RydXRoZWlnaHRwZXJjZW50XGJhc2VsaW5lc2tpcAorICAgICAgICAgICAgICAgICAgICBkZXB0aCBcc3RydXRkZXB0aHBlcmNlbnQgXGJhc2VsaW5lc2tpcAorICB9JQorfQorCislIFNldCB0aGUgZm9udCBtYWNybyAjMSB0byB0aGUgZm9udCBuYW1lZCAjMiwgYWRkaW5nIG9uIHRoZQorJSBzcGVjaWZpZWQgZm9udCBwcmVmaXggKG5vcm1hbGx5IGBjbScpLgorJSAjMyBpcyB0aGUgZm9udCdzIGRlc2lnbiBzaXplLCAjNCBpcyBhIHNjYWxlIGZhY3RvcgorXGRlZlxzZXRmb250IzEjMiMzIzR7XGZvbnQjMT1cZm9udHByZWZpeCMyIzMgc2NhbGVkICM0fQorCislIFVzZSBjbSBhcyB0aGUgZGVmYXVsdCBmb250IHByZWZpeC4KKyUgVG8gc3BlY2lmeSB0aGUgZm9udCBwcmVmaXgsIHlvdSBtdXN0IGRlZmluZSBcZm9udHByZWZpeAorJSBiZWZvcmUgeW91IHJlYWQgaW4gdGV4aW5mby50ZXguCitcaWZ4XGZvbnRwcmVmaXhcdW5kZWZpbmVkCitcZGVmXGZvbnRwcmVmaXh7Y219CitcZmkKKyUgU3VwcG9ydCBmb250IGZhbWlsaWVzIHRoYXQgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUgYXMgQ00uCitcZGVmXHJtc2hhcGV7cn0KK1xkZWZccm1ic2hhcGV7Ynh9ICAgICAgICAgICAgICAgJXdoZXJlIHRoZSBub3JtYWwgZmFjZSBpcyBib2xkCitcZGVmXGJmc2hhcGV7Yn0KK1xkZWZcYnhzaGFwZXtieH0KK1xkZWZcdHRzaGFwZXt0dH0KK1xkZWZcdHRic2hhcGV7dHR9CitcZGVmXHR0c2xzaGFwZXtzbHR0fQorXGRlZlxpdHNoYXBle3RpfQorXGRlZlxpdGJzaGFwZXtieHRpfQorXGRlZlxzbHNoYXBle3NsfQorXGRlZlxzbGJzaGFwZXtieHNsfQorXGRlZlxzZnNoYXBle3NzfQorXGRlZlxzZmJzaGFwZXtzc30KK1xkZWZcc2NzaGFwZXtjc2N9CitcZGVmXHNjYnNoYXBle2NzY30KKworJSBUZXh0IGZvbnRzICgxMS4ycHQsIG1hZ3N0ZXAxKS4KK1xkZWZcdGV4dG5vbWluYWxzaXplezExcHR9CitcZWRlZlxtYWlubWFnc3RlcHtcbWFnc3RlcGhhbGZ9Citcc2V0Zm9udFx0ZXh0cm1ccm1zaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dHR0XHR0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRiZlxiZnNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0aXRcaXRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dHNsXHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRzZlxzZnNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0c2Ncc2NzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dHR0c2xcdHRzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9CitcZm9udFx0ZXh0aT1jbW1pMTAgc2NhbGVkIFxtYWlubWFnc3RlcAorXGZvbnRcdGV4dHN5PWNtc3kxMCBzY2FsZWQgXG1haW5tYWdzdGVwCisKKyUgQSBmZXcgZm9udHMgZm9yIEBkZWZ1biBuYW1lcyBhbmQgYXJncy4KK1xzZXRmb250XGRlZmJmXGJmc2hhcGV7MTB9e1xtYWdzdGVwMX0KK1xzZXRmb250XGRlZnR0XHR0c2hhcGV7MTB9e1xtYWdzdGVwMX0KK1xzZXRmb250XGRlZnR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDF9CitcZGVmXGRme1xsZXRcdGVudHQ9XGRlZnR0IFxsZXRcdGVuYmYgPSBcZGVmYmYgXGxldFx0ZW50dHNsPVxkZWZ0dHNsIFxiZn0KKworJSBGb250cyBmb3IgaW5kaWNlcywgZm9vdG5vdGVzLCBzbWFsbCBleGFtcGxlcyAoOXB0KS4KK1xkZWZcc21hbGxub21pbmFsc2l6ZXs5cHR9Citcc2V0Zm9udFxzbWFsbHJtXHJtc2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsdHRcdHRzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGxiZlxiZnNoYXBlezEwfXs5MDB9Citcc2V0Zm9udFxzbWFsbGl0XGl0c2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsc2xcc2xzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGxzZlxzZnNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbHNjXHNjc2hhcGV7MTB9ezkwMH0KK1xzZXRmb250XHNtYWxsdHRzbFx0dHNsc2hhcGV7MTB9ezkwMH0KK1xmb250XHNtYWxsaT1jbW1pOQorXGZvbnRcc21hbGxzeT1jbXN5OQorCislIEZvbnRzIGZvciBzbWFsbCBleGFtcGxlcyAoOHB0KS4KK1xkZWZcc21hbGxlcm5vbWluYWxzaXplezhwdH0KK1xzZXRmb250XHNtYWxsZXJybVxybXNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVydHRcdHRzaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcmJmXGJmc2hhcGV7MTB9ezgwMH0KK1xzZXRmb250XHNtYWxsZXJpdFxpdHNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVyc2xcc2xzaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcnNmXHNmc2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJzY1xzY3NoYXBlezEwfXs4MDB9Citcc2V0Zm9udFxzbWFsbGVydHRzbFx0dHNsc2hhcGV7MTB9ezgwMH0KK1xmb250XHNtYWxsZXJpPWNtbWk4CitcZm9udFxzbWFsbGVyc3k9Y21zeTgKKworJSBGb250cyBmb3IgdGl0bGUgcGFnZSAoMjAuNHB0KToKK1xkZWZcdGl0bGVub21pbmFsc2l6ZXsyMHB0fQorXHNldGZvbnRcdGl0bGVybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAzfQorXHNldGZvbnRcdGl0bGVpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXA0fQorXHNldGZvbnRcdGl0bGVzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXA0fQorXHNldGZvbnRcdGl0bGV0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAzfQorXHNldGZvbnRcdGl0bGV0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXA0fQorXHNldGZvbnRcdGl0bGVzZlxzZmJzaGFwZXsxN317XG1hZ3N0ZXAxfQorXGxldFx0aXRsZWJmPVx0aXRsZXJtCitcc2V0Zm9udFx0aXRsZXNjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDR9CitcZm9udFx0aXRsZWk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDMKK1xmb250XHRpdGxlc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDQKK1xkZWZcYXV0aG9ycm17XHNlY3JtfQorXGRlZlxhdXRob3J0dHtcc2VjdHR9CisKKyUgQ2hhcHRlciAoYW5kIHVubnVtYmVyZWQpIGZvbnRzICgxNy4yOHB0KS4KK1xkZWZcY2hhcG5vbWluYWxzaXplezE3cHR9Citcc2V0Zm9udFxjaGFwcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwMn0KK1xzZXRmb250XGNoYXBpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQorXHNldGZvbnRcY2hhcHNsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDN9Citcc2V0Zm9udFxjaGFwdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMn0KK1xzZXRmb250XGNoYXB0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAzfQorXHNldGZvbnRcY2hhcHNmXHNmYnNoYXBlezE3fXsxMDAwfQorXGxldFxjaGFwYmY9XGNoYXBybQorXHNldGZvbnRcY2hhcHNjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDN9CitcZm9udFxjaGFwaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMgorXGZvbnRcY2hhcHN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXAzCisKKyUgU2VjdGlvbiBmb250cyAoMTQuNHB0KS4KK1xkZWZcc2Vjbm9taW5hbHNpemV7MTRwdH0KK1xzZXRmb250XHNlY3JtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxzZWNpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAyfQorXHNldGZvbnRcc2Vjc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwMn0KK1xzZXRmb250XHNlY3R0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxzZWN0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAyfQorXHNldGZvbnRcc2Vjc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwMX0KK1xsZXRcc2VjYmZcc2Vjcm0KK1xzZXRmb250XHNlY3NjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDJ9CitcZm9udFxzZWNpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAxCitcZm9udFxzZWNzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMgorCislIFN1YnNlY3Rpb24gZm9udHMgKDEzLjE1cHQpLgorXGRlZlxzc2Vjbm9taW5hbHNpemV7MTNwdH0KK1xzZXRmb250XHNzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcc3NlY2l0XGl0YnNoYXBlezEwfXsxMzE1fQorXHNldGZvbnRcc3NlY3NsXHNsYnNoYXBlezEwfXsxMzE1fQorXHNldGZvbnRcc3NlY3R0XHR0YnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Citcc2V0Zm9udFxzc2VjdHRzbFx0dHNsc2hhcGV7MTB9ezEzMTV9Citcc2V0Zm9udFxzc2Vjc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KK1xsZXRcc3NlY2JmXHNzZWNybQorXHNldGZvbnRcc3NlY3NjXHNjYnNoYXBlezEwfXsxMzE1fQorXGZvbnRcc3NlY2k9Y21taTEyIHNjYWxlZCBcbWFnc3RlcGhhbGYKK1xmb250XHNzZWNzeT1jbXN5MTAgc2NhbGVkIDEzMTUKKworJSBSZWR1Y2VkIGZvbnRzIGZvciBAYWNybyBpbiB0ZXh0ICgxMHB0KS4KK1xkZWZccmVkdWNlZG5vbWluYWxzaXplezEwcHR9Citcc2V0Zm9udFxyZWR1Y2Vkcm1ccm1zaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWR0dFx0dHNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZGJmXGJmc2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2VkaXRcaXRzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRzbFxzbHNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZHNmXHNmc2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2Vkc2Ncc2NzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWR0dHNsXHR0c2xzaGFwZXsxMH17MTAwMH0KK1xmb250XHJlZHVjZWRpPWNtbWkxMAorXGZvbnRccmVkdWNlZHN5PWNtc3kxMAorCislIEluIG9yZGVyIGZvciB0aGUgZm9udCBjaGFuZ2VzIHRvIGFmZmVjdCBtb3N0IG1hdGggc3ltYm9scyBhbmQgbGV0dGVycywKKyUgd2UgaGF2ZSB0byBkZWZpbmUgdGhlIFx0ZXh0Zm9udCBvZiB0aGUgc3RhbmRhcmQgZmFtaWxpZXMuICBTaW5jZQorJSB0ZXhpbmZvIGRvZXNuJ3QgYWxsb3cgZm9yIHByb2R1Y2luZyBzdWJzY3JpcHRzIGFuZCBzdXBlcnNjcmlwdHMgZXhjZXB0CislIGluIHRoZSBtYWluIHRleHQsIHdlIGRvbid0IGJvdGhlciB0byByZXNldCBcc2NyaXB0Zm9udCBhbmQKKyUgXHNjcmlwdHNjcmlwdGZvbnQgKHdoaWNoIHdvdWxkIGFsc28gcmVxdWlyZSBsb2FkaW5nIGEgbG90IG1vcmUgZm9udHMpLgorJQorXGRlZlxyZXNldG1hdGhmb250c3slCisgIFx0ZXh0Zm9udDA9XHRlbnJtIFx0ZXh0Zm9udDE9XHRlbmkgXHRleHRmb250Mj1cdGVuc3kKKyAgXHRleHRmb250XGl0ZmFtPVx0ZW5pdCBcdGV4dGZvbnRcc2xmYW09XHRlbnNsIFx0ZXh0Zm9udFxiZmZhbT1cdGVuYmYKKyAgXHRleHRmb250XHR0ZmFtPVx0ZW50dCBcdGV4dGZvbnRcc2ZmYW09XHRlbnNmCit9CisKKyUgVGhlIGZvbnQtY2hhbmdpbmcgY29tbWFuZHMgcmVkZWZpbmUgdGhlIG1lYW5pbmdzIG9mIFx0ZW5TVFlMRSwgaW5zdGVhZAorJSBvZiBqdXN0IFxTVFlMRS4gIFdlIGRvIHRoaXMgYmVjYXVzZSBcU1RZTEUgbmVlZHMgdG8gYWxzbyBzZXQgdGhlCislIGN1cnJlbnQgXGZhbSBmb3IgbWF0aCBtb2RlLiAgT3VyIFxTVFlMRSAoZS5nLiwgXHJtKSBjb21tYW5kcyBoYXJkd2lyZQorJSBcdGVuU1RZTEUgdG8gc2V0IHRoZSBjdXJyZW50IGZvbnQuCislCislIEVhY2ggZm9udC1jaGFuZ2luZyBjb21tYW5kIGFsc28gc2V0cyB0aGUgbmFtZXMgXGxzaXplIChvbmUgc2l6ZSBsb3dlcikKKyUgYW5kIFxsbGxzaXplICh0aHJlZSBzaXplcyBsb3dlcikuICBUaGVzZSByZWxhdGl2ZSBjb21tYW5kcyBhcmUgdXNlZCBpbgorJSB0aGUgTGFUZVggbG9nbyBhbmQgYWNyb255bXMuCislCislIFRoaXMgYWxsIG5lZWRzIGdlbmVyYWxpemluZywgYmFkbHkuCislCitcZGVmXHRleHRmb250c3slCisgIFxsZXRcdGVucm09XHRleHRybSBcbGV0XHRlbml0PVx0ZXh0aXQgXGxldFx0ZW5zbD1cdGV4dHNsCisgIFxsZXRcdGVuYmY9XHRleHRiZiBcbGV0XHRlbnR0PVx0ZXh0dHQgXGxldFxzbWFsbGNhcHM9XHRleHRzYworICBcbGV0XHRlbnNmPVx0ZXh0c2YgXGxldFx0ZW5pPVx0ZXh0aSBcbGV0XHRlbnN5PVx0ZXh0c3kKKyAgXGxldFx0ZW50dHNsPVx0ZXh0dHRzbAorICBcZGVmXGN1cmZvbnRzaXple3RleHR9JQorICBcZGVmXGxzaXple3JlZHVjZWR9XGRlZlxsbGxzaXple3NtYWxsZXJ9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7XHRleHRsZWFkaW5nfX0KK1xkZWZcdGl0bGVmb250c3slCisgIFxsZXRcdGVucm09XHRpdGxlcm0gXGxldFx0ZW5pdD1cdGl0bGVpdCBcbGV0XHRlbnNsPVx0aXRsZXNsCisgIFxsZXRcdGVuYmY9XHRpdGxlYmYgXGxldFx0ZW50dD1cdGl0bGV0dCBcbGV0XHNtYWxsY2Fwcz1cdGl0bGVzYworICBcbGV0XHRlbnNmPVx0aXRsZXNmIFxsZXRcdGVuaT1cdGl0bGVpIFxsZXRcdGVuc3k9XHRpdGxlc3kKKyAgXGxldFx0ZW50dHNsPVx0aXRsZXR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXt0aXRsZX0lCisgIFxkZWZcbHNpemV7Y2hhcH1cZGVmXGxsbHNpemV7c3Vic2VjfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezI1cHR9fQorXGRlZlx0aXRsZWZvbnQjMXt7XHRpdGxlZm9udHNccm0gIzF9fQorXGRlZlxjaGFwZm9udHN7JQorICBcbGV0XHRlbnJtPVxjaGFwcm0gXGxldFx0ZW5pdD1cY2hhcGl0IFxsZXRcdGVuc2w9XGNoYXBzbAorICBcbGV0XHRlbmJmPVxjaGFwYmYgXGxldFx0ZW50dD1cY2hhcHR0IFxsZXRcc21hbGxjYXBzPVxjaGFwc2MKKyAgXGxldFx0ZW5zZj1cY2hhcHNmIFxsZXRcdGVuaT1cY2hhcGkgXGxldFx0ZW5zeT1cY2hhcHN5CisgIFxsZXRcdGVudHRzbD1cY2hhcHR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtjaGFwfSUKKyAgXGRlZlxsc2l6ZXtzZWN9XGRlZlxsbGxzaXple3RleHR9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTlwdH19CitcZGVmXHNlY2ZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cc2Vjcm0gXGxldFx0ZW5pdD1cc2VjaXQgXGxldFx0ZW5zbD1cc2Vjc2wKKyAgXGxldFx0ZW5iZj1cc2VjYmYgXGxldFx0ZW50dD1cc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNlY3NjCisgIFxsZXRcdGVuc2Y9XHNlY3NmIFxsZXRcdGVuaT1cc2VjaSBcbGV0XHRlbnN5PVxzZWNzeQorICBcbGV0XHRlbnR0c2w9XHNlY3R0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtzZWN9JQorICBcZGVmXGxzaXple3N1YnNlY31cZGVmXGxsbHNpemV7cmVkdWNlZH0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxNnB0fX0KK1xkZWZcc3Vic2VjZm9udHN7JQorICBcbGV0XHRlbnJtPVxzc2Vjcm0gXGxldFx0ZW5pdD1cc3NlY2l0IFxsZXRcdGVuc2w9XHNzZWNzbAorICBcbGV0XHRlbmJmPVxzc2VjYmYgXGxldFx0ZW50dD1cc3NlY3R0IFxsZXRcc21hbGxjYXBzPVxzc2Vjc2MKKyAgXGxldFx0ZW5zZj1cc3NlY3NmIFxsZXRcdGVuaT1cc3NlY2kgXGxldFx0ZW5zeT1cc3NlY3N5CisgIFxsZXRcdGVudHRzbD1cc3NlY3R0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtzc2VjfSUKKyAgXGRlZlxsc2l6ZXt0ZXh0fVxkZWZcbGxsc2l6ZXtzbWFsbH0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxNXB0fX0KK1xsZXRcc3Vic3Vic2VjZm9udHMgPSBcc3Vic2VjZm9udHMKK1xkZWZccmVkdWNlZGZvbnRzeyUKKyAgXGxldFx0ZW5ybT1ccmVkdWNlZHJtIFxsZXRcdGVuaXQ9XHJlZHVjZWRpdCBcbGV0XHRlbnNsPVxyZWR1Y2Vkc2wKKyAgXGxldFx0ZW5iZj1ccmVkdWNlZGJmIFxsZXRcdGVudHQ9XHJlZHVjZWR0dCBcbGV0XHJlZHVjZWRjYXBzPVxyZWR1Y2Vkc2MKKyAgXGxldFx0ZW5zZj1ccmVkdWNlZHNmIFxsZXRcdGVuaT1ccmVkdWNlZGkgXGxldFx0ZW5zeT1ccmVkdWNlZHN5CisgIFxsZXRcdGVudHRzbD1ccmVkdWNlZHR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtyZWR1Y2VkfSUKKyAgXGRlZlxsc2l6ZXtzbWFsbH1cZGVmXGxsbHNpemV7c21hbGxlcn0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxMC41cHR9fQorXGRlZlxzbWFsbGZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cc21hbGxybSBcbGV0XHRlbml0PVxzbWFsbGl0IFxsZXRcdGVuc2w9XHNtYWxsc2wKKyAgXGxldFx0ZW5iZj1cc21hbGxiZiBcbGV0XHRlbnR0PVxzbWFsbHR0IFxsZXRcc21hbGxjYXBzPVxzbWFsbHNjCisgIFxsZXRcdGVuc2Y9XHNtYWxsc2YgXGxldFx0ZW5pPVxzbWFsbGkgXGxldFx0ZW5zeT1cc21hbGxzeQorICBcbGV0XHRlbnR0c2w9XHNtYWxsdHRzbAorICBcZGVmXGN1cmZvbnRzaXple3NtYWxsfSUKKyAgXGRlZlxsc2l6ZXtzbWFsbGVyfVxkZWZcbGxsc2l6ZXtzbWFsbGVyfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezEwLjVwdH19CitcZGVmXHNtYWxsZXJmb250c3slCisgIFxsZXRcdGVucm09XHNtYWxsZXJybSBcbGV0XHRlbml0PVxzbWFsbGVyaXQgXGxldFx0ZW5zbD1cc21hbGxlcnNsCisgIFxsZXRcdGVuYmY9XHNtYWxsZXJiZiBcbGV0XHRlbnR0PVxzbWFsbGVydHQgXGxldFxzbWFsbGNhcHM9XHNtYWxsZXJzYworICBcbGV0XHRlbnNmPVxzbWFsbGVyc2YgXGxldFx0ZW5pPVxzbWFsbGVyaSBcbGV0XHRlbnN5PVxzbWFsbGVyc3kKKyAgXGxldFx0ZW50dHNsPVxzbWFsbGVydHRzbAorICBcZGVmXGN1cmZvbnRzaXple3NtYWxsZXJ9JQorICBcZGVmXGxzaXple3NtYWxsZXJ9XGRlZlxsbGxzaXple3NtYWxsZXJ9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7OS41cHR9fQorCislIFNldCB0aGUgZm9udHMgdG8gdXNlIHdpdGggdGhlIEBzbWFsbC4uLiBlbnZpcm9ubWVudHMuCitcbGV0XHNtYWxsZXhhbXBsZWZvbnRzID0gXHNtYWxsZm9udHMKKworJSBBYm91dCBcc21hbGxleGFtcGxlZm9udHMuICBJZiB3ZSB1c2UgXHNtYWxsZm9udHMgKDlwdCksIEBzbWFsbGV4YW1wbGUKKyUgY2FuIGZpdCB0aGlzIG1hbnkgY2hhcmFjdGVyczoKKyUgICA4LjV4MTE9ODYgICBzbWFsbGJvb2s9NzIgIGE0PTkwICBhNT02OQorJSBJZiB3ZSB1c2UgXHNjcmlwdGZvbnRzICg4cHQpLCB0aGVuIHdlIGNhbiBmaXQgdGhpcyBtYW55IGNoYXJhY3RlcnM6CislICAgOC41eDExPTkwKyAgc21hbGxib29rPTgwICBhND05MCsgIGE1PTc3CislIEZvciBtZSwgc3ViamVjdGl2ZWx5LCB0aGUgZmV3IGV4dHJhIGNoYXJhY3RlcnMgdGhhdCBmaXQgYXJlbid0IHdvcnRoCislIHRoZSBhZGRpdGlvbmFsIHNtYWxsbmVzcyBvZiA4cHQuICBTbyBJJ20gbWFraW5nIHRoZSBkZWZhdWx0IDlwdC4KKyUKKyUgQnkgdGhlIHdheSwgZm9yIGNvbXBhcmlzb24sIGhlcmUncyB3aGF0IGZpdHMgd2l0aCBAZXhhbXBsZSAoMTBwdCk6CislICAgOC41eDExPTcxICBzbWFsbGJvb2s9NjAgIGE0PTc1ICBhNT01OAorJQorJSBJIHdpc2ggdGhlIFVTQSB1c2VkIEE0IHBhcGVyLgorJSAtLWthcmwsIDI0amFuMDMuCisKKworJSBTZXQgdXAgdGhlIGRlZmF1bHQgZm9udHMsIHNvIHdlIGNhbiB1c2UgdGhlbSBmb3IgY3JlYXRpbmcgYm94ZXMuCislCitcdGV4dGZvbnRzIFxybQorCislIERlZmluZSB0aGVzZSBzbyB0aGV5IGNhbiBiZSBlYXNpbHkgY2hhbmdlZCBmb3Igb3RoZXIgZm9udHMuCitcZGVmXGFuZ2xlbGVmdHskXGxhbmdsZSR9CitcZGVmXGFuZ2xlcmlnaHR7JFxyYW5nbGUkfQorCislIENvdW50IGRlcHRoIGluIGZvbnQtY2hhbmdlcywgZm9yIGVycm9yIGNoZWNrcworXG5ld2NvdW50XGZvbnRkZXB0aCBcZm9udGRlcHRoPTAKKworJSBGb250cyBmb3Igc2hvcnQgdGFibGUgb2YgY29udGVudHMuCitcc2V0Zm9udFxzaG9ydGNvbnRybVxybXNoYXBlezEyfXsxMDAwfQorXHNldGZvbnRcc2hvcnRjb250YmZcYmZzaGFwZXsxMH17XG1hZ3N0ZXAxfSAgJSBubyBjbWIxMgorXHNldGZvbnRcc2hvcnRjb250c2xcc2xzaGFwZXsxMn17MTAwMH0KK1xzZXRmb250XHNob3J0Y29udHR0XHR0c2hhcGV7MTJ9ezEwMDB9CisKKyUlIEFkZCBzY3JpYmUtbGlrZSBmb250IGVudmlyb25tZW50cywgcGx1cyBAbCBmb3IgaW5saW5lIGxpc3AgKHVzdWFsbHkgc2FucworJSUgc2VyaWYpIGFuZCBAaWkgZm9yIFRlWCBpdGFsaWMKKworJSBcc21hcnRpdGFsaWN7QVJHfSBvdXRwdXRzIGFyZyBpbiBpdGFsaWNzLCBmb2xsb3dlZCBieSBhbiBpdGFsaWMgY29ycmVjdGlvbgorJSB1bmxlc3MgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgaXMgc3VjaCBhcyBub3QgdG8gbmVlZCBvbmUuCitcZGVmXHNtYXJ0aXRhbGljeHtcaWZ4XG5leHQsXGVsc2VcaWZ4XG5leHQtXGVsc2VcaWZ4XG5leHQuXGVsc2UKKyAgICAgICAgICAgICAgICAgICAgXHB0ZXhzbGFzaFxmaVxmaVxmaX0KK1xkZWZcc21hcnRzbGFudGVkIzF7e1xpZnVzaW5ndHRcdHRzbFxzbCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQorXGRlZlxzbWFydGl0YWxpYyMxe3tcaWZ1c2luZ3R0XHR0c2xcaXQgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KKworJSBsaWtlIFxzbWFydHNsYW50ZWQgZXhjZXB0IHVuY29uZGl0aW9uYWxseSB1c2VzIFx0dHNsLgorJSBAdmFyIGlzIHNldCB0byB0aGlzIGZvciBkZWZ1biBhcmd1bWVudHMuCitcZGVmXHR0c2xhbnRlZCMxe3tcdHRzbCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQorCislIGxpa2UgXHNtYXJ0c2xhbnRlZCBleGNlcHQgdW5jb25kaXRpb25hbGx5IHVzZSBcc2wuICBXZSBuZXZlciB3YW50CislIHR0c2wgZm9yIGJvb2sgdGl0bGVzLCBkbyB3ZT8KK1xkZWZcY2l0ZSMxe3tcc2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KKworXGxldFxpPVxzbWFydGl0YWxpYworXGxldFxzbGFudGVkPVxzbWFydHNsYW50ZWQKK1xsZXRcdmFyPVxzbWFydHNsYW50ZWQKK1xsZXRcZGZuPVxzbWFydHNsYW50ZWQKK1xsZXRcZW1waD1cc21hcnRpdGFsaWMKKworJSBAYiwgZXhwbGljaXQgYm9sZC4KK1xkZWZcYiMxe3tcYmYgIzF9fQorXGxldFxzdHJvbmc9XGIKKworJSBAc2Fuc3NlcmlmLCBleHBsaWNpdCBzYW5zLgorXGRlZlxzYW5zc2VyaWYjMXt7XHNmICMxfX0KKworJSBXZSBjYW4ndCBqdXN0IHVzZSBcZXhoeXBoZW5wZW5hbHR5LCBiZWNhdXNlIHRoYXQgb25seSBoYXMgZWZmZWN0IGF0CislIHRoZSBlbmQgb2YgYSBwYXJhZ3JhcGguICBSZXN0b3JlIG5vcm1hbCBoeXBoZW5hdGlvbiBhdCB0aGUgZW5kIG9mIHRoZQorJSBncm91cCB3aXRoaW4gd2hpY2ggXG5vaHlwaGVuYXRpb24gaXMgcHJlc3VtYWJseSBjYWxsZWQuCislCitcZGVmXG5vaHlwaGVuYXRpb257XGh5cGhlbmNoYXJcZm9udCA9IC0xICBcYWZ0ZXJncm91cFxyZXN0b3JlaHlwaGVuYXRpb259CitcZGVmXHJlc3RvcmVoeXBoZW5hdGlvbntcaHlwaGVuY2hhclxmb250ID0gYC0gfQorCislIFNldCBzZmNvZGUgdG8gbm9ybWFsIGZvciB0aGUgY2hhcnMgdGhhdCB1c3VhbGx5IGhhdmUgYW5vdGhlciB2YWx1ZS4KKyUgQ2FuJ3QgdXNlIHBsYWluJ3MgXGZyZW5jaHNwYWNpbmcgYmVjYXVzZSBpdCB1c2VzIHRoZSBgXHggbm90YXRpb24sIGFuZAorJSBzb21ldGltZXMgXHggaGFzIGFuIGFjdGl2ZSBkZWZpbml0aW9uIHRoYXQgbWVzc2VzIHRoaW5ncyB1cC4KKyUKK1xjaGFyZGVmXGNvbG9uQ2hhciA9IGBcOgorXGNoYXJkZWZcY29tbWFDaGFyID0gYFwsCitcY2hhcmRlZlxkb3RDaGFyICAgPSBgXC4KK1xjaGFyZGVmXGV4Y2xhbUNoYXI9IGBcIQorXGNoYXJkZWZccXVlc3RDaGFyID0gYFw/CitcY2hhcmRlZlxzZW1pQ2hhciAgPSBgXDsKKyUKK1xjYXRjb2RlYEA9MTEKKyAgXGRlZlxwbGFpbmZyZW5jaHNwYWNpbmd7JQorICAgIFxzZmNvZGVcZG90Q2hhciAgPVxAbSBcc2Zjb2RlXHF1ZXN0Q2hhcj1cQG0gXHNmY29kZVxleGNsYW1DaGFyPVxAbQorICAgIFxzZmNvZGVcY29sb25DaGFyPVxAbSBcc2Zjb2RlXHNlbWlDaGFyID1cQG0gXHNmY29kZVxjb21tYUNoYXIgPVxAbQorICAgIFxkZWZcZW5kb2ZzZW50ZW5jZXNwYWNlZmFjdG9yezEwMDB9JSBmb3IgQC4gYW5kIGZyaWVuZHMKKyAgfQorICBcZGVmXHBsYWlubm9uZnJlbmNoc3BhY2luZ3slCisgICAgXHNmY29kZWBcLjMwMDBcc2Zjb2RlYFw/MzAwMFxzZmNvZGVgXCEzMDAwCisgICAgXHNmY29kZWBcOjIwMDBcc2Zjb2RlYFw7MTUwMFxzZmNvZGVgXCwxMjUwCisgICAgXGRlZlxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3J7MzAwMH0lIGZvciBALiBhbmQgZnJpZW5kcworICB9CitcY2F0Y29kZWBAPVxvdGhlcgorXGRlZlxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3J7MzAwMH0lIGRlZmF1bHQKKworXGRlZlx0IzF7JQorICB7XHR0IFxyYXdiYWNrc2xhc2ggXHBsYWluZnJlbmNoc3BhY2luZyAjMX0lCisgIFxudWxsCit9CitcZGVmXHNhbXAjMXtgXHRjbG9zZXsjMX0nXG51bGx9Citcc2V0Zm9udFxrZXlybVxybXNoYXBlezh9ezEwMDB9CitcZm9udFxrZXlzeT1jbXN5OQorXGRlZlxrZXkjMXt7XGtleXJtXHRleHRmb250Mj1ca2V5c3kgXGxlYXZldm1vZGVcaGJveHslCisgIFxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlbGVmdH1ca2Vybi0uMDhlbVx2dG9weyUKKyAgICBcdmJveHtcaHJ1bGVca2Vybi0wLjRwdAorICAgICBcaGJveHtccmFpc2UwLjRwdFxoYm94e1x2cGhhbnRvbXtcYW5nbGVsZWZ0fX0jMX19JQorICAgIFxrZXJuLTAuNHB0XGhydWxlfSUKKyAgXGtlcm4tLjA2ZW1ccmFpc2UwLjRwdFxoYm94e1xhbmdsZXJpZ2h0fX19fQorJSBUaGUgb2xkIGRlZmluaXRpb24sIHdpdGggbm8gbG96ZW5nZToKKyVcZGVmXGtleSAjMXt7XHR0c2wgXG5vaHlwaGVuYXRpb24gXHVwcGVyY2FzZXsjMX19XG51bGx9CitcZGVmXGN0cmwgIzF7e1x0dCBccmF3YmFja3NsYXNoIFxoYXR9IzF9CisKKyUgQGZpbGUsIEBvcHRpb24gYXJlIHRoZSBzYW1lIGFzIEBzYW1wLgorXGxldFxmaWxlPVxzYW1wCitcbGV0XG9wdGlvbj1cc2FtcAorCislIEBjb2RlIGlzIGEgbW9kaWZpY2F0aW9uIG9mIEB0LAorJSB3aGljaCBtYWtlcyBzcGFjZXMgdGhlIHNhbWUgc2l6ZSBhcyBub3JtYWwgaW4gdGhlIHN1cnJvdW5kaW5nIHRleHQuCitcZGVmXHRjbG9zZSMxeyUKKyAgeyUKKyAgICAlIENoYW5nZSBub3JtYWwgaW50ZXJ3b3JkIHNwYWNlIHRvIGJlIHNhbWUgYXMgZm9yIHRoZSBjdXJyZW50IGZvbnQuCisgICAgXHNwYWNlc2tpcCA9IFxmb250ZGltZW4yXGZvbnQKKyAgICAlCisgICAgJSBTd2l0Y2ggdG8gdHlwZXdyaXRlci4KKyAgICBcdHQKKyAgICAlCisgICAgJSBCdXQgYFwgJyBwcm9kdWNlcyB0aGUgbGFyZ2UgdHlwZXdyaXRlciBpbnRlcndvcmQgc3BhY2UuCisgICAgXGRlZlwge3tcc3BhY2Vza2lwID0gMHB0e30gfX0lCisgICAgJQorICAgICUgVHVybiBvZmYgaHlwaGVuYXRpb24uCisgICAgXG5vaHlwaGVuYXRpb24KKyAgICAlCisgICAgXHJhd2JhY2tzbGFzaAorICAgIFxwbGFpbmZyZW5jaHNwYWNpbmcKKyAgICAjMSUKKyAgfSUKKyAgXG51bGwKK30KKworJSBXZSAqbXVzdCogdHVybiBvbiBoeXBoZW5hdGlvbiBhdCBgLScgYW5kIGBfJyBpbiBAY29kZS4KKyUgT3RoZXJ3aXNlLCBpdCBpcyB0b28gaGFyZCB0byBhdm9pZCBvdmVyZnVsbCBoYm94ZXMKKyUgaW4gdGhlIEVtYWNzIG1hbnVhbCwgdGhlIExpYnJhcnkgbWFudWFsLCBldGMuCisKKyUgVW5mb3J0dW5hdGVseSwgVGVYIHVzZXMgb25lIHBhcmFtZXRlciAoXGh5cGhlbmNoYXIpIHRvIGNvbnRyb2wKKyUgYm90aCBoeXBoZW5hdGlvbiBhdCAtIGFuZCBoeXBoZW5hdGlvbiB3aXRoaW4gd29yZHMuCislIFdlIG11c3QgdGhlcmVmb3JlIHR1cm4gdGhlbSBib3RoIG9mZiAoXHRjbG9zZSBkb2VzIHRoYXQpCislIGFuZCBhcnJhbmdlIGV4cGxpY2l0bHkgdG8gaHlwaGVuYXRlIGF0IGEgZGFzaC4KKyUgIC0tIHJtcy4KK3sKKyAgXGNhdGNvZGVgXC09XGFjdGl2ZQorICBcY2F0Y29kZWBcXz1cYWN0aXZlCisgICUKKyAgXGdsb2JhbFxkZWZcY29kZXtcYmVnaW5ncm91cAorICAgIFxjYXRjb2RlYFwtPVxhY3RpdmUgIFxjYXRjb2RlYFxfPVxhY3RpdmUKKyAgICBcaWZhbGxvd2NvZGVicmVha3MKKyAgICAgXGxldC1cY29kZWRhc2gKKyAgICAgXGxldF9cY29kZXVuZGVyCisgICAgXGVsc2UKKyAgICAgXGxldC1ccmVhbGRhc2gKKyAgICAgXGxldF9ccmVhbHVuZGVyCisgICAgXGZpCisgICAgXGNvZGV4CisgIH0KK30KKworXGRlZlxyZWFsZGFzaHstfQorXGRlZlxjb2RlZGFzaHstXGRpc2NyZXRpb25hcnl7fXt9e319CitcZGVmXGNvZGV1bmRlcnslCisgICUgdGhpcyBpcyBhbGwgc28gQG1hdGh7QGNvZGV7dmFyX25hbWV9KzF9IGNhbiB3b3JrLiAgSW4gbWF0aCBtb2RlLCBfCisgICUgaXMgImFjdGl2ZSIgKG1hdGhjb2RlIjgwMDApIGFuZCBcbm9ybWFsdW5kZXJzY29yZSAob3IgXGNoYXI5NSwgZXRjLikKKyAgJSB3aWxsIHRoZXJlZm9yZSBleHBhbmQgdGhlIGFjdGl2ZSBkZWZpbml0aW9uIG9mIF8sIHdoaWNoIGlzIHVzCisgICUgKGluc2lkZSBAY29kZSB0aGF0IGlzKSwgdGhlcmVmb3JlIGFuIGVuZGxlc3MgbG9vcC4KKyAgXGlmdXNpbmd0dHtcaWZtbW9kZQorICAgICAgICAgICAgICAgXG1hdGhjaGFyIjA3NUYgJSBjbGFzcyAwPW9yZGluYXJ5LCBmYW1pbHkgNz10dGZhbSwgcG9zIDB4NUY9Xy4KKyAgICAgICAgICAgICBcZWxzZVxub3JtYWx1bmRlcnNjb3JlIFxmaQorICAgICAgICAgICAgIFxkaXNjcmV0aW9uYXJ5e317fXt9fSUKKyAgICAgICAgICAgIHtcX30lCit9CitcZGVmXGNvZGV4ICMxe1x0Y2xvc2V7IzF9XGVuZGdyb3VwfQorCislIEFuIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9uOiB0aGUgYWJvdmUgd2lsbCBhbGxvdyBicmVha3MgYWZ0ZXIsIGUuZy4sCislIGVhY2ggb2YgdGhlIGZvdXIgdW5kZXJzY29yZXMgaW4gX190eXBlb2ZfXy4gIFRoaXMgaXMgdW5kZXNpcmFibGUgaW4KKyUgc29tZSBtYW51YWxzLCBlc3BlY2lhbGx5IGlmIHRoZXkgZG9uJ3QgaGF2ZSBsb25nIGlkZW50aWZpZXJzIGluCislIGdlbmVyYWwuICBAYWxsb3djb2RlYnJlYWtzIHByb3ZpZGVzIGEgd2F5IHRvIGNvbnRyb2wgdGhpcy4KKyUgCitcbmV3aWZcaWZhbGxvd2NvZGVicmVha3MgIFxhbGxvd2NvZGVicmVha3N0cnVlCisKK1xkZWZca2V5d29yZHRydWV7dHJ1ZX0KK1xkZWZca2V5d29yZGZhbHNle2ZhbHNlfQorCitccGFyc2VhcmdkZWZcYWxsb3djb2RlYnJlYWtzeyUKKyAgXGRlZlx0eGlhcmd7IzF9JQorICBcaWZ4XHR4aWFyZ1xrZXl3b3JkdHJ1ZQorICAgIFxhbGxvd2NvZGVicmVha3N0cnVlCisgIFxlbHNlXGlmeFx0eGlhcmdca2V5d29yZGZhbHNlCisgICAgXGFsbG93Y29kZWJyZWFrc2ZhbHNlCisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEBhbGxvd2NvZGVicmVha3Mgb3B0aW9uIGBcdHhpYXJnJ30lCisgIFxmaVxmaQorfQorCislIEBrYmQgaXMgbGlrZSBAY29kZSwgZXhjZXB0IHRoYXQgaWYgdGhlIGFyZ3VtZW50IGlzIGp1c3Qgb25lIEBrZXkgY29tbWFuZCwKKyUgdGhlbiBAa2JkIGhhcyBubyBlZmZlY3QuCisKKyUgQGtiZGlucHV0c3R5bGUgLS0gYXJnIGlzIGBkaXN0aW5jdCcgKEBrYmQgdXNlcyBzbGFudGVkIHR0eSBmb250IGFsd2F5cyksCislICAgYGV4YW1wbGUnIChAa2JkIHVzZXMgdHRzbCBvbmx5IGluc2lkZSBvZiBAZXhhbXBsZSBhbmQgZnJpZW5kcyksCislICAgb3IgYGNvZGUnIChAa2JkIHVzZXMgbm9ybWFsIHR0eSBmb250IGFsd2F5cykuCitccGFyc2VhcmdkZWZca2JkaW5wdXRzdHlsZXslCisgIFxkZWZcdHhpYXJneyMxfSUKKyAgXGlmeFx0eGlhcmdcd29yZGRpc3RpbmN0CisgICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHRzbH0lCisgIFxlbHNlXGlmeFx0eGlhcmdcd29yZGV4YW1wbGUKKyAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dH0lCisgIFxlbHNlXGlmeFx0eGlhcmdcd29yZGNvZGUKKyAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHR9XGdkZWZca2JkZm9udHtcdHR9JQorICBcZWxzZQorICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7VW5rbm93biBAa2JkaW5wdXRzdHlsZSBvcHRpb24gYFx0eGlhcmcnfSUKKyAgXGZpXGZpXGZpCit9CitcZGVmXHdvcmRkaXN0aW5jdHtkaXN0aW5jdH0KK1xkZWZcd29yZGV4YW1wbGV7ZXhhbXBsZX0KK1xkZWZcd29yZGNvZGV7Y29kZX0KKworJSBEZWZhdWx0IGlzIGBkaXN0aW5jdC4nCitca2JkaW5wdXRzdHlsZSBkaXN0aW5jdAorCitcZGVmXHhrZXl7XGtleX0KK1xkZWZca2JkZm9vIzEjMiMzXHBhcntcZGVmXG9uZXsjMX1cZGVmXHRocmVleyMzfVxkZWZcdGhyZWV4ez8/fSUKK1xpZnhcb25lXHhrZXlcaWZ4XHRocmVleFx0aHJlZSBca2V5eyMyfSUKK1xlbHNle1x0Y2xvc2V7XGtiZGZvbnRcbG9va319XGZpCitcZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaX0KKworJSBGb3IgQGluZGljYXRldXJsLCBAZW52LCBAY29tbWFuZCBxdW90ZXMgc2VlbSB1bm5lY2Vzc2FyeSwgc28gdXNlIFxjb2RlLgorXGxldFxpbmRpY2F0ZXVybD1cY29kZQorXGxldFxlbnY9XGNvZGUKK1xsZXRcY29tbWFuZD1cY29kZQorCislIEB1cmVmIChhYmJyZXZpYXRpb24gZm9yIGB1cmxyZWYnKSB0YWtlcyBhbiBvcHRpb25hbCAoY29tbWEtc2VwYXJhdGVkKQorJSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmeWluZyB0aGUgdGV4dCB0byBkaXNwbGF5IGFuZCBhbiBvcHRpb25hbCB0aGlyZAorJSBhcmcgYXMgdGV4dCB0byBkaXNwbGF5IGluc3RlYWQgb2YgKHJhdGhlciB0aGFuIGluIGFkZGl0aW9uIHRvKSB0aGUgdXJsCislIGl0c2VsZi4gIEZpcnN0IChtYW5kYXRvcnkpIGFyZyBpcyB0aGUgdXJsLiAgUGVyaGFwcyBldmVudHVhbGx5IHB1dCBpbgorJSBhIGh5cGVydGV4IFxzcGVjaWFsIGhlcmUuCislCitcZGVmXHVyZWYjMXtcZG91cmVmICMxLCwsXGZpbmlzaH0KK1xkZWZcZG91cmVmIzEsIzIsIzMsIzRcZmluaXNoe1xiZWdpbmdyb3VwCisgIFx1bnNlcHNwYWNlcworICBccGRmdXJseyMxfSUKKyAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMzfSUKKyAgXGlmZGltXHdkMCA+IDBwdAorICAgIFx1bmhib3gwICUgdGhpcmQgYXJnIGdpdmVuLCBzaG93IG9ubHkgdGhhdAorICBcZWxzZQorICAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn0lCisgICAgXGlmZGltXHdkMCA+IDBwdAorICAgICAgXGlmcGRmCisgICAgICAgIFx1bmhib3gwICAgICAgICAgICAgICUgUERGOiAybmQgYXJnIGdpdmVuLCBzaG93IG9ubHkgaXQKKyAgICAgIFxlbHNlCisgICAgICAgIFx1bmhib3gwXCAoXGNvZGV7IzF9KSUgRFZJOiAybmQgYXJnIGdpdmVuLCBzaG93IGJvdGggaXQgYW5kIHVybAorICAgICAgXGZpCisgICAgXGVsc2UKKyAgICAgIFxjb2RleyMxfSUgb25seSB1cmwgZ2l2ZW4sIHNvIHNob3cgaXQKKyAgICBcZmkKKyAgXGZpCisgIFxlbmRsaW5rCitcZW5kZ3JvdXB9CisKKyUgQHVybCBzeW5vbnltIGZvciBAdXJlZiwgc2luY2UgdGhhdCdzIGhvdyBldmVyeW9uZSB1c2VzIGl0LgorJQorXGxldFx1cmw9XHVyZWYKKworJSBybXMgZG9lcyBub3QgbGlrZSBhbmdsZSBicmFja2V0cyAtLWthcmwsIDE3bWF5OTcuCislIFNvIG5vdyBAZW1haWwgaXMganVzdCBsaWtlIEB1cmVmLCB1bmxlc3Mgd2UgYXJlIHBkZi4KKyUKKyVcZGVmXGVtYWlsIzF7XGFuZ2xlbGVmdHtcdHQgIzF9XGFuZ2xlcmlnaHR9CitcaWZwZGYKKyAgXGRlZlxlbWFpbCMxe1xkb2VtYWlsIzEsLFxmaW5pc2h9CisgIFxkZWZcZG9lbWFpbCMxLCMyLCMzXGZpbmlzaHtcYmVnaW5ncm91cAorICAgIFx1bnNlcHNwYWNlcworICAgIFxwZGZ1cmx7bWFpbHRvOiMxfSUKKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxpZmRpbVx3ZDA+MHB0XHVuaGJveDBcZWxzZVxjb2RleyMxfVxmaQorICAgIFxlbmRsaW5rCisgIFxlbmRncm91cH0KK1xlbHNlCisgIFxsZXRcZW1haWw9XHVyZWYKK1xmaQorCislIENoZWNrIGlmIHdlIGFyZSBjdXJyZW50bHkgdXNpbmcgYSB0eXBld3JpdGVyIGZvbnQuICBTaW5jZSBhbGwgdGhlCislIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybyBpbnRlcndvcmQgc3RyZXRjaCAoYW5kCislIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwgdHlwZXdyaXRlciBmb250cyB0byBoYXZlCislIHRoaXMgcHJvcGVydHksIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgorJQorXGRlZlxpZm1vbm9zcGFjZXtcaWZkaW1cZm9udGRpbWVuM1xmb250PTBwdCB9CisKKyUgVHlwZXNldCBhIGRpbWVuc2lvbiwgZS5nLiwgYGluJyBvciBgcHQnLiAgVGhlIG9ubHkgcmVhc29uIGZvciB0aGUKKyUgYXJndW1lbnQgaXMgdG8gbWFrZSB0aGUgaW5wdXQgbG9vayByaWdodDogQGRtbntwdH0gaW5zdGVhZCBvZiBAZG1ue31wdC4KKyUKK1xkZWZcZG1uIzF7XHRoaW5zcGFjZSAjMX0KKworXGRlZlxrYmQjMXtcZGVmXGxvb2t7IzF9XGV4cGFuZGFmdGVyXGtiZGZvb1xsb29rPz9ccGFyfQorCislIEBsIHdhcyBuZXZlciBkb2N1bWVudGVkIHRvIG1lYW4gYGBzd2l0Y2ggdG8gdGhlIExpc3AgZm9udCcnLAorJSBhbmQgaXQgaXMgbm90IHVzZWQgYXMgc3VjaCBpbiBhbnkgbWFudWFsIEkgY2FuIGZpbmQuICBXZSBuZWVkIGl0IGZvcgorJSBQb2xpc2ggc3VwcHJlc3NlZC1sLiAgLS1rYXJsLCAyMnNlcDk2LgorJVxkZWZcbCMxe3tcbGkgIzF9XG51bGx9CisKKyUgRXhwbGljaXQgZm9udCBjaGFuZ2VzOiBAciwgQHNjLCB1bmRvY3VtZW50ZWQgQGlpLgorXGRlZlxyIzF7e1xybSAjMX19ICAgICAgICAgICAgICAlIHJvbWFuIGZvbnQKK1xkZWZcc2MjMXt7XHNtYWxsY2FwcyMxfX0gICAgICAgJSBzbWFsbGNhcHMgZm9udAorXGRlZlxpaSMxe3tcaXQgIzF9fSAgICAgICAgICAgICAlIGl0YWxpYyBmb250CisKKyUgQGFjcm9ueW0gZm9yICJGQkkiLCAiTkFUTyIsIGFuZCB0aGUgbGlrZS4KKyUgV2UgcHJpbnQgdGhpcyBvbmUgcG9pbnQgc2l6ZSBzbWFsbGVyLCBzaW5jZSBpdCdzIGludGVuZGVkIGZvcgorJSBhbGwtdXBwZXJjYXNlLgorJSAKK1xkZWZcYWNyb255bSMxe1xkb2Fjcm9ueW0gIzEsLFxmaW5pc2h9CitcZGVmXGRvYWNyb255bSMxLCMyLCMzXGZpbmlzaHslCisgIHtcc2VsZWN0Zm9udHNcbHNpemUgIzF9JQorICBcZGVmXHRlbXB7IzJ9JQorICBcaWZ4XHRlbXBcZW1wdHkgXGVsc2UKKyAgICBcc3BhY2UgKHtcdW5zZXBzcGFjZXMgXGlnbm9yZXNwYWNlcyBcdGVtcCBcdW5za2lwfSklCisgIFxmaQorfQorCislIEBhYmJyIGZvciAiQ29tcHV0LiBKLiIgYW5kIHRoZSBsaWtlLgorJSBObyBmb250IGNoYW5nZSwgYnV0IGRvbid0IGRvIGVuZC1vZi1zZW50ZW5jZSBzcGFjaW5nLgorJSAKK1xkZWZcYWJiciMxe1xkb2FiYnIgIzEsLFxmaW5pc2h9CitcZGVmXGRvYWJiciMxLCMyLCMzXGZpbmlzaHslCisgIHtccGxhaW5mcmVuY2hzcGFjaW5nICMxfSUKKyAgXGRlZlx0ZW1weyMyfSUKKyAgXGlmeFx0ZW1wXGVtcHR5IFxlbHNlCisgICAgXHNwYWNlICh7XHVuc2Vwc3BhY2VzIFxpZ25vcmVzcGFjZXMgXHRlbXAgXHVuc2tpcH0pJQorICBcZmkKK30KKworJSBAcG91bmRze30gaXMgYSBzdGVybGluZyBzaWduLCB3aGljaCBLbnV0aCBwdXQgaW4gdGhlIENNIGl0YWxpYyBmb250LgorJQorXGRlZlxwb3VuZHN7e1xpdFwkfX0KKworJSBAZXVyb3t9IGNvbWVzIGZyb20gYSBzZXBhcmF0ZSBmb250LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3R5bGUuCislIFdlIHVzZSB0aGUgZnJlZSBmZXltKiBmb250cyBmcm9tIHRoZSBldXJvc3ltIHBhY2thZ2UgYnkgSGVucmlrCislIFRoZWlsaW5nLCB3aGljaCBzdXBwb3J0IHJlZ3VsYXIsIHNsYW50ZWQsIGJvbGQgYW5kIGJvbGQgc2xhbnRlZCAoYW5kCislICJvdXRsaW5lZCIgKGJsYWNrYm9hcmQgYm9hcmQsIHNvcnQgb2YpIHZlcnNpb25zLCB3aGljaCB3ZSBkb24ndCBuZWVkKS4KKyUgSXQgaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5jdGFuLm9yZy90ZXgtYXJjaGl2ZS9mb250cy9ldXJvc3ltLgorJSAKKyUgQWx0aG91Z2ggb25seSByZWd1bGFyIGlzIHRoZSB0cnVseSBvZmZpY2lhbCBFdXJvIHN5bWJvbCwgd2UgaWdub3JlCislIHRoYXQuICBUaGUgRXVybyBpcyBkZXNpZ25lZCB0byBiZSBzbGlnaHRseSB0YWxsZXIgdGhhbiB0aGUgcmVndWxhcgorJSBmb250IGhlaWdodC4KKyUgCislIGZleW1yIC0gcmVndWxhcgorJSBmZXltbyAtIHNsYW50ZWQKKyUgZmV5YnIgLSBib2xkCislIGZleWJvIC0gYm9sZCBzbGFudGVkCislIAorJSBUaGVyZSBpcyBubyBnb29kIChmcmVlKSB0eXBld3JpdGVyIHZlcnNpb24sIHRvIG15IGtub3dsZWRnZS4KKyUgQSBmZXltcjEwIGV1cm8gaXMgfjcuM3B0IHdpZGUsIHdoaWxlIGEgbm9ybWFsIGNtdHQxMCBjaGFyIGlzIH41LjI1cHQgd2lkZS4KKyUgSG1tLgorJSAKKyUgQWxzbyBkb2Vzbid0IHdvcmsgaW4gbWF0aC4gIERvIHdlIG5lZWQgdG8gZG8gbWF0aCB3aXRoIGV1cm8gc3ltYm9scz8KKyUgSG9wZSBub3QuCislIAorJSAKK1xkZWZcZXVyb3t7XGV1cm9mb250IGV9fQorXGRlZlxldXJvZm9udHslCisgICUgV2Ugc2V0IHRoZSBmb250IGF0IGVhY2ggY29tbWFuZCwgcmF0aGVyIHRoYW4gcHJlZGVmaW5pbmcgaXQgaW4KKyAgJSBcdGV4dGZvbnRzIGFuZCB0aGUgb3RoZXIgZm9udC1zd2l0Y2hpbmcgY29tbWFuZHMsIHNvIHRoYXQKKyAgJSBpbnN0YWxsYXRpb25zIHdoaWNoIG5ldmVyIG5lZWQgdGhlIHN5bWJvbCBkb24ndCBoYXZlIHRvIGhhdmUgdGhlCisgICUgZm9udCBpbnN0YWxsZWQuCisgICUgCisgICUgVGhlcmUgaXMgb25seSBvbmUgZGVzaWduZWQgc2l6ZSAobm9taW5hbCAxMHB0KSwgc28gd2UgYWx3YXlzIHNjYWxlCisgICUgdGhhdCB0byB0aGUgY3VycmVudCBub21pbmFsIHNpemUuCisgICUgCisgICUgQnkgdGhlIHdheSwgc2ltcGx5IHVzaW5nICJhdCAxZW0iIHdvcmtzIGZvciBjbXIxMCBhbmQgdGhlIGxpa2UsIGJ1dAorICAlIGRvZXMgbm90IHdvcmsgZm9yIGNtYngxMCBhbmQgb3RoZXIgZXh0ZW5kZWQvc2hydW5rZW4gZm9udHMuCisgICUgCisgIFxkZWZcZXVyb3NpemV7XGNzbmFtZVxjdXJmb250c2l6ZSBub21pbmFsc2l6ZVxlbmRjc25hbWV9JQorICAlCisgIFxpZnhcY3VyZm9udHN0eWxlXGJmc3R5bGVuYW1lIAorICAgICUgYm9sZDoKKyAgICBcZm9udFx0aGlzZXVyb2ZvbnQgPSBcaWZ1c2luZ2l0e2ZleWJvMTB9e2ZleWJyMTB9IGF0IFxldXJvc2l6ZQorICBcZWxzZSAKKyAgICAlIHJlZ3VsYXI6CisgICAgXGZvbnRcdGhpc2V1cm9mb250ID0gXGlmdXNpbmdpdHtmZXltbzEwfXtmZXltcjEwfSBhdCBcZXVyb3NpemUKKyAgXGZpCisgIFx0aGlzZXVyb2ZvbnQKK30KKworJSBAcmVnaXN0ZXJlZHN5bWJvbCAtIFIgaW4gYSBjaXJjbGUuICBUaGUgZm9udCBmb3IgdGhlIFIgc2hvdWxkIHJlYWxseQorJSBiZSBzbWFsbGVyIHlldCwgYnV0IGxsbHNpemUgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGZvciBub3cuCislIEFkYXB0ZWQgZnJvbSB0aGUgcGxhaW4udGV4IGRlZmluaXRpb24gb2YgXGNvcHlyaWdodC4KKyUKK1xkZWZccmVnaXN0ZXJlZHN5bWJvbHslCisgICRee3tcb29hbGlnbntcaGZpbFxyYWlzZS4wN2V4XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgUn0lCisgICAgICAgICAgICAgICBcaGZpbFxjcmNyXE9yYn19JQorICAgIH0kJQorfQorCislIExhdXJlbnQgU2llYmVubWFubiByZXBvcnRzIFxPcmIgdW5kZWZpbmVkIHdpdGg6CislICBUZXh0dXJlcyAxLjcuNyAocHJlbG9hZGVkIGZvcm1hdD1wbGFpbiA5My4xMC4xNCkgICg2OEspICAxNiBBUFIgMjAwNCAwMjozOAorJSBzbyB3ZSdsbCBkZWZpbmUgaXQgaWYgbmVjZXNzYXJ5LgorJSAKK1xpZnhcT3JiXHVuZGVmaW5lZAorXGRlZlxPcmJ7XG1hdGhoZXhib3gyMER9CitcZmkKKworCitcbWVzc2FnZXtwYWdlIGhlYWRpbmdzLH0KKworXG5ld3NraXBcdGl0bGVwYWdldG9wZ2x1ZSBcdGl0bGVwYWdldG9wZ2x1ZSA9IDEuNWluCitcbmV3c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlIFx0aXRsZXBhZ2Vib3R0b21nbHVlID0gMnBjCisKKyUgRmlyc3QgdGhlIHRpdGxlIHBhZ2UuICBNdXN0IGRvIEBzZXR0aXRsZSBiZWZvcmUgQHRpdGxlcGFnZS4KK1xuZXdpZlxpZnNlZW5hdXRob3IKK1xuZXdpZlxpZmZpbmlzaGVkdGl0bGVwYWdlCisKKyUgRG8gYW4gaW1wbGljaXQgQGNvbnRlbnRzIG9yIEBzaG9ydGNvbnRlbnRzIGFmdGVyIEBlbmQgdGl0bGVwYWdlIGlmIHRoZQorJSB1c2VyIHNheXMgQHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2Ugb3IgQHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZS4KKyUKK1xuZXdpZlxpZnNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKKyBcbGV0XHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UgPSBcc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZXRydWUKK1xuZXdpZlxpZnNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZQorIFxsZXRcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlID0gXHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZXRydWUKKworXHBhcnNlYXJnZGVmXHNob3J0dGl0bGVwYWdle1xiZWdpbmdyb3VwXGhib3h7fVx2c2tpcCAxLjVpbiBcY2hhcHJtIFxjZW50ZXJsaW5leyMxfSUKKyAgICAgICAgXGVuZGdyb3VwXHBhZ2VcaGJveHt9XHBhZ2V9CisKK1xlbnZkZWZcdGl0bGVwYWdleyUKKyAgJSBPcGVuIG9uZSBleHRyYSBncm91cCwgYXMgd2Ugd2FudCB0byBjbG9zZSBpdCBpbiB0aGUgbWlkZGxlIG9mIFxFdGl0bGVwYWdlLgorICBcYmVnaW5ncm91cAorICAgIFxwYXJpbmRlbnQ9MHB0IFx0ZXh0Zm9udHMKKyAgICAlIExlYXZlIHNvbWUgc3BhY2UgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBwYWdlLgorICAgIFx2Z2x1ZVx0aXRsZXBhZ2V0b3BnbHVlCisgICAgJSBObyBydWxlIGF0IHBhZ2UgYm90dG9tIHVubGVzcyB3ZSBwcmludCBvbmUgYXQgdGhlIHRvcCB3aXRoIEB0aXRsZS4KKyAgICBcZmluaXNoZWR0aXRsZXBhZ2V0cnVlCisgICAgJQorICAgICUgTW9zdCB0aXRsZSBgYHBhZ2VzJycgYXJlIGFjdHVhbGx5IHR3byBwYWdlcyBsb25nLCB3aXRoIHNwYWNlCisgICAgJSBhdCB0aGUgdG9wIG9mIHRoZSBzZWNvbmQuICBXZSBkb24ndCB3YW50IHRoZSByYWdnZWQgbGVmdCBvbiB0aGUgc2Vjb25kLgorICAgIFxsZXRcb2xkcGFnZSA9IFxwYWdlCisgICAgXGRlZlxwYWdleyUKKyAgICAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKKwkgXGZpbmlzaHRpdGxlcGFnZQorICAgICAgXGZpCisgICAgICBcbGV0XHBhZ2UgPSBcb2xkcGFnZQorICAgICAgXHBhZ2UKKyAgICAgIFxudWxsCisgICAgfSUKK30KKworXGRlZlxFdGl0bGVwYWdleyUKKyAgICBcaWZmaW5pc2hlZHRpdGxlcGFnZVxlbHNlCisJXGZpbmlzaHRpdGxlcGFnZQorICAgIFxmaQorICAgICUgSXQgaXMgaW1wb3J0YW50IHRvIGRvIHRoZSBwYWdlIGJyZWFrIGJlZm9yZSBlbmRpbmcgdGhlIGdyb3VwLAorICAgICUgYmVjYXVzZSB0aGUgaGVhZGxpbmUgYW5kIGZvb3RsaW5lIGFyZSBvbmx5IGVtcHR5IGluc2lkZSB0aGUgZ3JvdXAuCisgICAgJSBJZiB3ZSB1c2UgdGhlIG5ldyBkZWZpbml0aW9uIG9mIFxwYWdlLCB3ZSBhbHdheXMgZ2V0IGEgYmxhbmsgcGFnZQorICAgICUgYWZ0ZXIgdGhlIHRpdGxlIHBhZ2UsIHdoaWNoIHdlIGNlcnRhaW5seSBkb24ndCB3YW50LgorICAgIFxvbGRwYWdlCisgIFxlbmRncm91cAorICAlCisgICUgTmVlZCB0aGlzIGJlZm9yZSB0aGUgXC4uLmFmdGVydGl0bGVwYWdlIGNoZWNrcyBzbyB0aGF0IGlmIHRoZXkgYXJlCisgICUgaW4gZWZmZWN0IHRoZSB0b2MgcGFnZXMgd2lsbCBjb21lIG91dCB3aXRoIHBhZ2UgbnVtYmVycy4KKyAgXEhFQURJTkdTb24KKyAgJQorICAlIElmIHRoZXkgd2FudCBzaG9ydCwgdGhleSBjZXJ0YWlubHkgd2FudCBsb25nIHRvby4KKyAgXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCisgICAgXHNob3J0Y29udGVudHMKKyAgICBcY29udGVudHMKKyAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4CisgICAgXGdsb2JhbFxsZXRcY29udGVudHMgPSBccmVsYXgKKyAgXGZpCisgICUKKyAgXGlmc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZQorICAgIFxjb250ZW50cworICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4CisgICAgXGdsb2JhbFxsZXRcc2hvcnRjb250ZW50cyA9IFxyZWxheAorICBcZmkKK30KKworXGRlZlxmaW5pc2h0aXRsZXBhZ2V7JQorICBcdnNraXA0cHQgXGhydWxlIGhlaWdodCAycHQgd2lkdGggXGhzaXplCisgIFx2c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlCisgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKK30KKworJSUlIE1hY3JvcyB0byBiZSB1c2VkIHdpdGhpbiBAdGl0bGVwYWdlOgorCitcbGV0XHN1YnRpdGxlcm09XHRlbnJtCitcZGVmXHN1YnRpdGxlZm9udHtcc3VidGl0bGVybSBcbm9ybWFsYmFzZWxpbmVza2lwID0gMTNwdCBcbm9ybWFsYmFzZWxpbmVzfQorCitcZGVmXGF1dGhvcmZvbnR7XGF1dGhvcnJtIFxub3JtYWxiYXNlbGluZXNraXAgPSAxNnB0IFxub3JtYWxiYXNlbGluZXMKKwkJXGxldFx0dD1cYXV0aG9ydHR9CisKK1xwYXJzZWFyZ2RlZlx0aXRsZXslCisgIFxjaGVja2Vudlx0aXRsZXBhZ2UKKyAgXGxlZnRsaW5le1x0aXRsZWZvbnRzXHJtICMxfQorICAlIHByaW50IGEgcnVsZSBhdCB0aGUgcGFnZSBib3R0b20gYWxzby4KKyAgXGZpbmlzaGVkdGl0bGVwYWdlZmFsc2UKKyAgXHZza2lwNHB0IFxocnVsZSBoZWlnaHQgNHB0IHdpZHRoIFxoc2l6ZSBcdnNraXA0cHQKK30KKworXHBhcnNlYXJnZGVmXHN1YnRpdGxleyUKKyAgXGNoZWNrZW52XHRpdGxlcGFnZQorICB7XHN1YnRpdGxlZm9udCBccmlnaHRsaW5leyMxfX0lCit9CisKKyUgQGF1dGhvciBzaG91bGQgY29tZSBsYXN0LCBidXQgbWF5IGNvbWUgbWFueSB0aW1lcy4KKyUgSXQgY2FuIGFsc28gYmUgdXNlZCBpbnNpZGUgQHF1b3RhdGlvbi4KKyUKK1xwYXJzZWFyZ2RlZlxhdXRob3J7JQorICBcZGVmXHRlbXB7XHF1b3RhdGlvbn0lCisgIFxpZnhcdGhpc2Vudlx0ZW1wCisgICAgXGRlZlxxdW90YXRpb25hdXRob3J7IzF9JSBwcmludGVkIGluIFxFcXVvdGF0aW9uLgorICBcZWxzZQorICAgIFxjaGVja2Vudlx0aXRsZXBhZ2UKKyAgICBcaWZzZWVuYXV0aG9yXGVsc2UgXHZza2lwIDBwdCBwbHVzIDFmaWxsbCBcc2VlbmF1dGhvcnRydWUgXGZpCisgICAge1xhdXRob3Jmb250IFxsZWZ0bGluZXsjMX19JQorICBcZmkKK30KKworCislJSUgU2V0IHVwIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzLgorCitcbGV0XHRoaXNwYWdlPVxmb2xpbworCitcbmV3dG9rc1xldmVuaGVhZGxpbmUgICAgJSBoZWFkbGluZSBvbiBldmVuIHBhZ2VzCitcbmV3dG9rc1xvZGRoZWFkbGluZSAgICAgJSBoZWFkbGluZSBvbiBvZGQgcGFnZXMKK1xuZXd0b2tzXGV2ZW5mb290bGluZSAgICAlIGZvb3RsaW5lIG9uIGV2ZW4gcGFnZXMKK1xuZXd0b2tzXG9kZGZvb3RsaW5lICAgICAlIGZvb3RsaW5lIG9uIG9kZCBwYWdlcworCislIE5vdyBtYWtlIFRlWCB1c2UgdGhvc2UgdmFyaWFibGVzCitcaGVhZGxpbmU9e3tcdGV4dGZvbnRzXHJtIFxpZm9kZFxwYWdlbm8gXHRoZVxvZGRoZWFkbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbHNlIFx0aGVcZXZlbmhlYWRsaW5lIFxmaX19CitcZm9vdGxpbmU9e3tcdGV4dGZvbnRzXHJtIFxpZm9kZFxwYWdlbm8gXHRoZVxvZGRmb290bGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbHNlIFx0aGVcZXZlbmZvb3RsaW5lIFxmaX1cSEVBRElOR1Nob29rfQorXGxldFxIRUFESU5HU2hvb2s9XHJlbGF4CisKKyUgQ29tbWFuZHMgdG8gc2V0IHRob3NlIHZhcmlhYmxlcy4KKyUgRm9yIGV4YW1wbGUsIHRoaXMgaXMgd2hhdCAgQGhlYWRpbmdzIG9uICBkb2VzCislIEBldmVuaGVhZGluZyBAdGhpc3RpdGxlfEB0aGlzcGFnZXxAdGhpc2NoYXB0ZXIKKyUgQG9kZGhlYWRpbmcgQHRoaXNjaGFwdGVyfEB0aGlzcGFnZXxAdGhpc3RpdGxlCislIEBldmVuZm9vdGluZyBAdGhpc2ZpbGV8fAorJSBAb2RkZm9vdGluZyB8fEB0aGlzZmlsZQorCisKK1xkZWZcZXZlbmhlYWRpbmd7XHBhcnNlYXJnXGV2ZW5oZWFkaW5neHh4fQorXGRlZlxldmVuaGVhZGluZ3h4eCAjMXtcZXZlbmhlYWRpbmd5eXkgIzFcfFx8XHxcfFxmaW5pc2h9CitcZGVmXGV2ZW5oZWFkaW5neXl5ICMxXHwjMlx8IzNcfCM0XGZpbmlzaHslCitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQorCitcZGVmXG9kZGhlYWRpbmd7XHBhcnNlYXJnXG9kZGhlYWRpbmd4eHh9CitcZGVmXG9kZGhlYWRpbmd4eHggIzF7XG9kZGhlYWRpbmd5eXkgIzFcfFx8XHxcfFxmaW5pc2h9CitcZGVmXG9kZGhlYWRpbmd5eXkgIzFcfCMyXHwjM1x8IzRcZmluaXNoeyUKK1xnbG9iYWxcb2RkaGVhZGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KKworXHBhcnNlYXJnZGVmXGV2ZXJ5aGVhZGluZ3tcb2RkaGVhZGluZ3h4eHsjMX1cZXZlbmhlYWRpbmd4eHh7IzF9fSUKKworXGRlZlxldmVuZm9vdGluZ3tccGFyc2VhcmdcZXZlbmZvb3Rpbmd4eHh9CitcZGVmXGV2ZW5mb290aW5neHh4ICMxe1xldmVuZm9vdGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcZXZlbmZvb3Rpbmd5eXkgIzFcfCMyXHwjM1x8IzRcZmluaXNoeyUKK1xnbG9iYWxcZXZlbmZvb3RsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19CisKK1xkZWZcb2RkZm9vdGluZ3tccGFyc2Vhcmdcb2RkZm9vdGluZ3h4eH0KK1xkZWZcb2RkZm9vdGluZ3h4eCAjMXtcb2RkZm9vdGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcb2RkZm9vdGluZ3l5eSAjMVx8IzJcfCMzXHwjNFxmaW5pc2h7JQorICBcZ2xvYmFsXG9kZGZvb3RsaW5lID0ge1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fSUKKyAgJQorICAlIExlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBmb290bGluZS4gIEhvcGVmdWxseSBvayB0byBhc3N1bWUKKyAgJSBAZXZlbmZvb3Rpbmcgd2lsbCBub3QgYmUgdXNlZCBieSBpdHNlbGYuCisgIFxnbG9iYWxcYWR2YW5jZVxwYWdlaGVpZ2h0IGJ5IC1cYmFzZWxpbmVza2lwCisgIFxnbG9iYWxcYWR2YW5jZVx2c2l6ZSBieSAtXGJhc2VsaW5lc2tpcAorfQorCitccGFyc2VhcmdkZWZcZXZlcnlmb290aW5ne1xvZGRmb290aW5neHh4eyMxfVxldmVuZm9vdGluZ3h4eHsjMX19CisKKworJSBAaGVhZGluZ3MgZG91YmxlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIGRvdWJsZS1zaWRlZCBwcmludGluZy4KKyUgQGhlYWRpbmdzIHNpbmdsZSAgICAgIHR1cm5zIGhlYWRpbmdzIG9uIGZvciBzaW5nbGUtc2lkZWQgcHJpbnRpbmcuCislIEBoZWFkaW5ncyBvZmYgICAgICAgICB0dXJucyB0aGVtIG9mZi4KKyUgQGhlYWRpbmdzIG9uICAgICAgICAgIHNhbWUgYXMgQGhlYWRpbmdzIGRvdWJsZSwgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkuCislIEBoZWFkaW5ncyBhZnRlciAgICAgICB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgorJSBAaGVhZGluZ3MgZG91YmxlYWZ0ZXIgdHVybnMgb24gZG91YmxlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KKyUgQGhlYWRpbmdzIHNpbmdsZWFmdGVyIHR1cm5zIG9uIHNpbmdsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCislIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIG9mZiBhdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCwKKyUgYW5kIHR1cm5lZCBgb24nIGFmdGVyIEBlbmQgdGl0bGVwYWdlLgorCitcZGVmXGhlYWRpbmdzICMxIHtcY3NuYW1lIEhFQURJTkdTIzFcZW5kY3NuYW1lfQorCitcZGVmXEhFQURJTkdTb2ZmeyUKK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGhmaWx9IFxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfX0KK1xIRUFESU5HU29mZgorJSBXaGVuIHdlIHR1cm4gaGVhZGluZ3Mgb24sIHNldCB0aGUgcGFnZSBudW1iZXIgdG8gMS4KKyUgRm9yIGRvdWJsZS1zaWRlZCBwcmludGluZywgcHV0IGN1cnJlbnQgZmlsZSBuYW1lIGluIGxvd2VyIGxlZnQgY29ybmVyLAorJSBjaGFwdGVyIG5hbWUgb24gaW5zaWRlIHRvcCBvZiByaWdodCBoYW5kIHBhZ2VzLCBkb2N1bWVudAorJSB0aXRsZSBvbiBpbnNpZGUgdG9wIG9mIGxlZnQgaGFuZCBwYWdlcywgYW5kIHBhZ2UgbnVtYmVycyBvbiBvdXRzaWRlIHRvcAorJSBlZGdlIG9mIGFsbCBwYWdlcy4KK1xkZWZcSEVBRElOR1Nkb3VibGV7JQorXGdsb2JhbFxwYWdlbm89MQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9CitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XGZvbGlvXGhmaWxcdGhpc3RpdGxlfX0KK1xnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQorfQorXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCisKKyUgRm9yIHNpbmdsZS1zaWRlZCBwcmludGluZywgY2hhcHRlciB0aXRsZSBnb2VzIGFjcm9zcyB0b3AgbGVmdCBvZiBwYWdlLAorJSBwYWdlIG51bWJlciBvbiB0b3AgcmlnaHQuCitcZGVmXEhFQURJTkdTc2luZ2xleyUKK1xnbG9iYWxccGFnZW5vPTEKK1xnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KK1xnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKK30KK1xkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9CisKK1xkZWZcSEVBRElOR1NhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1Nkb3VibGV4fQorXGxldFxIRUFESU5HU2RvdWJsZWFmdGVyPVxIRUFESU5HU2FmdGVyCitcZGVmXEhFQURJTkdTZG91YmxleHslCitcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCit9CisKK1xkZWZcSEVBRElOR1NzaW5nbGVhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1NzaW5nbGV4fQorXGRlZlxIRUFESU5HU3NpbmdsZXh7JQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9CitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgorfQorCislIFN1YnJvdXRpbmVzIHVzZWQgaW4gZ2VuZXJhdGluZyBoZWFkaW5ncworJSBUaGlzIHByb2R1Y2VzIERheSBNb250aCBZZWFyIHN0eWxlIG9mIG91dHB1dC4KKyUgT25seSBkZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZCwgaW4gY2FzZSBhIHR4aS0/Py50ZXggZmlsZSBoYXMgc2V0CislIHVwIGEgZGlmZmVyZW50IGZvcm1hdCAoZS5nLiwgdHhpLWNzLnRleCBkb2VzIHRoaXMpLgorXGlmeFx0b2RheVx1bmRlZmluZWQKK1xkZWZcdG9kYXl7JQorICBcbnVtYmVyXGRheVxzcGFjZQorICBcaWZjYXNlXG1vbnRoCisgIFxvclxwdXR3b3JkTUphblxvclxwdXR3b3JkTUZlYlxvclxwdXR3b3JkTU1hclxvclxwdXR3b3JkTUFwcgorICBcb3JccHV0d29yZE1NYXlcb3JccHV0d29yZE1KdW5cb3JccHV0d29yZE1KdWxcb3JccHV0d29yZE1BdWcKKyAgXG9yXHB1dHdvcmRNU2VwXG9yXHB1dHdvcmRNT2N0XG9yXHB1dHdvcmRNTm92XG9yXHB1dHdvcmRNRGVjCisgIFxmaQorICBcc3BhY2VcbnVtYmVyXHllYXJ9CitcZmkKKworJSBAc2V0dGl0bGUgbGluZS4uLiAgc3BlY2lmaWVzIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQsIGZvciBoZWFkaW5ncy4KKyUgSXQgZ2VuZXJhdGVzIG5vIG91dHB1dCBvZiBpdHMgb3duLgorXGRlZlx0aGlzdGl0bGV7XHB1dHdvcmROb1RpdGxlfQorXGRlZlxzZXR0aXRsZXtccGFyc2Vhcmd7XGdkZWZcdGhpc3RpdGxlfX0KKworCitcbWVzc2FnZXt0YWJsZXMsfQorJSBUYWJsZXMgLS0gQHRhYmxlLCBAZnRhYmxlLCBAdnRhYmxlLCBAaXRlbSh4KS4KKworJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIHRhYmxlIHRleHQKK1xuZXdkaW1lblx0YWJsZWluZGVudCBcdGFibGVpbmRlbnQ9LjhpbgorJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIEBpdGVtaXplIGFuZCBAZW51bWVyYXRlIHRleHQKK1xuZXdkaW1lblxpdGVtaW5kZW50ICBcaXRlbWluZGVudD0uM2luCislIG1hcmdpbiBiZXR3ZWVuIGVuZCBvZiB0YWJsZSBpdGVtIGFuZCBzdGFydCBvZiB0YWJsZSB0ZXh0LgorXG5ld2RpbWVuXGl0ZW1tYXJnaW4gIFxpdGVtbWFyZ2luPS4xaW4KKworJSB1c2VkIGludGVybmFsbHkgZm9yIFxpdGVtaW5kZW50IG1pbnVzIFxpdGVtbWFyZ2luCitcbmV3ZGltZW5caXRlbW1heAorCislIE5vdGUgQHRhYmxlLCBAZnRhYmxlLCBhbmQgQHZ0YWJsZSBkZWZpbmUgQGl0ZW0sIEBpdGVteCwgZXRjLiwgd2l0aAorJSB0aGVzZSBkZWZzLgorJSBUaGV5IGFsc28gZGVmaW5lIFxpdGVtaW5kZXgKKyUgdG8gaW5kZXggdGhlIGl0ZW0gbmFtZSBpbiB3aGF0ZXZlciBtYW5uZXIgaXMgZGVzaXJlZCAocGVyaGFwcyBub25lKS4KKworXG5ld2lmXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXAKKworXGRlZlxpdGVteHBhcntccGFyXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXBcbm9icmVha1x2c2tpcC1ccGFyc2tpcFxub2JyZWFrXGZpfQorCitcZGVmXGludGVybmFsQml0ZW17XHNtYWxsYnJlYWsgXHBhcnNlYXJnXGl0ZW16enp9CitcZGVmXGludGVybmFsQml0ZW14e1xpdGVteHBhciBccGFyc2VhcmdcaXRlbXp6en0KKworXGRlZlxpdGVtenp6ICMxe1xiZWdpbmdyb3VwICUKKyAgXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKKyAgXGFkdmFuY2VcaHNpemUgYnkgLVx0YWJsZWluZGVudAorICBcc2V0Ym94MD1caGJveHtcaXRlbWluZGljYXRleyMxfX0lCisgIFxpdGVtaW5kZXh7IzF9JQorICBcbm9icmVhayAlIFRoaXMgcHJldmVudHMgYSBicmVhayBiZWZvcmUgQGl0ZW14LgorICAlCisgICUgSWYgdGhlIGl0ZW0gdGV4dCBkb2VzIG5vdCBmaXQgaW4gdGhlIHNwYWNlIHdlIGhhdmUsIHB1dCBpdCBvbiBhIGxpbmUKKyAgJSBieSBpdHNlbGYsIGFuZCBkbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhhdAorICAlIGxpbmUuICBXZSBkbyBub3Qgc3RhcnQgYSBwYXJhZ3JhcGggaGVyZSBiZWNhdXNlIHRoZW4gaWYgdGhlIG5leHQKKyAgJSBjb21tYW5kIGlzLCBlLmcuLCBAa2luZGV4LCB0aGUgd2hhdHNpdCB3b3VsZCBnZXQgcHV0IGludG8gdGhlCisgICUgaG9yaXpvbnRhbCBsaXN0IG9uIGEgbGluZSBieSBpdHNlbGYsIHJlc3VsdGluZyBpbiBleHRyYSBibGFuayBzcGFjZS4KKyAgXGlmZGltIFx3ZDA+XGl0ZW1tYXgKKyAgICAlCisgICAgJSBNYWtlIHRoaXMgYSBwYXJhZ3JhcGggc28gd2UgZ2V0IHRoZSBccGFyc2tpcCBnbHVlIGFuZCB3cmFwcGluZywKKyAgICAlIGJ1dCBsZWF2ZSBpdCByYWdnZWQtcmlnaHQuCisgICAgXGJlZ2luZ3JvdXAKKyAgICAgIFxhZHZhbmNlXGxlZnRza2lwIGJ5LVx0YWJsZWluZGVudAorICAgICAgXGFkdmFuY2VcaHNpemUgYnlcdGFibGVpbmRlbnQKKyAgICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieTBwdCBwbHVzMWZpbAorICAgICAgXGxlYXZldm1vZGVcdW5oYm94MFxwYXIKKyAgICBcZW5kZ3JvdXAKKyAgICAlCisgICAgJSBXZSdyZSBnb2luZyB0byBiZSBzdGFydGluZyBhIHBhcmFncmFwaCwgYnV0IHdlIGRvbid0IHdhbnQgdGhlCisgICAgJSBccGFyc2tpcCBnbHVlIC0tIGxvZ2ljYWxseSBpdCdzIHBhcnQgb2YgdGhlIEBpdGVtIHdlIGp1c3Qgc3RhcnRlZC4KKyAgICBcbm9icmVhayBcdnNraXAtXHBhcnNraXAKKyAgICAlCisgICAgJSBTdG9wIGEgcGFnZSBicmVhayBhdCB0aGUgXHBhcnNraXAgZ2x1ZSBjb21pbmcgdXAuICBIb3dldmVyLCBpZgorICAgICUgd2hhdCBmb2xsb3dzIGlzIGFuIGVudmlyb25tZW50IHN1Y2ggYXMgQGV4YW1wbGUsIHRoZXJlIHdpbGwgYmUgbm8KKyAgICAlIFxwYXJza2lwIGdsdWU7IHRoZW4gdGhlIG5lZ2F0aXZlIHZza2lwIHdlIGp1c3QgaW5zZXJ0ZWQgd291bGQKKyAgICAlIGNhdXNlIHRoZSBleGFtcGxlIGFuZCB0aGUgaXRlbSB0byBjcmFzaCB0b2dldGhlci4gIFNvIHdlIHVzZSB0aGlzCisgICAgJSBiaXphcnJlIHZhbHVlIG9mIDEwMDAxIGFzIGEgc2lnbmFsIHRvIFxhYm92ZWVudmJyZWFrIHRvIGluc2VydAorICAgICUgXHBhcnNraXAgZ2x1ZSBhZnRlciBhbGwuICBTZWN0aW9uIHRpdGxlcyBhcmUgaGFuZGxlZCB0aGlzIHdheSBhbHNvLgorICAgICUgCisgICAgXHBlbmFsdHkgMTAwMDEKKyAgICBcZW5kZ3JvdXAKKyAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXBmYWxzZQorICBcZWxzZQorICAgICUgVGhlIGl0ZW0gdGV4dCBmaXRzIGludG8gdGhlIHNwYWNlLiAgU3RhcnQgYSBwYXJhZ3JhcGgsIHNvIHRoYXQgdGhlCisgICAgJSBmb2xsb3dpbmcgdGV4dCAoaWYgYW55KSB3aWxsIGVuZCB1cCBvbiB0aGUgc2FtZSBsaW5lLgorICAgIFxub2luZGVudAorICAgICUgRG8gdGhpcyB3aXRoIGtlcm5zIGFuZCBcdW5oYm94IHNvIHRoYXQgaWYgdGhlcmUgaXMgYSBmb290bm90ZSBpbgorICAgICUgdGhlIGl0ZW0gdGV4dCwgaXQgY2FuIG1pZ3JhdGUgdG8gdGhlIG1haW4gdmVydGljYWwgbGlzdCBhbmQKKyAgICAlIGV2ZW50dWFsbHkgYmUgcHJpbnRlZC4KKyAgICBcbm9icmVha1xrZXJuLVx0YWJsZWluZGVudAorICAgIFxkaW1lbjAgPSBcaXRlbW1heCAgXGFkdmFuY2VcZGltZW4wIGJ5IFxpdGVtbWFyZ2luIFxhZHZhbmNlXGRpbWVuMCBieSAtXHdkMAorICAgIFx1bmhib3gwCisgICAgXG5vYnJlYWtca2VyblxkaW1lbjAKKyAgICBcZW5kZ3JvdXAKKyAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXB0cnVlCisgIFxmaQorfQorCitcZGVmXGl0ZW17XGVycm1lc3NhZ2V7QGl0ZW0gd2hpbGUgbm90IGluIGEgbGlzdCBlbnZpcm9ubWVudH19CitcZGVmXGl0ZW14e1xlcnJtZXNzYWdle0BpdGVteCB3aGlsZSBub3QgaW4gYSBsaXN0IGVudmlyb25tZW50fX0KKworJSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUuCitcZW52ZGVmXHRhYmxleyUKKyAgXGxldFxpdGVtaW5kZXhcZ29iYmxlCisgIFx0YWJsZWNoZWNre3RhYmxlfSUKK30KK1xlbnZkZWZcZnRhYmxleyUKKyAgXGRlZlxpdGVtaW5kZXggIyMxe1xkb2luZCB7Zm59e1xjb2RleyMjMX19fSUKKyAgXHRhYmxlY2hlY2t7ZnRhYmxlfSUKK30KK1xlbnZkZWZcdnRhYmxleyUKKyAgXGRlZlxpdGVtaW5kZXggIyMxe1xkb2luZCB7dnJ9e1xjb2RleyMjMX19fSUKKyAgXHRhYmxlY2hlY2t7dnRhYmxlfSUKK30KK1xkZWZcdGFibGVjaGVjayMxeyUKKyAgXGlmbnVtIFx0aGVcY2F0Y29kZWBcXl5NPVxhY3RpdmUKKyAgICBcZW5kZ3JvdXAKKyAgICBcZXJybWVzc2FnZXtUaGlzIGNvbW1hbmQgd29uJ3Qgd29yayBpbiB0aGlzIGNvbnRleHQ7IHBlcmhhcHMgdGhlIHByb2JsZW0gaXMKKyAgICAgIHRoYXQgd2UgYXJlIFxpbmVudmlyb25tZW50XHRoaXNlbnZ9JQorICAgIFxkZWZcbmV4dHtcZG9pZ25vcmV7IzF9fSUKKyAgXGVsc2UKKyAgICBcbGV0XG5leHRcdGFibGV4CisgIFxmaQorICBcbmV4dAorfQorXGRlZlx0YWJsZXgjMXslCisgIFxkZWZcaXRlbWluZGljYXRleyMxfSUKKyAgXHBhcnNlYXJnXHRhYmxleQorfQorXGRlZlx0YWJsZXkjMXslCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcZWRlZlx0ZW1we1xub2V4cGFuZFx0YWJsZXogIzFcc3BhY2Vcc3BhY2Vcc3BhY2V9JQorICAgIFxleHBhbmRhZnRlcgorICB9XHRlbXAgXGVuZHRhYmxlegorfQorXGRlZlx0YWJsZXogIzEgIzIgIzMgIzRcZW5kdGFibGV6eyUKKyAgXGFib3ZlZW52YnJlYWsKKyAgXGlmbnVtIDAjMT4wIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSAjMVxtaWwgXGZpCisgIFxpZm51bSAwIzI+MCBcdGFibGVpbmRlbnQ9IzJcbWlsIFxmaQorICBcaWZudW0gMCMzPjAgXGFkdmFuY2UgXHJpZ2h0c2tpcCBieSAjM1xtaWwgXGZpCisgIFxpdGVtbWF4PVx0YWJsZWluZGVudAorICBcYWR2YW5jZSBcaXRlbW1heCBieSAtXGl0ZW1tYXJnaW4KKyAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFx0YWJsZWluZGVudAorICBcZXhkZW50YW1vdW50PVx0YWJsZWluZGVudAorICBccGFyaW5kZW50ID0gMHB0CisgIFxwYXJza2lwID0gXHNtYWxsc2tpcGFtb3VudAorICBcaWZkaW0gXHBhcnNraXA9MHB0IFxwYXJza2lwPTJwdCBcZmkKKyAgXGxldFxpdGVtID0gXGludGVybmFsQml0ZW0KKyAgXGxldFxpdGVteCA9IFxpbnRlcm5hbEJpdGVteAorfQorXGRlZlxFdGFibGV7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha30KK1xsZXRcRWZ0YWJsZVxFdGFibGUKK1xsZXRcRXZ0YWJsZVxFdGFibGUKK1xsZXRcRWl0ZW1pemVcRXRhYmxlCitcbGV0XEVlbnVtZXJhdGVcRXRhYmxlCisKKyUgVGhpcyBpcyB0aGUgY291bnRlciB1c2VkIGJ5IEBlbnVtZXJhdGUsIHdoaWNoIGlzIHJlYWxseSBAaXRlbWl6ZQorCitcbmV3Y291bnQgXGl0ZW1ubworCitcZW52ZGVmXGl0ZW1pemV7XHBhcnNlYXJnXGRvaXRlbWl6ZX0KKworXGRlZlxkb2l0ZW1pemUjMXslCisgIFxhYm92ZWVudmJyZWFrCisgIFxpdGVtbWF4PVxpdGVtaW5kZW50CisgIFxhZHZhbmNlXGl0ZW1tYXggYnkgLVxpdGVtbWFyZ2luCisgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxpdGVtaW5kZW50CisgIFxleGRlbnRhbW91bnQ9XGl0ZW1pbmRlbnQKKyAgXHBhcmluZGVudD0wcHQKKyAgXHBhcnNraXA9XHNtYWxsc2tpcGFtb3VudAorICBcaWZkaW1ccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaQorICBcZGVmXGl0ZW1jb250ZW50c3sjMX0lCisgICUgQGl0ZW1pemUgd2l0aCBubyBhcmcgaXMgZXF1aXZhbGVudCB0byBAaXRlbWl6ZSBAYnVsbGV0LgorICBcaWZ4XGl0ZW1jb250ZW50c1xlbXB0eVxkZWZcaXRlbWNvbnRlbnRze1xidWxsZXR9XGZpCisgIFxsZXRcaXRlbT1caXRlbWl6ZWl0ZW0KK30KKworJSBEZWZpbml0aW9uIG9mIEBpdGVtIHdoaWxlIGluc2lkZSBAaXRlbWl6ZSBhbmQgQGVudW1lcmF0ZS4KKyUKK1xkZWZcaXRlbWl6ZWl0ZW17JQorICBcYWR2YW5jZVxpdGVtbm8gYnkgMSAgJSBmb3IgZW51bWVyYXRpb25zCisgIHtcbGV0XHBhcj1cZW5kZ3JhZiBcc21hbGxicmVha30lIHJlYXNvbmFibGUgcGxhY2UgdG8gYnJlYWsKKyAgeyUKKyAgICUgSWYgdGhlIGRvY3VtZW50IGhhcyBhbiBAaXRlbWl6ZSBkaXJlY3RseSBhZnRlciBhIHNlY3Rpb24gdGl0bGUsIGEKKyAgICUgXG5vYnJlYWsgd2lsbCBiZSBsYXN0IG9uIHRoZSBsaXN0LCBhbmQgXHNlY3Rpb25oZWFkaW5nIHdpbGwgaGF2ZQorICAgJSBkb25lIGEgXHZza2lwLVxwYXJza2lwLiAgSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHplcm8KKyAgICUgcGFyc2tpcCwgb3IgdGhlIGl0ZW0gdGV4dCB3aWxsIGNyYXNoIHdpdGggdGhlIGhlYWRpbmcuICBPbiB0aGUKKyAgICUgb3RoZXIgaGFuZCwgd2hlbiB0aGVyZSBpcyBub3JtYWwgdGV4dCBwcmVjZWRpbmcgdGhlIGl0ZW0gKGFzIHRoZXJlCisgICAlIHVzdWFsbHkgaXMpLCB3ZSBkbyB3YW50IHRvIHplcm8gcGFyc2tpcCwgb3IgdGhlcmUgd291bGQgYmUgdG9vIG11Y2gKKyAgICUgc3BhY2UuICBJbiB0aGF0IGNhc2UsIHdlIHdvbid0IGhhdmUgYSBcbm9icmVhayBiZWZvcmUuICBBdCBsZWFzdAorICAgJSB0aGF0J3MgdGhlIHRoZW9yeS4KKyAgIFxpZm51bVxsYXN0cGVuYWx0eTwxMDAwMCBccGFyc2tpcD0waW4gXGZpCisgICBcbm9pbmRlbnQKKyAgIFxoYm94IHRvIDBwdHtcaHNzIFxpdGVtY29udGVudHMgXGtlcm5caXRlbW1hcmdpbn0lCisgICBcdmFkanVzdHtccGVuYWx0eSAxMjAwfX0lIG5vdCBnb29kIHRvIGJyZWFrIGFmdGVyIGZpcnN0IGxpbmUgb2YgaXRlbS4KKyAgXGZsdXNoY3IKK30KKworJSBcc3BsaXRvZmYgVE9LRU5TXGVuZG1hcmsgZGVmaW5lcyBcZmlyc3QgdG8gYmUgdGhlIGZpcnN0IHRva2VuIGluCislIFRPS0VOUywgYW5kIFxyZXN0IHRvIGJlIHRoZSByZW1haW5kZXIuCislCitcZGVmXHNwbGl0b2ZmIzEjMlxlbmRtYXJre1xkZWZcZmlyc3R7IzF9XGRlZlxyZXN0eyMyfX0lCisKKyUgQWxsb3cgYW4gb3B0aW9uYWwgYXJndW1lbnQgb2YgYW4gdXBwZXJjYXNlIGxldHRlciwgbG93ZXJjYXNlIGxldHRlciwKKyUgb3IgbnVtYmVyLCB0byBzcGVjaWZ5IHRoZSBmaXJzdCBsYWJlbCBpbiB0aGUgZW51bWVyYXRlZCBsaXN0LiAgTm8KKyUgYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgYDEnLgorJQorXGVudnBhcnNlYXJnZGVmXGVudW1lcmF0ZXtcZW51bWVyYXRleSAjMSAgXGVuZGVudW1lcmF0ZXl9CitcZGVmXGVudW1lcmF0ZXkgIzEgIzJcZW5kZW51bWVyYXRleXslCisgICUgSWYgd2Ugd2VyZSBnaXZlbiBubyBhcmd1bWVudCwgcHJldGVuZCB3ZSB3ZXJlIGdpdmVuIGAxJy4KKyAgXGRlZlx0aGVhcmd7IzF9JQorICBcaWZ4XHRoZWFyZ1xlbXB0eSBcZGVmXHRoZWFyZ3sxfVxmaQorICAlCisgICUgRGV0ZWN0IGlmIHRoZSBhcmd1bWVudCBpcyBhIHNpbmdsZSB0b2tlbi4gIElmIHNvLCBpdCBtaWdodCBiZSBhCisgICUgbGV0dGVyLiAgT3RoZXJ3aXNlLCB0aGUgb25seSB2YWxpZCB0aGluZyBpdCBjYW4gYmUgaXMgYSBudW1iZXIuCisgICUgKFdlIHdpbGwgYWx3YXlzIGhhdmUgb25lIHRva2VuLCBiZWNhdXNlIG9mIHRoZSB0ZXN0IHdlIGp1c3QgbWFkZS4KKyAgJSBUaGlzIGlzIGEgZ29vZCB0aGluZywgc2luY2UgXHNwbGl0b2ZmIGRvZXNuJ3Qgd29yayBnaXZlbiBub3RoaW5nIGF0CisgICUgYWxsIC0tIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdW5kZWxpbWl0ZWQuKQorICBcZXhwYW5kYWZ0ZXJcc3BsaXRvZmZcdGhlYXJnXGVuZG1hcmsKKyAgXGlmeFxyZXN0XGVtcHR5CisgICAgJSBPbmx5IG9uZSB0b2tlbiBpbiB0aGUgYXJndW1lbnQuICBJdCBjb3VsZCBzdGlsbCBiZSBhbnl0aGluZy4KKyAgICAlIEEgYGBsb3dlcmNhc2UgbGV0dGVyJycgaXMgb25lIHdob3NlIFxsY2NvZGUgaXMgbm9uemVyby4KKyAgICAlIEFuIGBgdXBwZXJjYXNlIGxldHRlcicnIGlzIG9uZSB3aG9zZSBcbGNjb2RlIGlzIGJvdGggbm9uemVybywgYW5kCisgICAgJSAgIG5vdCBlcXVhbCB0byBpdHNlbGYuCisgICAgJSBPdGhlcndpc2UsIHdlIGFzc3VtZSBpdCdzIGEgbnVtYmVyLgorICAgICUKKyAgICAlIFdlIG5lZWQgdGhlIFxyZWxheCBhdCB0aGUgZW5kIG9mIHRoZSBcaWZudW0gbGluZXMgdG8gc3RvcCBUZVggZnJvbQorICAgICUgY29udGludWluZyB0byBsb29rIGZvciBhIDxudW1iZXI+LgorICAgICUKKyAgICBcaWZudW1cbGNjb2RlXGV4cGFuZGFmdGVyYFx0aGVhcmc9MFxyZWxheAorICAgICAgXG51bWVyaWNlbnVtZXJhdGUgJSBhIG51bWJlciAod2UgaG9wZSkKKyAgICBcZWxzZQorICAgICAgJSBJdCdzIGEgbGV0dGVyLgorICAgICAgXGlmbnVtXGxjY29kZVxleHBhbmRhZnRlcmBcdGhlYXJnPVxleHBhbmRhZnRlcmBcdGhlYXJnXHJlbGF4CisgICAgICAgIFxsb3dlcmNhc2VlbnVtZXJhdGUgJSBsb3dlcmNhc2UgbGV0dGVyCisgICAgICBcZWxzZQorICAgICAgICBcdXBwZXJjYXNlZW51bWVyYXRlICUgdXBwZXJjYXNlIGxldHRlcgorICAgICAgXGZpCisgICAgXGZpCisgIFxlbHNlCisgICAgJSBNdWx0aXBsZSB0b2tlbnMgaW4gdGhlIGFyZ3VtZW50LiAgV2UgaG9wZSBpdCdzIGEgbnVtYmVyLgorICAgIFxudW1lcmljZW51bWVyYXRlCisgIFxmaQorfQorCislIEFuIEBlbnVtZXJhdGUgd2hvc2UgbGFiZWxzIGFyZSBpbnRlZ2Vycy4gIFRoZSBzdGFydGluZyBpbnRlZ2VyIGlzCislIGdpdmVuIGluIFx0aGVhcmcuCislCitcZGVmXG51bWVyaWNlbnVtZXJhdGV7JQorICBcaXRlbW5vID0gXHRoZWFyZworICBcc3RhcnRlbnVtZXJhdGlvbntcdGhlXGl0ZW1ub30lCit9CisKKyUgVGhlIHN0YXJ0aW5nIChsb3dlcmNhc2UpIGxldHRlciBpcyBpbiBcdGhlYXJnLgorXGRlZlxsb3dlcmNhc2VlbnVtZXJhdGV7JQorICBcaXRlbW5vID0gXGV4cGFuZGFmdGVyYFx0aGVhcmcKKyAgXHN0YXJ0ZW51bWVyYXRpb257JQorICAgICUgQmUgc3VyZSB3ZSdyZSBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFscGhhYmV0LgorICAgIFxpZm51bVxpdGVtbm89MAorICAgICAgXGVycm1lc3NhZ2V7Tm8gbW9yZSBsb3dlcmNhc2UgbGV0dGVycyBpbiBAZW51bWVyYXRlOyBnZXQgYSBiaWdnZXIKKyAgICAgICAgICAgICAgICAgIGFscGhhYmV0fSUKKyAgICBcZmkKKyAgICBcY2hhclxsY2NvZGVcaXRlbW5vCisgIH0lCit9CisKKyUgVGhlIHN0YXJ0aW5nICh1cHBlcmNhc2UpIGxldHRlciBpcyBpbiBcdGhlYXJnLgorXGRlZlx1cHBlcmNhc2VlbnVtZXJhdGV7JQorICBcaXRlbW5vID0gXGV4cGFuZGFmdGVyYFx0aGVhcmcKKyAgXHN0YXJ0ZW51bWVyYXRpb257JQorICAgICUgQmUgc3VyZSB3ZSdyZSBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFscGhhYmV0LgorICAgIFxpZm51bVxpdGVtbm89MAorICAgICAgXGVycm1lc3NhZ2V7Tm8gbW9yZSB1cHBlcmNhc2UgbGV0dGVycyBpbiBAZW51bWVyYXRlOyBnZXQgYSBiaWdnZXIKKyAgICAgICAgICAgICAgICAgIGFscGhhYmV0fQorICAgIFxmaQorICAgIFxjaGFyXHVjY29kZVxpdGVtbm8KKyAgfSUKK30KKworJSBDYWxsIFxkb2l0ZW1pemUsIGFkZGluZyBhIHBlcmlvZCB0byB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIHN1cHBseWluZyB0aGUKKyUgY29tbW9uIGxhc3QgdHdvIGFyZ3VtZW50cy4gIEFsc28gc3VidHJhY3Qgb25lIGZyb20gdGhlIGluaXRpYWwgdmFsdWUgaW4KKyUgXGl0ZW1ubywgc2luY2UgQGl0ZW0gaW5jcmVtZW50cyBcaXRlbW5vLgorJQorXGRlZlxzdGFydGVudW1lcmF0aW9uIzF7JQorICBcYWR2YW5jZVxpdGVtbm8gYnkgLTEKKyAgXGRvaXRlbWl6ZXsjMS59XGZsdXNoY3IKK30KKworJSBAYWxwaGFlbnVtZXJhdGUgYW5kIEBjYXBzZW51bWVyYXRlIGFyZSBhYmJyZXZpYXRpb25zIGZvciBnaXZpbmcgYW4gYXJnCislIHRvIEBlbnVtZXJhdGUuCislCitcZGVmXGFscGhhZW51bWVyYXRle1xlbnVtZXJhdGV7YX19CitcZGVmXGNhcHNlbnVtZXJhdGV7XGVudW1lcmF0ZXtBfX0KK1xkZWZcRWFscGhhZW51bWVyYXRle1xFZW51bWVyYXRlfQorXGRlZlxFY2Fwc2VudW1lcmF0ZXtcRWVudW1lcmF0ZX0KKworCislIEBtdWx0aXRhYmxlIG1hY3JvcworJSBBbXkgSGVuZHJpY2tzb24sIDgvMTgvOTQsIDMvNi85NgorJQorJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIHdpbGwgbWFrZSBhcyBtYW55IGNvbHVtbnMgYXMgZGVzaXJlZC4KKyUgQ29udGVudHMgb2YgZWFjaCBjb2x1bW4gd2lsbCB3cmFwIGF0IHdpZHRoIGdpdmVuIGluIHByZWFtYmxlLiAgV2lkdGgKKyUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgd2l0aCBzYW1wbGUgdGV4dCBnaXZlbiBpbiBhIHRlbXBsYXRlIGxpbmUsCislIG9yIGluIHBlcmNlbnQgb2YgXGhzaXplLCB0aGUgY3VycmVudCB3aWR0aCBvZiB0ZXh0IG9uIHBhZ2UuCisKKyUgVGFibGUgY2FuIGNvbnRpbnVlIG92ZXIgcGFnZXMgYnV0IHdpbGwgb25seSBicmVhayBiZXR3ZWVuIGxpbmVzLgorCislIFRvIG1ha2UgcHJlYW1ibGU6CislCislIEVpdGhlciBkZWZpbmUgd2lkdGhzIG9mIGNvbHVtbnMgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemU6CislICAgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMjUgLjMgLjQ1CislICAgQGl0ZW0gLi4uCislCislICAgTnVtYmVycyBmb2xsb3dpbmcgQGNvbHVtbmZyYWN0aW9ucyBhcmUgdGhlIHBlcmNlbnQgb2YgdGhlIHRvdGFsCislICAgY3VycmVudCBoc2l6ZSB0byBiZSB1c2VkIGZvciBlYWNoIGNvbHVtbi4gWW91IG1heSB1c2UgYXMgbWFueQorJSAgIGNvbHVtbnMgYXMgZGVzaXJlZC4KKworCislIE9yIHVzZSBhIHRlbXBsYXRlOgorJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9CislICAgQGl0ZW0gLi4uCislICAgdXNpbmcgdGhlIHdpZGVzdCB0ZXJtIGRlc2lyZWQgaW4gZWFjaCBjb2x1bW4uCisKKyUgRWFjaCBuZXcgdGFibGUgbGluZSBzdGFydHMgd2l0aCBAaXRlbSwgZWFjaCBzdWJzZXF1ZW50IG5ldyBjb2x1bW4KKyUgc3RhcnRzIHdpdGggQHRhYi4gRW1wdHkgY29sdW1ucyBtYXkgYmUgcHJvZHVjZWQgYnkgc3VwcGx5aW5nIEB0YWIncworJSB3aXRoIG5vdGhpbmcgYmV0d2VlbiB0aGVtIGZvciBhcyBtYW55IHRpbWVzIGFzIGVtcHR5IGNvbHVtbnMgYXJlIG5lZWRlZCwKKyUgaWUsIEB0YWJAdGFiQHRhYiB3aWxsIHByb2R1Y2UgdHdvIGVtcHR5IGNvbHVtbnMuCisKKyUgQGl0ZW0sIEB0YWIgZG8gbm90IG5lZWQgdG8gYmUgb24gdGhlaXIgb3duIGxpbmVzLCBidXQgaXQgd2lsbCBub3QgaHVydAorJSBpZiB0aGV5IGFyZS4KKworJSBTYW1wbGUgbXVsdGl0YWJsZToKKworJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9CislICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZiBAdGFiIHRoaXJkIGNvbAorJSAgIEBpdGVtCislICAgZmlyc3QgY29sIHN0dWZmCislICAgQHRhYgorJSAgIHNlY29uZCBjb2wgc3R1ZmYKKyUgICBAdGFiCislICAgdGhpcmQgY29sCislICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZgorJSAgIEB0YWIgTWFueSBwYXJhZ3JhcGhzIG9mIHRleHQgbWF5IGJlIHVzZWQgaW4gYW55IGNvbHVtbi4KKyUKKyUgICAgICAgICBUaGV5IHdpbGwgd3JhcCBhdCB0aGUgd2lkdGggZGV0ZXJtaW5lZCBieSB0aGUgdGVtcGxhdGUuCislICAgQGl0ZW1AdGFiQHRhYiBUaGlzIHdpbGwgYmUgaW4gdGhpcmQgY29sdW1uLgorJSAgIEBlbmQgbXVsdGl0YWJsZQorCislIERlZmF1bHQgZGltZW5zaW9ucyBtYXkgYmUgcmVzZXQgYnkgdXNlci4KKyUgQG11bHRpdGFibGVwYXJza2lwIGlzIHZlcnRpY2FsIHNwYWNlIGJldHdlZW4gcGFyYWdyYXBocyBpbiB0YWJsZS4KKyUgQG11bHRpdGFibGVwYXJpbmRlbnQgaXMgcGFyYWdyYXBoIGluZGVudCBpbiB0YWJsZS4KKyUgQG11bHRpdGFibGVjb2xtYXJnaW4gaXMgaG9yaXpvbnRhbCBzcGFjZSB0byBiZSBsZWZ0IGJldHdlZW4gY29sdW1ucy4KKyUgQG11bHRpdGFibGVsaW5lc3BhY2UgaXMgc3BhY2UgdG8gbGVhdmUgYmV0d2VlbiB0YWJsZSBpdGVtcywgYmFzZWxpbmUKKyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiYXNlbGluZS4KKyUgICAwcHQgbWVhbnMgaXQgZGVwZW5kcyBvbiBjdXJyZW50IG5vcm1hbCBsaW5lIHNwYWNpbmcuCislCitcbmV3c2tpcFxtdWx0aXRhYmxlcGFyc2tpcAorXG5ld3NraXBcbXVsdGl0YWJsZXBhcmluZGVudAorXG5ld2RpbWVuXG11bHRpdGFibGVjb2xzcGFjZQorXG5ld3NraXBcbXVsdGl0YWJsZWxpbmVzcGFjZQorXG11bHRpdGFibGVwYXJza2lwPTBwdAorXG11bHRpdGFibGVwYXJpbmRlbnQ9NnB0CitcbXVsdGl0YWJsZWNvbHNwYWNlPTEycHQKK1xtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAorCislIE1hY3JvcyB1c2VkIHRvIHNldCB1cCBoYWxpZ24gcHJlYW1ibGU6CislCitcbGV0XGVuZHNldHVwdGFibGVccmVsYXgKK1xkZWZceGVuZHNldHVwdGFibGV7XGVuZHNldHVwdGFibGV9CitcbGV0XGNvbHVtbmZyYWN0aW9uc1xyZWxheAorXGRlZlx4Y29sdW1uZnJhY3Rpb25ze1xjb2x1bW5mcmFjdGlvbnN9CitcbmV3aWZcaWZzZXRwZXJjZW50CisKKyUgIzEgaXMgdGhlIEBjb2x1bW5mcmFjdGlvbiwgdXN1YWxseSBhIGRlY2ltYWwgbnVtYmVyIGxpa2UgLjUsIGJ1dCBtaWdodAorJSBiZSBqdXN0IDEuICBXZSBqdXN0IHVzZSBpdCwgd2hhdGV2ZXIgaXQgaXMuCislCitcZGVmXHBpY2t1cHdob2xlZnJhY3Rpb24jMSB7JQorICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMQorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWV7IzFcaHNpemV9JQorICBcc2V0dXB0YWJsZQorfQorCitcbmV3Y291bnRcY29sY291bnQKK1xkZWZcc2V0dXB0YWJsZSMxeyUKKyAgXGRlZlxmaXJzdGFyZ3sjMX0lCisgIFxpZnhcZmlyc3RhcmdceGVuZHNldHVwdGFibGUKKyAgICBcbGV0XGdvID0gXHJlbGF4CisgIFxlbHNlCisgICAgXGlmeFxmaXJzdGFyZ1x4Y29sdW1uZnJhY3Rpb25zCisgICAgICBcZ2xvYmFsXHNldHBlcmNlbnR0cnVlCisgICAgXGVsc2UKKyAgICAgIFxpZnNldHBlcmNlbnQKKyAgICAgICAgIFxsZXRcZ29ccGlja3Vwd2hvbGVmcmFjdGlvbgorICAgICAgXGVsc2UKKyAgICAgICAgIFxnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieSAxCisgICAgICAgICBcc2V0Ym94MD1caGJveHsjMVx1bnNraXBcc3BhY2V9JSBBZGQgYSBub3JtYWwgd29yZCBzcGFjZSBhcyBhCisgICAgICAgICAgICAgICAgICAgJSBzZXBhcmF0b3I7IHR5cGljYWxseSB0aGF0IGlzIGFsd2F5cyBpbiB0aGUgaW5wdXQsIGFueXdheS4KKyAgICAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXtcdGhlXHdkMH0lCisgICAgICBcZmkKKyAgICBcZmkKKyAgICBcaWZ4XGdvXHBpY2t1cHdob2xlZnJhY3Rpb24KKyAgICAgICUgUHV0IHRoZSBhcmd1bWVudCBiYWNrIGZvciB0aGUgXHBpY2t1cHdob2xlZnJhY3Rpb24gY2FsbCwgc28KKyAgICAgICUgd2UnbGwgYWx3YXlzIGhhdmUgYSBwZXJpb2QgdGhlcmUgdG8gYmUgcGFyc2VkLgorICAgICAgXGRlZlxnb3tccGlja3Vwd2hvbGVmcmFjdGlvbiMxfSUKKyAgICBcZWxzZQorICAgICAgXGxldFxnbyA9IFxzZXR1cHRhYmxlCisgICAgXGZpJQorICBcZmkKKyAgXGdvCit9CisKKyUgbXVsdGl0YWJsZS1vbmx5IGNvbW1hbmRzLgorJQorJSBAaGVhZGl0ZW0gc3RhcnRzIGEgaGVhZGluZyByb3csIHdoaWNoIHdlIHR5cGVzZXQgaW4gYm9sZC4KKyUgQXNzaWdubWVudHMgaGF2ZSB0byBiZSBnbG9iYWwgc2luY2Ugd2UgYXJlIGluc2lkZSB0aGUgaW1wbGljaXQgZ3JvdXAKKyUgb2YgYW4gYWxpZ25tZW50IGVudHJ5LiAgTm90ZSB0aGF0IFxldmVyeWNyIHJlc2V0cyBcZXZlcnl0YWIuCitcZGVmXGhlYWRpdGVte1xjaGVja2VudlxtdWx0aXRhYmxlIFxjcmNyIFxnbG9iYWxcZXZlcnl0YWI9e1xiZn1cdGhlXGV2ZXJ5dGFifSUKKyUKKyUgQSBcdGFiIHVzZWQgdG8gaW5jbHVkZSBcaHNraXAxc3AuICBCdXQgdGhlbiB0aGUgc3BhY2UgaW4gYSB0ZW1wbGF0ZQorJSBsaW5lIGlzIG5vdCBlbm91Z2guICBUaGF0IGlzIGJhZC4gIFNvIGxldCdzIGdvIGJhY2sgdG8ganVzdCBgJicgdW50aWwKKyUgd2UgZW5jb3VudGVyIHRoZSBwcm9ibGVtIGl0IHdhcyBpbnRlbmRlZCB0byBzb2x2ZSBhZ2Fpbi4KKyUJCQkJCS0ta2FybCwgbmF0aGFuQGFjbS5vcmcsIDIwYXByOTkuCitcZGVmXHRhYntcY2hlY2tlbnZcbXVsdGl0YWJsZSAmXHRoZVxldmVyeXRhYn0lCisKKyUgQG11bHRpdGFibGUgLi4uIEBlbmQgbXVsdGl0YWJsZSBkZWZpbml0aW9uczoKKyUKK1xuZXd0b2tzXGV2ZXJ5dGFiICAlIGluc2VydCBhZnRlciBldmVyeSB0YWIuCislCitcZW52ZGVmXG11bHRpdGFibGV7JQorICBcdnNraXBccGFyc2tpcAorICBcc3RhcnRzYXZpbmdpbnNlcnRzCisgICUKKyAgJSBAaXRlbSB3aXRoaW4gYSBtdWx0aXRhYmxlIHN0YXJ0cyBhIG5vcm1hbCByb3cuCisgICUgV2UgdXNlIFxkZWYgaW5zdGVhZCBvZiBcbGV0IHNvIHRoYXQgaWYgb25lIG9mIHRoZSBtdWx0aXRhYmxlIGVudHJpZXMKKyAgJSBjb250YWlucyBhbiBAaXRlbWl6ZSwgd2UgZG9uJ3QgY2hva2Ugb24gdGhlIFxpdGVtIChzZWVuIGFzIFxjcmNyIGFrYQorICAlIFxlbmR0ZW1wbGF0ZSkgZXhwYW5kaW5nIFxkb2l0ZW1pemUuCisgIFxkZWZcaXRlbXtcY3Jjcn0lCisgICUKKyAgXHRvbGVyYW5jZT05NTAwCisgIFxoYmFkbmVzcz05NTAwCisgIFxzZXRtdWx0aXRhYmxlc3BhY2luZworICBccGFyc2tpcD1cbXVsdGl0YWJsZXBhcnNraXAKKyAgXHBhcmluZGVudD1cbXVsdGl0YWJsZXBhcmluZGVudAorICBcb3ZlcmZ1bGxydWxlPTBwdAorICBcZ2xvYmFsXGNvbGNvdW50PTAKKyAgJQorICBcZXZlcnljciA9IHslCisgICAgXG5vYWxpZ257JQorICAgICAgXGdsb2JhbFxldmVyeXRhYj17fSUKKyAgICAgIFxnbG9iYWxcY29sY291bnQ9MCAlIFJlc2V0IHRoZSBjb2x1bW4gY291bnRlci4KKyAgICAgICUgQ2hlY2sgZm9yIHNhdmVkIGZvb3Rub3RlcywgZXRjLgorICAgICAgXGNoZWNraW5zZXJ0cworICAgICAgJSBLZWVwcyB1bmRlcmZ1bGwgYm94IG1lc3NhZ2VzIG9mZiB3aGVuIHRhYmxlIGJyZWFrcyBvdmVyIHBhZ2VzLgorICAgICAgJVxmaWxicmVhaworCSUgTWF5YmUgc28sIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgcmVhbGx5IHdlaXJkIHBhZ2UgYnJlYWtzIHdoZW4gdGhlCisJJSB0YWJsZSBicmVha3Mgb3ZlciBwYWdlcy4gV291bGRuJ3QgXHZmaWwgYmUgYmV0dGVyPyAgV2FpdCB1bnRpbCB0aGUKKwklIHByb2JsZW0gbWFuaWZlc3RzIGl0c2VsZiwgc28gaXQgY2FuIGJlIGZpeGVkIGZvciByZWFsIC0ta2FybC4KKyAgICB9JQorICB9JQorICAlCisgIFxwYXJzZWFyZ1xkb211bHRpdGFibGUKK30KK1xkZWZcZG9tdWx0aXRhYmxlIzF7JQorICAlIFRvIHBhcnNlIGV2ZXJ5dGhpbmcgYmV0d2VlbiBAbXVsdGl0YWJsZSBhbmQgQGl0ZW06CisgIFxzZXR1cHRhYmxlIzEgXGVuZHNldHVwdGFibGUKKyAgJQorICAlIFRoaXMgcHJlYW1ibGUgc2V0cyB1cCBhIGdlbmVyaWMgY29sdW1uIGRlZmluaXRpb24sIHdoaWNoIHdpbGwKKyAgJSBiZSB1c2VkIGFzIG1hbnkgdGltZXMgYXMgdXNlciBjYWxscyBmb3IgY29sdW1ucy4KKyAgJSBcdnRvcCB3aWxsIHNldCBhIHNpbmdsZSBsaW5lIGFuZCB3aWxsIGFsc28gbGV0IHRleHQgd3JhcCBhbmQKKyAgJSBjb250aW51ZSBmb3IgbWFueSBwYXJhZ3JhcGhzIGlmIGRlc2lyZWQuCisgIFxoYWxpZ25cYmdyb3VwICYlCisgICAgXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5IDEKKyAgICBcbXVsdGlzdHJ1dAorICAgIFx2dG9weyUKKyAgICAgICUgVXNlIHRoZSBjdXJyZW50IFxjb2xjb3VudCB0byBmaW5kIHRoZSBjb3JyZWN0IGNvbHVtbiB3aWR0aDoKKyAgICAgIFxoc2l6ZT1cZXhwYW5kYWZ0ZXJcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1lCisgICAgICAlCisgICAgICAlIEluIG9yZGVyIHRvIGtlZXAgZW50cmllcyBmcm9tIGJ1bXBpbmcgaW50byBlYWNoIG90aGVyCisgICAgICAlIHdlIHdpbGwgYWRkIGEgXGxlZnRza2lwIG9mIFxtdWx0aXRhYmxlY29sc3BhY2UgdG8gYWxsIGNvbHVtbnMgYWZ0ZXIKKyAgICAgICUgdGhlIGZpcnN0IG9uZS4KKyAgICAgICUKKyAgICAgICUgSWYgYSB0ZW1wbGF0ZSBoYXMgYmVlbiB1c2VkLCB3ZSB3aWxsIGFkZCBcbXVsdGl0YWJsZWNvbHNwYWNlCisgICAgICAlIHRvIHRoZSB3aWR0aCBvZiBlYWNoIHRlbXBsYXRlIGVudHJ5LgorICAgICAgJQorICAgICAgJSBJZiB0aGUgdXNlciBoYXMgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplIHdlIHdpbGwKKyAgICAgICUgdXNlIHRoYXQgZGltZW5zaW9uIGFzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLCBhbmQgdGhlIFxsZWZ0c2tpcAorICAgICAgJSB3aWxsIGtlZXAgZW50cmllcyBmcm9tIGJ1bXBpbmcgaW50byBlYWNoIG90aGVyLiAgVGFibGUgd2lsbCBzdGFydCBhdAorICAgICAgJSBsZWZ0IG1hcmdpbiBhbmQgZmluYWwgY29sdW1uIHdpbGwganVzdGlmeSBhdCByaWdodCBtYXJnaW4uCisgICAgICAlCisgICAgICAlIE1ha2Ugc3VyZSB3ZSBkb24ndCBpbmhlcml0IFxyaWdodHNraXAgZnJvbSB0aGUgb3V0ZXIgZW52aXJvbm1lbnQuCisgICAgICBccmlnaHRza2lwPTBwdAorICAgICAgXGlmbnVtXGNvbGNvdW50PTEKKwklIFRoZSBmaXJzdCBjb2x1bW4gd2lsbCBiZSBpbmRlbnRlZCB3aXRoIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgorCVxhZHZhbmNlXGhzaXplIGJ5XGxlZnRza2lwCisgICAgICBcZWxzZQorCVxpZnNldHBlcmNlbnQgXGVsc2UKKwkgICUgSWYgdXNlciBoYXMgbm90IHNldCBwcmVhbWJsZSBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZQorCSAgJSB3ZSB3aWxsIGFkdmFuY2UgXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UuCisJICBcYWR2YW5jZVxoc2l6ZSBieSBcbXVsdGl0YWJsZWNvbHNwYWNlCisJXGZpCisgICAgICAgJSBJbiBlaXRoZXIgY2FzZSB3ZSB3aWxsIG1ha2UgXGxlZnRza2lwPVxtdWx0aXRhYmxlY29sc3BhY2U6CisgICAgICBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZQorICAgICAgXGZpCisgICAgICAlIElnbm9yaW5nIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBhdm9pZHMgYW4gb2NjYXNpb25hbCBzcHVyaW91cworICAgICAgJSBibGFuayBsaW5lLCB3aGVuIFRlWCBkZWNpZGVzIHRvIGJyZWFrIHRoZSBsaW5lIGF0IHRoZSBzcGFjZSBiZWZvcmUgdGhlCisgICAgICAlIGJveCBmcm9tIHRoZSBtdWx0aXN0cnV0LCBzbyB0aGUgc3RydXQgZW5kcyB1cCBvbiBhIGxpbmUgYnkgaXRzZWxmLgorICAgICAgJSBGb3IgZXhhbXBsZToKKyAgICAgICUgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMTEgLjg5CisgICAgICAlIEBpdGVtIEBjb2RleyN9CisgICAgICAlIEB0YWIgTGVnYWwgaG9saWRheSB3aGljaCBpcyB2YWxpZCBpbiBtYWpvciBwYXJ0cyBvZiB0aGUgd2hvbGUgY291bnRyeS4KKyAgICAgICUgSXMgYXV0b21hdGljYWxseSBwcm92aWRlZCB3aXRoIGhpZ2hsaWdodGluZyBzZXF1ZW5jZXMgcmVzcGVjdGl2ZWx5CisgICAgICAlIG1hcmtpbmcgY2hhcmFjdGVycy4KKyAgICAgIFxub2luZGVudFxpZ25vcmVzcGFjZXMjI1x1bnNraXBcbXVsdGlzdHJ1dAorICAgIH1cY3IKK30KK1xkZWZcRW11bHRpdGFibGV7JQorICBcY3JjcgorICBcZWdyb3VwICUgZW5kIHRoZSBcaGFsaWduCisgIFxnbG9iYWxcc2V0cGVyY2VudGZhbHNlCit9CisKK1xkZWZcc2V0bXVsdGl0YWJsZXNwYWNpbmd7JQorICBcZGVmXG11bHRpc3RydXR7XHN0cnV0fSUganVzdCB1c2UgdGhlIHN0YW5kYXJkIGxpbmUgc3BhY2luZworICAlCisgICUgQ29tcHV0ZSBcbXVsdGl0YWJsZWxpbmVzcGFjZSAoaWYgbm90IGRlZmluZWQgYnkgdXNlcikgZm9yIHVzZSBpbgorICAlIFxtdWx0aXRhYmxlcGFyc2tpcCBjYWxjdWxhdGlvbi4gIFdlIHVzZWQgZGVmaW5lIFxtdWx0aXN0cnV0IGJhc2VkIG9uCisgICUgdGhpcywgYnV0IChpcm9uaWNhbGx5KSB0aGF0IGNhdXNlZCB0aGUgc3BhY2luZyB0byBiZSBvZmYuCisgICUgU2VlIGJ1Zy10ZXhpbmZvIHJlcG9ydCBmcm9tIFdlcm5lciBMZW1iZXJnLCAzMSBPY3QgMjAwNCAxMjo1MjoyMCArMDEwMC4KK1xpZmRpbVxtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAorXHNldGJveDA9XHZib3h7WH1cZ2xvYmFsXG11bHRpdGFibGVsaW5lc3BhY2U9XHRoZVxiYXNlbGluZXNraXAKK1xnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlbGluZXNwYWNlIGJ5LVxodDAKK1xmaQorJSUgVGVzdCB0byBzZWUgaWYgcGFyc2tpcCBpcyBsYXJnZXIgdGhhbiBzcGFjZSBiZXR3ZWVuIGxpbmVzIG9mCislJSB0YWJsZS4gSWYgbm90LCBkbyBub3RoaW5nLgorJSUgICAgICAgIElmIHNvLCBzZXQgdG8gc2FtZSBkaW1lbnNpb24gYXMgbXVsdGl0YWJsZWxpbmVzcGFjZS4KK1xpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD5cbXVsdGl0YWJsZWxpbmVzcGFjZQorXGdsb2JhbFxtdWx0aXRhYmxlcGFyc2tpcD1cbXVsdGl0YWJsZWxpbmVzcGFjZQorXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlJSB0byBrZWVwIHBhcnNraXAgc29tZXdoYXQgc21hbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCitcZmklCitcaWZkaW1cbXVsdGl0YWJsZXBhcnNraXA9MHB0CitcZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCitcZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KK1xmaX0KKworCitcbWVzc2FnZXtjb25kaXRpb25hbHMsfQorCislIEBpZnRleCwgQGlmbm90ZG9jYm9vaywgQGlmbm90aHRtbCwgQGlmbm90aW5mbywgQGlmbm90cGxhaW50ZXh0LAorJSBAaWZub3R4bWwgYWx3YXlzIHN1Y2NlZWQuICBUaGV5IGN1cnJlbnRseSBkbyBub3RoaW5nOyB3ZSBkb24ndAorJSBhdHRlbXB0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvbmRpdGlvbmFscyBhcmUgcHJvcGVybHkgbmVzdGVkLiAgQnV0IHdlCislIGhhdmUgdG8gcmVtZW1iZXIgdGhhdCB0aGV5IGFyZSBjb25kaXRpb25hbHMsIHNvIHRoYXQgQGVuZCBkb2Vzbid0CislIGF0dGVtcHQgdG8gY2xvc2UgYW4gZW52aXJvbm1lbnQgZ3JvdXAuCislCitcZGVmXG1ha2Vjb25kIzF7JQorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSAjMVxlbmRjc25hbWUgPSBccmVsYXgKKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgaXNjb25kLiMxXGVuZGNzbmFtZSA9IDEKK30KK1xtYWtlY29uZHtpZnRleH0KK1xtYWtlY29uZHtpZm5vdGRvY2Jvb2t9CitcbWFrZWNvbmR7aWZub3RodG1sfQorXG1ha2Vjb25ke2lmbm90aW5mb30KK1xtYWtlY29uZHtpZm5vdHBsYWludGV4dH0KK1xtYWtlY29uZHtpZm5vdHhtbH0KKworJSBJZ25vcmUgQGlnbm9yZSwgQGlmaHRtbCwgQGlmaW5mbywgYW5kIHRoZSBsaWtlLgorJQorXGRlZlxkaXJlbnRyeXtcZG9pZ25vcmV7ZGlyZW50cnl9fQorXGRlZlxkb2N1bWVudGRlc2NyaXB0aW9ue1xkb2lnbm9yZXtkb2N1bWVudGRlc2NyaXB0aW9ufX0KK1xkZWZcZG9jYm9va3tcZG9pZ25vcmV7ZG9jYm9va319CitcZGVmXGh0bWx7XGRvaWdub3Jle2h0bWx9fQorXGRlZlxpZmRvY2Jvb2t7XGRvaWdub3Jle2lmZG9jYm9va319CitcZGVmXGlmaHRtbHtcZG9pZ25vcmV7aWZodG1sfX0KK1xkZWZcaWZpbmZve1xkb2lnbm9yZXtpZmluZm99fQorXGRlZlxpZm5vdHRleHtcZG9pZ25vcmV7aWZub3R0ZXh9fQorXGRlZlxpZnBsYWludGV4dHtcZG9pZ25vcmV7aWZwbGFpbnRleHR9fQorXGRlZlxpZnhtbHtcZG9pZ25vcmV7aWZ4bWx9fQorXGRlZlxpZ25vcmV7XGRvaWdub3Jle2lnbm9yZX19CitcZGVmXG1lbnV7XGRvaWdub3Jle21lbnV9fQorXGRlZlx4bWx7XGRvaWdub3Jle3htbH19CisKKyUgSWdub3JlIHRleHQgdW50aWwgYSBsaW5lIGBAZW5kICMxJywga2VlcGluZyB0cmFjayBvZiBuZXN0ZWQgY29uZGl0aW9uYWxzLgorJQorJSBBIGNvdW50IHRvIHJlbWVtYmVyIHRoZSBkZXB0aCBvZiBuZXN0aW5nLgorXG5ld2NvdW50XGRvaWdub3JlY291bnQKKworXGRlZlxkb2lnbm9yZSMxe1xiZWdpbmdyb3VwCisgICUgU2NhbiBpbiBgYHZlcmJhdGltJycgbW9kZToKKyAgXG9iZXlsaW5lcworICBcY2F0Y29kZWBcQCA9IFxvdGhlcgorICBcY2F0Y29kZWBceyA9IFxvdGhlcgorICBcY2F0Y29kZWBcfSA9IFxvdGhlcgorICAlCisgICUgTWFrZSBzdXJlIHRoYXQgc3BhY2VzIHR1cm4gaW50byB0b2tlbnMgdGhhdCBtYXRjaCB3aGF0IFxkb2lnbm9yZXRleHQgd2FudHMuCisgIFxzcGFjZWlzc3BhY2UKKyAgJQorICAlIENvdW50IG51bWJlciBvZiAjMSdzIHRoYXQgd2UndmUgc2Vlbi4KKyAgXGRvaWdub3JlY291bnQgPSAwCisgICUKKyAgJSBTd2FsbG93IHRleHQgdW50aWwgd2UgcmVhY2ggdGhlIG1hdGNoaW5nIGBAZW5kICMxJy4KKyAgXGRvZG9pZ25vcmV7IzF9JQorfQorCit7IFxjYXRjb2RlYF89MTEgJSBXZSB3YW50IHRvIHVzZSBcX1NUT1BfIHdoaWNoIGNhbm5vdCBhcHBlYXIgaW4gdGV4aW5mbyBzb3VyY2UuCisgIFxvYmV5bGluZXMgJQorICAlCisgIFxnZGVmXGRvZG9pZ25vcmUjMXslCisgICAgJSAjMSBjb250YWlucyB0aGUgY29tbWFuZCBuYW1lIGFzIGEgc3RyaW5nLCBlLmcuLCBgaWZpbmZvJy4KKyAgICAlCisgICAgJSBEZWZpbmUgYSBjb21tYW5kIHRvIGZpbmQgdGhlIG5leHQgYEBlbmQgIzEnLgorICAgIFxsb25nXGRlZlxkb2lnbm9yZXRleHQjIzFeXk1AZW5kICMxeyUKKyAgICAgIFxkb2lnbm9yZXRleHR5eXkjIzFeXk1AIzFcX1NUT1BffSUKKyAgICAlCisgICAgJSBBbmQgdGhpcyBjb21tYW5kIHRvIGZpbmQgYW5vdGhlciAjMSBjb21tYW5kLCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgICAlIGxpbmUuICAoT3RoZXJ3aXNlLCB3ZSB3b3VsZCBjb25zaWRlciBhIGxpbmUgYEBjIEBpZnNldCcsIGZvcgorICAgICUgZXhhbXBsZSwgdG8gY291bnQgYXMgYW4gQGlmc2V0IGZvciBuZXN0aW5nLikKKyAgICBcbG9uZ1xkZWZcZG9pZ25vcmV0ZXh0eXl5IyMxXl5NQCMxIyMyXF9TVE9QX3tcZG9pZ25vcmV5eXl7IyMyfVxfU1RPUF99JQorICAgICUKKyAgICAlIEFuZCBub3cgZXhwYW5kIHRoYXQgY29tbWFuZC4KKyAgICBcZG9pZ25vcmV0ZXh0IF5eTSUKKyAgfSUKK30KKworXGRlZlxkb2lnbm9yZXl5eSMxeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGVtcHR5CQkJJSBOb3RoaW5nIGZvdW5kLgorICAgIFxsZXRcbmV4dFxkb2lnbm9yZXRleHR6enoKKyAgXGVsc2UJCQkJCSUgRm91bmQgYSBuZXN0ZWQgY29uZGl0aW9uLCAuLi4KKyAgICBcYWR2YW5jZVxkb2lnbm9yZWNvdW50IGJ5IDEKKyAgICBcbGV0XG5leHRcZG9pZ25vcmV0ZXh0eXl5CQklIC4uLiwgbG9vayBmb3IgYW5vdGhlci4KKyAgICAlIElmIHdlJ3JlIGhlcmUsICMxIGVuZHMgd2l0aCBeXk1caWZpbmZvIChmb3IgZXhhbXBsZSkuCisgIFxmaQorICBcbmV4dCAjMSUgdGhlIHRva2VuIFxfU1RPUF8gaXMgcHJlc2VudCBqdXN0IGFmdGVyIHRoaXMgbWFjcm8uCit9CisKKyUgV2UgaGF2ZSB0byBzd2FsbG93IHRoZSByZW1haW5pbmcgIlxfU1RPUF8iLgorJQorXGRlZlxkb2lnbm9yZXRleHR6enojMXslCisgIFxpZm51bVxkb2lnbm9yZWNvdW50ID0gMAklIFdlIGhhdmUganVzdCBmb3VuZCB0aGUgb3V0ZXJtb3N0IEBlbmQuCisgICAgXGxldFxuZXh0XGVuZGRvaWdub3JlCisgIFxlbHNlCQkJCSUgU3RpbGwgaW5zaWRlIGEgbmVzdGVkIGNvbmRpdGlvbi4KKyAgICBcYWR2YW5jZVxkb2lnbm9yZWNvdW50IGJ5IC0xCisgICAgXGxldFxuZXh0XGRvaWdub3JldGV4dCAgICAgICUgTG9vayBmb3IgdGhlIG5leHQgQGVuZC4KKyAgXGZpCisgIFxuZXh0Cit9CisKKyUgRmluaXNoIG9mZiBpZ25vcmVkIHRleHQuCit7IFxvYmV5bGluZXMlCisgICUgSWdub3JlIGFueXRoaW5nIGFmdGVyIHRoZSBsYXN0IGBAZW5kICMxJzsgdGhpcyBtYXR0ZXJzIGluIHZlcmJhdGltCisgICUgZW52aXJvbm1lbnRzLCB3aGVyZSBvdGhlcndpc2UgdGhlIG5ld2xpbmUgYWZ0ZXIgYW4gaWdub3JlZCBjb25kaXRpb25hbAorICAlIHdvdWxkIHJlc3VsdCBpbiBhIGJsYW5rIGxpbmUgaW4gdGhlIG91dHB1dC4KKyAgXGdkZWZcZW5kZG9pZ25vcmUjMV5eTXtcZW5kZ3JvdXBcaWdub3Jlc3BhY2VzfSUKK30KKworCislIEBzZXQgVkFSIHNldHMgdGhlIHZhcmlhYmxlIFZBUiB0byBhbiBlbXB0eSB2YWx1ZS4KKyUgQHNldCBWQVIgUkVTVC1PRi1MSU5FIHNldHMgVkFSIHRvIHRoZSB2YWx1ZSBSRVNULU9GLUxJTkUuCislCislIFNpbmNlIHdlIHdhbnQgdG8gc2VwYXJhdGUgVkFSIGZyb20gUkVTVC1PRi1MSU5FICh3aGljaCBtaWdodCBiZQorJSBlbXB0eSksIHdlIGNhbid0IGp1c3QgdXNlIFxwYXJzZWFyZzsgd2UgaGF2ZSB0byBpbnNlcnQgYSBzcGFjZSBvZiBvdXIKKyUgb3duIHRvIGRlbGltaXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGFuZCB0aGVuIHRha2UgaXQgb3V0IGFnYWluIGlmIHdlCislIGRpZG4ndCBuZWVkIGl0LgorJSBXZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgXHBhcnNlYXJnIHNldHMgXGNhdGNvZGVgXCA9MTAuCislCitccGFyc2VhcmdkZWZcc2V0e1xzZXR5eXkjMSBcZW5kc2V0eXl5fQorXGRlZlxzZXR5eXkjMSAjMlxlbmRzZXR5eXl7JQorICB7JQorICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgXGRlZlx0ZW1weyMyfSUKKyAgICBcZWRlZlxuZXh0e1xnZGVmXG1ha2Vjc25hbWV7U0VUIzF9fSUKKyAgICBcaWZ4XHRlbXBcZW1wdHkKKyAgICAgIFxuZXh0e30lCisgICAgXGVsc2UKKyAgICAgIFxzZXR6enojMlxlbmRzZXR6enoKKyAgICBcZmkKKyAgfSUKK30KKyUgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZSBcc2V0eHh4IGluc2VydGVkLgorXGRlZlxzZXR6enojMSBcZW5kc2V0enp6e1xuZXh0eyMxfX0KKworJSBAY2xlYXIgVkFSIGNsZWFycyAoaS5lLiwgdW5zZXRzKSB0aGUgdmFyaWFibGUgVkFSLgorJQorXHBhcnNlYXJnZGVmXGNsZWFyeyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVQjMVxlbmRjc25hbWU9XHJlbGF4CisgIH0lCit9CisKKyUgQHZhbHVle2Zvb30gZ2V0cyB0aGUgdGV4dCBzYXZlZCBpbiB2YXJpYWJsZSBmb28uCitcZGVmXHZhbHVle1xiZWdpbmdyb3VwXG1ha2V2YWx1ZWV4cGFuZGFibGVcdmFsdWV4eHh9CitcZGVmXHZhbHVleHh4IzF7XGV4cGFuZGFibGV2YWx1ZXsjMX1cZW5kZ3JvdXB9Cit7CisgIFxjYXRjb2RlYFwtID0gXGFjdGl2ZSBcY2F0Y29kZWBcXyA9IFxhY3RpdmUKKyAgJQorICBcZ2RlZlxtYWtldmFsdWVleHBhbmRhYmxleyUKKyAgICBcbGV0XHZhbHVlID0gXGV4cGFuZGFibGV2YWx1ZQorICAgICUgV2UgZG9uJ3Qgd2FudCB0aGVzZSBjaGFyYWN0ZXJzIGFjdGl2ZSwgLi4uCisgICAgXGNhdGNvZGVgXC09XG90aGVyIFxjYXRjb2RlYFxfPVxvdGhlcgorICAgICUgLi4uLCBidXQgd2UgbWlnaHQgZW5kIHVwIHdpdGggYWN0aXZlIG9uZXMgaW4gdGhlIGFyZ3VtZW50IGlmCisgICAgJSB3ZSdyZSBjYWxsZWQgZnJvbSBAY29kZSwgYXMgQGNvZGV7QHZhbHVle2Zvby1iYXJffX0sIHRob3VnaC4KKyAgICAlIFNvIFxsZXQgdGhlbSB0byB0aGVpciBub3JtYWwgZXF1aXZhbGVudHMuCisgICAgXGxldC1ccmVhbGRhc2ggXGxldF9cbm9ybWFsdW5kZXJzY29yZQorICB9Cit9CisKKyUgV2UgaGF2ZSB0aGlzIHN1YnJvdXRpbmUgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGF0IGxlYXN0IHNvbWUgQHZhbHVlJ3MKKyUgcHJvcGVybHkgaW4gaW5kZXhlcyAod2UgY2FsbCBcbWFrZXZhbHVlZXhwYW5kYWJsZSBpbiBcaW5kZXhkdW1taWVzKS4KKyUgVGhlIGNvbW1hbmQgaGFzIHRvIGJlIGZ1bGx5IGV4cGFuZGFibGUgKGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQpLCBzaW5jZQorJSB0aGUgcmVzdWx0IHdpbmRzIHVwIGluIHRoZSBpbmRleCBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IGlmIHRoZQorJSB2YXJpYWJsZSdzIHZhbHVlIGNvbnRhaW5zIG90aGVyIFRleGluZm8gY29tbWFuZHMsIGl0J3MgYWxtb3N0IGNlcnRhaW4KKyUgaXQgd2lsbCBmYWlsIChhbHRob3VnaCBwZXJoYXBzIHdlIGNvdWxkIGZpeCB0aGF0IHdpdGggc3VmZmljaWVudCB3b3JrCislIHRvIGRvIGEgb25lLWxldmVsIGV4cGFuc2lvbiBvbiB0aGUgcmVzdWx0LCBpbnN0ZWFkIG9mIGNvbXBsZXRlKS4KKyUKK1xkZWZcZXhwYW5kYWJsZXZhbHVlIzF7JQorICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKKyAgICB7W05vIHZhbHVlIGZvciBgYCMxJyddfSUKKyAgICBcbWVzc2FnZXtWYXJpYWJsZSBgIzEnLCB1c2VkIGluIEB2YWx1ZSwgaXMgbm90IHNldC59JQorICBcZWxzZQorICAgIFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lCisgIFxmaQorfQorCislIEBpZnNldCBWQVIgLi4uIEBlbmQgaWZzZXQgcmVhZHMgdGhlIGAuLi4nIGlmZiBWQVIgaGFzIGJlZW4gZGVmaW5lZAorJSB3aXRoIEBzZXQuCislCislIFRvIGdldCBzcGVjaWFsIHRyZWF0bWVudCBvZiBgQGVuZCBpZnNldCwnIGNhbGwgXG1ha2VvbmQgYW5kIHRoZSByZWRlZmluZS4KKyUKK1xtYWtlY29uZHtpZnNldH0KK1xkZWZcaWZzZXR7XHBhcnNlYXJne1xkb2lmc2V0e1xsZXRcbmV4dD1caWZzZXRmYWlsfX19CitcZGVmXGRvaWZzZXQjMSMyeyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxsZXRcbmV4dD1cZW1wdHkKKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMlxlbmRjc25hbWVccmVsYXgKKyAgICAgICMxJSBJZiBub3Qgc2V0LCByZWRlZmluZSBcbmV4dC4KKyAgICBcZmkKKyAgICBcZXhwYW5kYWZ0ZXIKKyAgfVxuZXh0Cit9CitcZGVmXGlmc2V0ZmFpbHtcZG9pZ25vcmV7aWZzZXR9fQorCislIEBpZmNsZWFyIFZBUiAuLi4gQGVuZCBpZmNsZWFyIHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBuZXZlciBiZWVuCislIGRlZmluZWQgd2l0aCBAc2V0LCBvciBoYXMgYmVlbiB1bmRlZmluZWQgd2l0aCBAY2xlYXIuCislCislIFRoZSBgXGVsc2UnIGluc2lkZSB0aGUgYFxkb2lmc2V0JyBwYXJhbWV0ZXIgaXMgYSB0cmljayB0byByZXVzZSB0aGUKKyUgYWJvdmUgY29kZTogaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBzZXQsIGRvIG5vdGhpbmcsIGlmIGl0IGlzIHNldCwKKyUgdGhlbiByZWRlZmluZSBcbmV4dCB0byBcaWZjbGVhcmZhaWwuCislCitcbWFrZWNvbmR7aWZjbGVhcn0KK1xkZWZcaWZjbGVhcntccGFyc2Vhcmd7XGRvaWZzZXR7XGVsc2UgXGxldFxuZXh0PVxpZmNsZWFyZmFpbH19fQorXGRlZlxpZmNsZWFyZmFpbHtcZG9pZ25vcmV7aWZjbGVhcn19CisKKyUgQGRpcmNhdGVnb3J5IENBVEVHT1JZICAtLSBzcGVjaWZ5IGEgY2F0ZWdvcnkgb2YgdGhlIGRpciBmaWxlCislIHdoaWNoIHRoaXMgZmlsZSBzaG91bGQgYmVsb25nIHRvLiAgSWdub3JlIHRoaXMgaW4gVGVYLgorXGxldFxkaXJjYXRlZ29yeT1cY29tbWVudAorCislIEBkZWZpbmluZm9lbmNsb3NlLgorXGxldFxkZWZpbmZvZW5jbG9zZT1cY29tbWVudAorCisKK1xtZXNzYWdle2luZGV4aW5nLH0KKyUgSW5kZXggZ2VuZXJhdGlvbiBmYWNpbGl0aWVzCisKKyUgRGVmaW5lIFxuZXd3cml0ZSB0byBiZSBpZGVudGljYWwgdG8gcGxhaW4gdGV4J3MgXG5ld3dyaXRlCislIGV4Y2VwdCBub3QgXG91dGVyLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gbWFjcm9zIGFuZCBcaWYncy4KK1xlZGVmXG5ld3dyaXRle1xtYWtlY3NuYW1le3B0ZXhuZXd3cml0ZX19CisKKyUgXG5ld2luZGV4IHtmb299IGRlZmluZXMgYW4gaW5kZXggbmFtZWQgZm9vLgorJSBJdCBhdXRvbWF0aWNhbGx5IGRlZmluZXMgXGZvb2luZGV4IHN1Y2ggdGhhdAorJSBcZm9vaW5kZXggLi4ucmVzdCBvZiBsaW5lLi4uIHB1dHMgYW4gZW50cnkgaW4gdGhlIGluZGV4IGZvby4KKyUgSXQgYWxzbyBkZWZpbmVzIFxmb29pbmRmaWxlIHRvIGJlIHRoZSBudW1iZXIgb2YgdGhlIG91dHB1dCBjaGFubmVsIGZvcgorJSB0aGUgZmlsZSB0aGF0IGFjY3VtdWxhdGVzIHRoaXMgaW5kZXguICBUaGUgZmlsZSdzIGV4dGVuc2lvbiBpcyBmb28uCislIFRoZSBuYW1lIG9mIGFuIGluZGV4IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gMiBjaGFyYWN0ZXJzIGxvbmcKKyUgZm9yIHRoZSBzYWtlIG9mIHZtcy4KKyUKK1xkZWZcbmV3aW5kZXgjMXslCisgIFxpZmxpbmtzCisgICAgXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCisgICAgXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEgJSBPcGVuIHRoZSBmaWxlCisgIFxmaQorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslICAgICAlIERlZmluZSBAIzFpbmRleAorICAgIFxub2V4cGFuZFxkb2luZGV4eyMxfX0KK30KKworJSBAZGVmaW5kZXggZm9vICA9PSAgXG5ld2luZGV4e2Zvb30KKyUKK1xkZWZcZGVmaW5kZXh7XHBhcnNlYXJnXG5ld2luZGV4fQorCislIERlZmluZSBAZGVmY29kZWluZGV4LCBsaWtlIEBkZWZpbmRleCBleGNlcHQgcHV0IGFsbCBlbnRyaWVzIGluIEBjb2RlLgorJQorXGRlZlxkZWZjb2RlaW5kZXh7XHBhcnNlYXJnXG5ld2NvZGVpbmRleH0KKyUKK1xkZWZcbmV3Y29kZWluZGV4IzF7JQorICBcaWZsaW5rcworICAgIFxleHBhbmRhZnRlclxuZXd3cml0ZSBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQorICAgIFxvcGVub3V0IFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lIFxqb2JuYW1lLiMxCisgIFxmaQorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslCisgICAgXG5vZXhwYW5kXGRvY29kZWluZGV4eyMxfX0lCit9CisKKworJSBAc3luaW5kZXggZm9vIGJhciAgICBtYWtlcyBpbmRleCBmb28gZmVlZCBpbnRvIGluZGV4IGJhci4KKyUgRG8gdGhpcyBpbnN0ZWFkIG9mIEBkZWZpbmRleCBmb28gaWYgeW91IGRvbid0IHdhbnQgaXQgYXMgYSBzZXBhcmF0ZSBpbmRleC4KKyUKKyUgQHN5bmNvZGVpbmRleCBmb28gYmFyICAgc2ltaWxhciwgYnV0IHB1dCBhbGwgZW50cmllcyBtYWRlIGZvciBpbmRleCBmb28KKyUgaW5zaWRlIEBjb2RlLgorJQorXGRlZlxzeW5pbmRleCMxICMyIHtcZG9zeW5pbmRleFxkb2luZGV4eyMxfXsjMn19CitcZGVmXHN5bmNvZGVpbmRleCMxICMyIHtcZG9zeW5pbmRleFxkb2NvZGVpbmRleHsjMX17IzJ9fQorCislICMxIGlzIFxkb2luZGV4IG9yIFxkb2NvZGVpbmRleCwgIzIgdGhlIGluZGV4IGdldHRpbmcgcmVkZWZpbmVkIChmb28pLAorJSAjMyB0aGUgdGFyZ2V0IGluZGV4IChiYXIpLgorXGRlZlxkb3N5bmluZGV4IzEjMiMzeyUKKyAgJSBPbmx5IGRvIFxjbG9zZW91dCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBpdCwgZWxzZSB3ZSdsbCBlbmQgdXAKKyAgJSBjbG9zaW5nIHRoZSB0YXJnZXQgaW5kZXguCisgIFxleHBhbmRhZnRlciBcaWZ4XGNzbmFtZSBkb25lc3luaW5kZXgjMlxlbmRjc25hbWUgXHVuZGVmaW5lZAorICAgICUgVGhlIFxjbG9zZW91dCBoZWxwcyByZWR1Y2UgdW5uZWNlc3Nhcnkgb3BlbiBmaWxlczsgdGhlIGxpbWl0IG9uIHRoZQorICAgICUgQWNvcm4gUklTQyBPUyBpcyBhIG1lcmUgMTYgZmlsZXMuCisgICAgXGV4cGFuZGFmdGVyXGNsb3Nlb3V0XGNzbmFtZSMyaW5kZmlsZVxlbmRjc25hbWUKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZVxkb25lc3luaW5kZXgjMlxlbmRjc25hbWUgPSAxCisgIFxmaQorICAlIHJlZGVmaW5lIFxmb29pbmRmaWxlOgorICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHRlbXBcZXhwYW5kYWZ0ZXI9XGNzbmFtZSMzaW5kZmlsZVxlbmRjc25hbWUKKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUjMmluZGZpbGVcZW5kY3NuYW1lPVx0ZW1wCisgICUgcmVkZWZpbmUgXGZvb2luZGV4OgorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMmluZGV4XGVuZGNzbmFtZXtcbm9leHBhbmQjMXsjM319JQorfQorCislIERlZmluZSBcZG9pbmRleCwgdGhlIGRyaXZlciBmb3IgYWxsIFxmb29pbmRleCBtYWNyb3MuCislIEFyZ3VtZW50ICMxIGlzIGdlbmVyYXRlZCBieSB0aGUgY2FsbGluZyBcZm9vaW5kZXggbWFjcm8sCislICBhbmQgaXQgaXMgImZvbyIsIHRoZSBuYW1lIG9mIHRoZSBpbmRleC4KKworJSBcZG9pbmRleCBqdXN0IHVzZXMgXHBhcnNlYXJnOyBpdCBjYWxscyBcZG9pbmQgZm9yIHRoZSBhY3R1YWwgd29yay4KKyUgVGhpcyBpcyBiZWNhdXNlIFxkb2luZCBpcyBtb3JlIHVzZWZ1bCB0byBjYWxsIGZyb20gb3RoZXIgbWFjcm9zLgorCislIFRoZXJlIGlzIGFsc28gXGRvc3ViaW5kIHtpbmRleH17dG9waWN9e3N1YnRvcGljfQorJSB3aGljaCBtYWtlcyBhbiBlbnRyeSBpbiBhIHR3by1sZXZlbCBpbmRleCBzdWNoIGFzIHRoZSBvcGVyYXRpb24gaW5kZXguCisKK1xkZWZcZG9pbmRleCMxe1xlZGVmXGluZGV4bmFtZXsjMX1ccGFyc2Vhcmdcc2luZ2xlaW5kZXhlcn0KK1xkZWZcc2luZ2xlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17IzF9fQorCislIGxpa2UgdGhlIHByZXZpb3VzIHR3bywgYnV0IHRoZXkgcHV0IEBjb2RlIGFyb3VuZCB0aGUgYXJndW1lbnQuCitcZGVmXGRvY29kZWluZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVjb2RlaW5kZXhlcn0KK1xkZWZcc2luZ2xlY29kZWluZGV4ZXIgIzF7XGRvaW5ke1xpbmRleG5hbWV9e1xjb2RleyMxfX19CisKKyUgVGFrZSBjYXJlIG9mIFRleGluZm8gY29tbWFuZHMgdGhhdCBjYW4gYXBwZWFyIGluIGFuIGluZGV4IGVudHJ5LgorJSBTaW5jZSB0aGVyZSBhcmUgc29tZSBjb21tYW5kcyB3ZSB3YW50IHRvIGV4cGFuZCwgYW5kIG90aGVycyB3ZSBkb24ndCwKKyUgd2UgaGF2ZSB0byBsYWJvcmlvdXNseSBwcmV2ZW50IGV4cGFuc2lvbiBmb3IgdGhvc2UgdGhhdCB3ZSBkb24ndC4KKyUKK1xkZWZcaW5kZXhkdW1taWVzeyUKKyAgXGVzY2FwZWNoYXIgPSBgXFwgICAgICUgdXNlIGJhY2tzbGFzaCBpbiBvdXRwdXQgZmlsZXMuCisgIFxkZWZcQHtAfSUgY2hhbmdlIHRvIEBAIHdoZW4gd2Ugc3dpdGNoIHRvIEAgYXMgZXNjYXBlIGNoYXIgaW4gaW5kZXggZmlsZXMuCisgIFxkZWZcIHtccmVhbGJhY2tzbGFzaFxzcGFjZSB9JQorICAlIE5lZWQgdGhlc2UgaW4gY2FzZSBcdGV4IGlzIGluIGVmZmVjdCBhbmQgXHsgaXMgYSBcZGVsaW1pdGVyIGFnYWluLgorICAlIEJ1dCBjYW4ndCB1c2UgXGxicmFjZWNtZCBhbmQgXHJicmFjZWNtZCBiZWNhdXNlIHRleGluZGV4IGFzc3VtZXMKKyAgJSBicmFjZXMgYW5kIGJhY2tzbGFzaGVzIGFyZSB1c2VkIG9ubHkgYXMgZGVsaW1pdGVycy4KKyAgXGxldFx7ID0gXG15bGJyYWNlCisgIFxsZXRcfSA9IFxteXJicmFjZQorICAlCisgICUgRG8gdGhlIHJlZGVmaW5pdGlvbnMuCisgIFxjb21tb25kdW1taWVzCit9CisKKyUgRm9yIHRoZSBhdXggYW5kIHRvYyBmaWxlcywgQCBpcyB0aGUgZXNjYXBlIGNoYXJhY3Rlci4gIFNvIHdlIHdhbnQgdG8KKyUgcmVkZWZpbmUgZXZlcnl0aGluZyB1c2luZyBAIGFzIHRoZSBlc2NhcGUgY2hhcmFjdGVyIChpbnN0ZWFkIG9mCislIFxyZWFsYmFja3NsYXNoLCBzdGlsbCB1c2VkIGZvciBpbmRleCBmaWxlcykuICBXaGVuIGV2ZXJ5dGhpbmcgdXNlcyBALAorJSB0aGlzIHdpbGwgYmUgc2ltcGxlci4KKyUKK1xkZWZcYXRkdW1taWVzeyUKKyAgXGRlZlxAe0BAfSUKKyAgXGRlZlwge0AgfSUKKyAgXGxldFx7ID0gXGxicmFjZWF0Y21kCisgIFxsZXRcfSA9IFxyYnJhY2VhdGNtZAorICAlCisgICUgRG8gdGhlIHJlZGVmaW5pdGlvbnMuCisgIFxjb21tb25kdW1taWVzCisgIFxvdGhlcmJhY2tzbGFzaAorfQorCislIENhbGxlZCBmcm9tIFxpbmRleGR1bW1pZXMgYW5kIFxhdGR1bW1pZXMuCislCitcZGVmXGNvbW1vbmR1bW1pZXN7JQorICAlCisgICUgXGRlZmluZWR1bW15d29yZCBkZWZpbmVzIFwjMSBhcyBcc3RyaW5nXCMxXHNwYWNlLCB0aHVzIGVmZmVjdGl2ZWx5CisgICUgcHJldmVudGluZyBpdHMgZXhwYW5zaW9uLiAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIGNvbnRyb2wlIHdvcmRzLAorICAlIG5vdCBjb250cm9sIGxldHRlcnMsIGJlY2F1c2UgdGhlIFxzcGFjZSB3b3VsZCBiZSBpbmNvcnJlY3QgZm9yCisgICUgY29udHJvbCBjaGFyYWN0ZXJzLCBidXQgaXMgbmVlZGVkIHRvIHNlcGFyYXRlIHRoZSBjb250cm9sIHdvcmQKKyAgJSBmcm9tIHdoYXRldmVyIGZvbGxvd3MuCisgICUKKyAgJSBGb3IgY29udHJvbCBsZXR0ZXJzLCB3ZSBoYXZlIFxkZWZpbmVkdW1teWxldHRlciwgd2hpY2ggb21pdHMgdGhlCisgICUgc3BhY2UuCisgICUKKyAgJSBUaGVzZSBjYW4gYmUgdXNlZCBib3RoIGZvciBjb250cm9sIHdvcmRzIHRoYXQgdGFrZSBhbiBhcmd1bWVudCBhbmQKKyAgJSB0aG9zZSB0aGF0IGRvIG5vdC4gIElmIGl0IGlzIGZvbGxvd2VkIGJ5IHthcmd9IGluIHRoZSBpbnB1dCwgdGhlbgorICAlIHRoYXQgd2lsbCBkdXRpZnVsbHkgZ2V0IHdyaXR0ZW4gdG8gdGhlIGluZGV4IChvciB3aGVyZXZlcikuCisgICUKKyAgXGRlZlxkZWZpbmVkdW1teXdvcmQgICMjMXtcZGVmIyMxe1xzdHJpbmcjIzFcc3BhY2V9fSUKKyAgXGRlZlxkZWZpbmVkdW1teWxldHRlciMjMXtcZGVmIyMxe1xzdHJpbmcjIzF9fSUKKyAgXGxldFxkZWZpbmVkdW1teWFjY2VudFxkZWZpbmVkdW1teWxldHRlcgorICAlCisgIFxjb21tb25kdW1taWVzbm9mb250cworICAlCisgIFxkZWZpbmVkdW1teWxldHRlclxfJQorICAlCisgICUgTm9uLUVuZ2xpc2ggbGV0dGVycy4KKyAgXGRlZmluZWR1bW15d29yZFxBQQorICBcZGVmaW5lZHVtbXl3b3JkXEFFCisgIFxkZWZpbmVkdW1teXdvcmRcTAorICBcZGVmaW5lZHVtbXl3b3JkXE9FCisgIFxkZWZpbmVkdW1teXdvcmRcTworICBcZGVmaW5lZHVtbXl3b3JkXGFhCisgIFxkZWZpbmVkdW1teXdvcmRcYWUKKyAgXGRlZmluZWR1bW15d29yZFxsCisgIFxkZWZpbmVkdW1teXdvcmRcb2UKKyAgXGRlZmluZWR1bW15d29yZFxvCisgIFxkZWZpbmVkdW1teXdvcmRcc3MKKyAgXGRlZmluZWR1bW15d29yZFxleGNsYW1kb3duCisgIFxkZWZpbmVkdW1teXdvcmRccXVlc3Rpb25kb3duCisgIFxkZWZpbmVkdW1teXdvcmRcb3JkZgorICBcZGVmaW5lZHVtbXl3b3JkXG9yZG0KKyAgJQorICAlIEFsdGhvdWdoIHRoZXNlIGludGVybmFsIGNvbW1hbmRzIHNob3VsZG4ndCBzaG93IHVwLCBzb21ldGltZXMgdGhleSBkby4KKyAgXGRlZmluZWR1bW15d29yZFxiZgorICBcZGVmaW5lZHVtbXl3b3JkXGd0cgorICBcZGVmaW5lZHVtbXl3b3JkXGhhdAorICBcZGVmaW5lZHVtbXl3b3JkXGxlc3MKKyAgXGRlZmluZWR1bW15d29yZFxzZgorICBcZGVmaW5lZHVtbXl3b3JkXHNsCisgIFxkZWZpbmVkdW1teXdvcmRcdGNsb3NlCisgIFxkZWZpbmVkdW1teXdvcmRcdHQKKyAgJQorICBcZGVmaW5lZHVtbXl3b3JkXExhVGVYCisgIFxkZWZpbmVkdW1teXdvcmRcVGVYCisgICUKKyAgJSBBc3NvcnRlZCBzcGVjaWFsIGNoYXJhY3RlcnMuCisgIFxkZWZpbmVkdW1teXdvcmRcYnVsbGV0CisgIFxkZWZpbmVkdW1teXdvcmRcY29tbWEKKyAgXGRlZmluZWR1bW15d29yZFxjb3B5cmlnaHQKKyAgXGRlZmluZWR1bW15d29yZFxyZWdpc3RlcmVkc3ltYm9sCisgIFxkZWZpbmVkdW1teXdvcmRcZG90cworICBcZGVmaW5lZHVtbXl3b3JkXGVuZGRvdHMKKyAgXGRlZmluZWR1bW15d29yZFxlcXVpdgorICBcZGVmaW5lZHVtbXl3b3JkXGVycm9yCisgIFxkZWZpbmVkdW1teXdvcmRcZXVybworICBcZGVmaW5lZHVtbXl3b3JkXGV4cGFuc2lvbgorICBcZGVmaW5lZHVtbXl3b3JkXG1pbnVzCisgIFxkZWZpbmVkdW1teXdvcmRccG91bmRzCisgIFxkZWZpbmVkdW1teXdvcmRccG9pbnQKKyAgXGRlZmluZWR1bW15d29yZFxwcmludAorICBcZGVmaW5lZHVtbXl3b3JkXHJlc3VsdAorICAlCisgICUgV2Ugd2FudCB0byBkaXNhYmxlIGFsbCBtYWNyb3Mgc28gdGhhdCB0aGV5IGFyZSBub3QgZXhwYW5kZWQgYnkgXHdyaXRlLgorICBcbWFjcm9saXN0CisgICUKKyAgXG5vcm1hbHR1cm5vZmZhY3RpdmUKKyAgJQorICAlIEhhbmRsZSBzb21lIGNhc2VzIG9mIEB2YWx1ZSAtLSB3aGVyZSBpdCBkb2VzIG5vdCBjb250YWluIGFueQorICAlIChub24tZnVsbHktZXhwYW5kYWJsZSkgY29tbWFuZHMuCisgIFxtYWtldmFsdWVleHBhbmRhYmxlCit9CisKKyUgXGNvbW1vbmR1bW1pZXNub2ZvbnRzOiBjb21tb24gdG8gXGNvbW1vbmR1bW1pZXMgYW5kIFxpbmRleG5vZm9udHMuCislCitcZGVmXGNvbW1vbmR1bW1pZXNub2ZvbnRzeyUKKyAgJSBDb250cm9sIGxldHRlcnMgYW5kIGFjY2VudHMuCisgIFxkZWZpbmVkdW1teWxldHRlclwhJQorICBcZGVmaW5lZHVtbXlhY2NlbnRcIiUKKyAgXGRlZmluZWR1bW15YWNjZW50XCclCisgIFxkZWZpbmVkdW1teWxldHRlclwqJQorICBcZGVmaW5lZHVtbXlhY2NlbnRcLCUKKyAgXGRlZmluZWR1bW15bGV0dGVyXC4lCisgIFxkZWZpbmVkdW1teWxldHRlclwvJQorICBcZGVmaW5lZHVtbXlsZXR0ZXJcOiUKKyAgXGRlZmluZWR1bW15YWNjZW50XD0lCisgIFxkZWZpbmVkdW1teWxldHRlclw/JQorICBcZGVmaW5lZHVtbXlhY2NlbnRcXiUKKyAgXGRlZmluZWR1bW15YWNjZW50XGAlCisgIFxkZWZpbmVkdW1teWFjY2VudFx+JQorICBcZGVmaW5lZHVtbXl3b3JkXHUKKyAgXGRlZmluZWR1bW15d29yZFx2CisgIFxkZWZpbmVkdW1teXdvcmRcSAorICBcZGVmaW5lZHVtbXl3b3JkXGRvdGFjY2VudAorICBcZGVmaW5lZHVtbXl3b3JkXHJpbmdhY2NlbnQKKyAgXGRlZmluZWR1bW15d29yZFx0aWVhY2NlbnQKKyAgXGRlZmluZWR1bW15d29yZFx1YmFyYWNjZW50CisgIFxkZWZpbmVkdW1teXdvcmRcdWRvdGFjY2VudAorICBcZGVmaW5lZHVtbXl3b3JkXGRvdGxlc3MKKyAgJQorICAlIFRleGluZm8gZm9udCBjb21tYW5kcy4KKyAgXGRlZmluZWR1bW15d29yZFxiCisgIFxkZWZpbmVkdW1teXdvcmRcaQorICBcZGVmaW5lZHVtbXl3b3JkXHIKKyAgXGRlZmluZWR1bW15d29yZFxzYworICBcZGVmaW5lZHVtbXl3b3JkXHQKKyAgJQorICAlIENvbW1hbmRzIHRoYXQgdGFrZSBhcmd1bWVudHMuCisgIFxkZWZpbmVkdW1teXdvcmRcYWNyb255bQorICBcZGVmaW5lZHVtbXl3b3JkXGNpdGUKKyAgXGRlZmluZWR1bW15d29yZFxjb2RlCisgIFxkZWZpbmVkdW1teXdvcmRcY29tbWFuZAorICBcZGVmaW5lZHVtbXl3b3JkXGRmbgorICBcZGVmaW5lZHVtbXl3b3JkXGVtcGgKKyAgXGRlZmluZWR1bW15d29yZFxlbnYKKyAgXGRlZmluZWR1bW15d29yZFxmaWxlCisgIFxkZWZpbmVkdW1teXdvcmRca2JkCisgIFxkZWZpbmVkdW1teXdvcmRca2V5CisgIFxkZWZpbmVkdW1teXdvcmRcbWF0aAorICBcZGVmaW5lZHVtbXl3b3JkXG9wdGlvbgorICBcZGVmaW5lZHVtbXl3b3JkXHB4cmVmCisgIFxkZWZpbmVkdW1teXdvcmRccmVmCisgIFxkZWZpbmVkdW1teXdvcmRcc2FtcAorICBcZGVmaW5lZHVtbXl3b3JkXHN0cm9uZworICBcZGVmaW5lZHVtbXl3b3JkXHRpZQorICBcZGVmaW5lZHVtbXl3b3JkXHVyZWYKKyAgXGRlZmluZWR1bW15d29yZFx1cmwKKyAgXGRlZmluZWR1bW15d29yZFx2YXIKKyAgXGRlZmluZWR1bW15d29yZFx2ZXJiCisgIFxkZWZpbmVkdW1teXdvcmRcdworICBcZGVmaW5lZHVtbXl3b3JkXHhyZWYKK30KKworJSBcaW5kZXhub2ZvbnRzIGlzIHVzZWQgd2hlbiBvdXRwdXR0aW5nIHRoZSBzdHJpbmdzIHRvIHNvcnQgdGhlIGluZGV4CislIGJ5LCBhbmQgd2hlbiBjb25zdHJ1Y3RpbmcgY29udHJvbCBzZXF1ZW5jZSBuYW1lcy4gIEl0IGVsaW1pbmF0ZXMgYWxsCislIGNvbnRyb2wgc2VxdWVuY2VzIGFuZCBqdXN0IHdyaXRlcyB3aGF0ZXZlciB0aGUgYmVzdCBBU0NJSSBzb3J0IHN0cmluZworJSB3b3VsZCBiZSBmb3IgYSBnaXZlbiBjb21tYW5kICh1c3VhbGx5IGl0cyBhcmd1bWVudCkuCislCitcZGVmXGluZGV4bm9mb250c3slCisgICUgQWNjZW50IGNvbW1hbmRzIHNob3VsZCBiZWNvbWUgQGFzaXMuCisgIFxkZWZcZGVmaW5lZHVtbXlhY2NlbnQjIzF7XGxldCMjMVxhc2lzfSUKKyAgJSBXZSBjYW4ganVzdCBpZ25vcmUgb3RoZXIgY29udHJvbCBsZXR0ZXJzLgorICBcZGVmXGRlZmluZWR1bW15bGV0dGVyIyMxe1xsZXQjIzFcZW1wdHl9JQorICAlIEhvcGVmdWxseSwgYWxsIGNvbnRyb2wgd29yZHMgY2FuIGJlY29tZSBAYXNpcy4KKyAgXGxldFxkZWZpbmVkdW1teXdvcmRcZGVmaW5lZHVtbXlhY2NlbnQKKyAgJQorICBcY29tbW9uZHVtbWllc25vZm9udHMKKyAgJQorICAlIERvbid0IG5vLW9wIFx0dCwgc2luY2UgaXQgaXNuJ3QgYSB1c2VyLWxldmVsIGNvbW1hbmQKKyAgJSBhbmQgaXMgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGFjdGl2ZSBjaGFycyBsaWtlIDwsID4sIHwsIGV0Yy4KKyAgJSBMaWtld2lzZSB3aXRoIHRoZSBvdGhlciBwbGFpbiB0ZXggZm9udCBjb21tYW5kcy4KKyAgJVxsZXRcdHQ9XGFzaXMKKyAgJQorICBcZGVmXCB7IH0lCisgIFxkZWZcQHtAfSUKKyAgJSBob3cgdG8gaGFuZGxlIGJyYWNlcz8KKyAgXGRlZlxfe1xub3JtYWx1bmRlcnNjb3JlfSUKKyAgJQorICAlIE5vbi1FbmdsaXNoIGxldHRlcnMuCisgIFxkZWZcQUF7QUF9JQorICBcZGVmXEFFe0FFfSUKKyAgXGRlZlxMe0x9JQorICBcZGVmXE9Fe09FfSUKKyAgXGRlZlxPe099JQorICBcZGVmXGFhe2FhfSUKKyAgXGRlZlxhZXthZX0lCisgIFxkZWZcbHtsfSUKKyAgXGRlZlxvZXtvZX0lCisgIFxkZWZcb3tvfSUKKyAgXGRlZlxzc3tzc30lCisgIFxkZWZcZXhjbGFtZG93bnshfSUKKyAgXGRlZlxxdWVzdGlvbmRvd257P30lCisgIFxkZWZcb3JkZnthfSUKKyAgXGRlZlxvcmRte299JQorICAlCisgIFxkZWZcTGFUZVh7TGFUZVh9JQorICBcZGVmXFRlWHtUZVh9JQorICAlCisgICUgQXNzb3J0ZWQgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICAlIChUaGUgZm9sbG93aW5nIHt9IHdpbGwgZW5kIHVwIGluIHRoZSBzb3J0IHN0cmluZywgYnV0IHRoYXQncyBvay4pCisgIFxkZWZcYnVsbGV0e2J1bGxldH0lCisgIFxkZWZcY29tbWF7LH0lCisgIFxkZWZcY29weXJpZ2h0e2NvcHlyaWdodH0lCisgIFxkZWZccmVnaXN0ZXJlZHN5bWJvbHtSfSUKKyAgXGRlZlxkb3Rzey4uLn0lCisgIFxkZWZcZW5kZG90c3suLi59JQorICBcZGVmXGVxdWl2ez09fSUKKyAgXGRlZlxlcnJvcntlcnJvcn0lCisgIFxkZWZcZXVyb3tldXJvfSUKKyAgXGRlZlxleHBhbnNpb257PT0+fSUKKyAgXGRlZlxtaW51c3stfSUKKyAgXGRlZlxwb3VuZHN7cG91bmRzfSUKKyAgXGRlZlxwb2ludHsufSUKKyAgXGRlZlxwcmludHstfH0lCisgIFxkZWZccmVzdWx0ez0+fSUKKyAgJQorICAlIFdlIG5lZWQgdG8gZ2V0IHJpZCBvZiBhbGwgbWFjcm9zLCBsZWF2aW5nIG9ubHkgdGhlIGFyZ3VtZW50cyAoaWYgcHJlc2VudCkuCisgICUgT2YgY291cnNlIHRoaXMgaXMgbm90IG5lYXJseSBjb3JyZWN0LCBidXQgaXQgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGZvciBub3cuCisgICUgbWFrZWluZm8gZG9lcyBub3QgZXhwYW5kIG1hY3JvcyBpbiB0aGUgYXJndW1lbnQgdG8gQGRlZmZuLCB3aGljaCBlbmRzIHVwCisgICUgd3JpdGluZyBhbiBpbmRleCBlbnRyeSwgYW5kIHRleGluZGV4IGlzbid0IHByZXBhcmVkIGZvciBhbiBpbmRleCBzb3J0IGVudHJ5CisgICUgdGhhdCBzdGFydHMgd2l0aCBcLgorICAlIAorICAlIFNpbmNlIG1hY3JvIGludm9jYXRpb25zIGFyZSBmb2xsb3dlZCBieSBicmFjZXMsIHdlIGNhbiBqdXN0IHJlZGVmaW5lIHRoZW0KKyAgJSB0byB0YWtlIGEgc2luZ2xlIFRlWCBhcmd1bWVudC4gIFRoZSBjYXNlIG9mIGEgbWFjcm8gaW52b2NhdGlvbiB0aGF0CisgICUgZ29lcyB0byBlbmQtb2YtbGluZSBpcyBub3QgaGFuZGxlZC4KKyAgJSAKKyAgXG1hY3JvbGlzdAorfQorCitcbGV0XGluZGV4YmFja3NsYXNoPTAgICVvdmVycmlkZGVuIGR1cmluZyBccHJpbnRpbmRleC4KK1xsZXRcU0VUbWFyZ2luaW5kZXg9XHJlbGF4ICUgcHV0IGluZGV4IGVudHJpZXMgaW4gbWFyZ2luICh1bmRvY3VtZW50ZWQpPworCislIE1vc3QgaW5kZXggZW50cmllcyBnbyB0aHJvdWdoIGhlcmUsIGJ1dCBcZG9zdWJpbmQgaXMgdGhlIGdlbmVyYWwgY2FzZS4KKyUgIzEgaXMgdGhlIGluZGV4IG5hbWUsICMyIGlzIHRoZSBlbnRyeSB0ZXh0LgorXGRlZlxkb2luZCMxIzJ7XGRvc3ViaW5keyMxfXsjMn17fX0KKworJSBXb3JraG9yc2UgZm9yIGFsbCBcZm9vaW5kZXhlcy4KKyUgIzEgaXMgbmFtZSBvZiBpbmRleCwgIzIgaXMgc3R1ZmYgdG8gcHV0IHRoZXJlLCAjMyBpcyBzdWJlbnRyeSAtLQorJSBlbXB0eSBpZiBjYWxsZWQgZnJvbSBcZG9pbmQsIGFzIHdlIHVzdWFsbHkgYXJlICh0aGUgbWFpbiBleGNlcHRpb24KKyUgaXMgd2l0aCBtb3N0IGRlZnVucywgd2hpY2ggY2FsbCB1cyBkaXJlY3RseSkuCislCitcZGVmXGRvc3ViaW5kIzEjMiMzeyUKKyAgXGlmbGlua3MKKyAgeyUKKyAgICAlIFN0b3JlIHRoZSBtYWluIGluZGV4IGVudHJ5IHRleHQgKGluY2x1ZGluZyB0aGUgdGhpcmQgYXJnKS4KKyAgICBcdG9rczAgPSB7IzJ9JQorICAgICUgSWYgdGhpcmQgYXJnIGlzIHByZXNlbnQsIHByZWNlZGUgaXQgd2l0aCBhIHNwYWNlLgorICAgIFxkZWZcdGhpcmRhcmd7IzN9JQorICAgIFxpZnhcdGhpcmRhcmdcZW1wdHkgXGVsc2UKKyAgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcdGhlXHRva3MwIFxzcGFjZSAjM30lCisgICAgXGZpCisgICAgJQorICAgIFxlZGVmXHdyaXRldG97XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWV9JQorICAgICUKKyAgICBcaWZ2bW9kZQorICAgICAgXGRvc3ViaW5kc2FuaXRpemUKKyAgICBcZWxzZQorICAgICAgXGRvc3ViaW5kd3JpdGUKKyAgICBcZmkKKyAgfSUKKyAgXGZpCit9CisKKyUgV3JpdGUgdGhlIGVudHJ5IGluIFx0b2tzMCB0byB0aGUgaW5kZXggZmlsZToKKyUKK1xkZWZcZG9zdWJpbmR3cml0ZXslCisgICUgUHV0IHRoZSBpbmRleCBlbnRyeSBpbiB0aGUgbWFyZ2luIGlmIGRlc2lyZWQuCisgIFxpZnhcU0VUbWFyZ2luaW5kZXhccmVsYXhcZWxzZQorICAgIFxpbnNlcnRcbWFyZ2lue1xoYm94e1x2cnVsZSBoZWlnaHQ4cHQgZGVwdGgzcHQgd2lkdGgwcHQgXHRoZVx0b2tzMH19JQorICBcZmkKKyAgJQorICAlIFJlbWVtYmVyLCB3ZSBhcmUgd2l0aGluIGEgZ3JvdXAuCisgIFxpbmRleGR1bW1pZXMgJSBNdXN0IGRvIHRoaXMgaGVyZSwgc2luY2UgXGJmLCBldGMgZXhwYW5kIGF0IHRoaXMgc3RhZ2UKKyAgXGRlZlxiYWNrc2xhc2hjdXJmb250e1xpbmRleGJhY2tzbGFzaH0lIFxpbmRleGJhY2tzbGFzaCBpc24ndCBkZWZpbmVkIG5vdworICAgICAgJSBzbyBpdCB3aWxsIGJlIG91dHB1dCBhcyBpczsgYW5kIGl0IHdpbGwgcHJpbnQgYXMgYmFja3NsYXNoLgorICAlCisgICUgUHJvY2VzcyB0aGUgaW5kZXggZW50cnkgd2l0aCBhbGwgZm9udCBjb21tYW5kcyB0dXJuZWQgb2ZmLCB0bworICAlIGdldCB0aGUgc3RyaW5nIHRvIHNvcnQgYnkuCisgIHtcaW5kZXhub2ZvbnRzCisgICBcZWRlZlx0ZW1we1x0aGVcdG9rczB9JSBuZWVkIGZ1bGwgZXhwYW5zaW9uCisgICBceGRlZlxpbmRleHNvcnR0bXB7XHRlbXB9JQorICB9JQorICAlCisgICUgU2V0IHVwIHRoZSBjb21wbGV0ZSBpbmRleCBlbnRyeSwgd2l0aCBib3RoIHRoZSBzb3J0IGtleSBhbmQKKyAgJSB0aGUgb3JpZ2luYWwgdGV4dCwgaW5jbHVkaW5nIGFueSBmb250IGNvbW1hbmRzLiAgV2Ugd3JpdGUKKyAgJSB0aHJlZSBhcmd1bWVudHMgdG8gXGVudHJ5IHRvIHRoZSAuPz8gZmlsZSAoZm91ciBpbiB0aGUKKyAgJSBzdWJlbnRyeSBjYXNlKSwgdGV4aW5kZXggcmVkdWNlcyB0byB0d28gd2hlbiB3cml0aW5nIHRoZSAuPz9zCisgICUgc29ydGVkIHJlc3VsdC4KKyAgXGVkZWZcdGVtcHslCisgICAgXHdyaXRlXHdyaXRldG97JQorICAgICAgXHN0cmluZ1xlbnRyeXtcaW5kZXhzb3J0dG1wfXtcbm9leHBhbmRcZm9saW99e1x0aGVcdG9rczB9fSUKKyAgfSUKKyAgXHRlbXAKK30KKworJSBUYWtlIGNhcmUgb2YgdW53YW50ZWQgcGFnZSBicmVha3M6CislCislIElmIGEgc2tpcCBpcyB0aGUgbGFzdCB0aGluZyBvbiB0aGUgbGlzdCBub3csIHByZXNlcnZlIGl0CislIGJ5IGJhY2tpbmcgdXAgYnkgXGxhc3Rza2lwLCBkb2luZyB0aGUgXHdyaXRlLCB0aGVuIGluc2VydGluZworJSB0aGUgc2tpcCBhZ2Fpbi4gIE90aGVyd2lzZSwgdGhlIHdoYXRzaXQgZ2VuZXJhdGVkIGJ5IHRoZQorJSBcd3JpdGUgd2lsbCBtYWtlIFxsYXN0c2tpcCB6ZXJvLiAgVGhlIHJlc3VsdCBpcyB0aGF0IHNlcXVlbmNlcworJSBsaWtlIHRoaXM6CislIEBlbmQgZGVmdW4KKyUgQHRpbmRleCB3aGF0ZXZlcgorJSBAZGVmdW4gLi4uCislIHdpbGwgaGF2ZSBleHRyYSBzcGFjZSBpbnNlcnRlZCwgYmVjYXVzZSB0aGUgXG1lZGJyZWFrIGluIHRoZQorJSBzdGFydCBvZiB0aGUgQGRlZnVuIHdvbid0IHNlZSB0aGUgc2tpcCBpbnNlcnRlZCBieSB0aGUgQGVuZCBvZgorJSB0aGUgcHJldmlvdXMgZGVmdW4uCislCislIEJ1dCBkb24ndCBkbyBhbnkgb2YgdGhpcyBpZiB3ZSdyZSBub3QgaW4gdmVydGljYWwgbW9kZS4gIFdlCislIGRvbid0IHdhbnQgdG8gZG8gYSBcdnNraXAgYW5kIHByZW1hdHVyZWx5IGVuZCBhIHBhcmFncmFwaC4KKyUKKyUgQXZvaWQgcGFnZSBicmVha3MgZHVlIHRvIHRoZXNlIGV4dHJhIHNraXBzLCB0b28uCislCislIEJ1dCB3YWl0LCB0aGVyZSBpcyBhIGNhdGNoIHRoZXJlOgorJSBXZSdsbCBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgXGxhc3Rza2lwIGlzIHplcm8gc2tpcC4gIFxpZmRpbSBpcyBub3QKKyUgc3VmZmljaWVudCBmb3IgdGhpcyBwdXJwb3NlLCBhcyBpdCBpZ25vcmVzIHN0cmV0Y2ggYW5kIHNocmluayBwYXJ0cworJSBvZiB0aGUgc2tpcC4gIFRoZSBvbmx5IHdheSBzZWVtcyB0byBiZSB0byBjaGVjayB0aGUgdGV4dHVhbAorJSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2tpcC4KKyUKKyUgVGhlIGZvbGxvd2luZyBpcyBhbG1vc3QgbGlrZSBcZGVmXHplcm9za2lwbWFjcm97MC4wcHR9IGV4Y2VwdCB0aGF0CislIHRoZSBgYHAnJyBhbmQgYGB0JycgY2hhcmFjdGVycyBoYXZlIGNhdGNvZGUgXG90aGVyLCBub3QgMTEgKGxldHRlcikuCislCitcZWRlZlx6ZXJvc2tpcG1hY3Jve1xleHBhbmRhZnRlclx0aGVcY3NuYW1lIHpAc2tpcFxlbmRjc25hbWV9CislCislIC4uLiwgcmVhZHksIEdPOgorJQorXGRlZlxkb3N1YmluZHNhbml0aXpleyUKKyAgJSBcbGFzdHNraXAgYW5kIFxsYXN0cGVuYWx0eSBjYW5ub3QgYm90aCBiZSBub256ZXJvIHNpbXVsdGFuZW91c2x5LgorICBcc2tpcDAgPSBcbGFzdHNraXAKKyAgXGVkZWZcbGFzdHNraXBtYWNyb3tcdGhlXGxhc3Rza2lwfSUKKyAgXGNvdW50MjU1ID0gXGxhc3RwZW5hbHR5CisgICUKKyAgJSBJZiBcbGFzdHNraXAgaXMgbm9uemVybywgdGhhdCBtZWFucyB0aGUgbGFzdCBpdGVtIHdhcyBhCisgICUgc2tpcC4gIEFuZCBzaW5jZSBhIHNraXAgaXMgZGlzY2FyZGFibGUsIHRoYXQgbWVhbnMgdGhpcworICAlIC1cc2tpcDAgZ2x1ZSB3ZSdyZSBpbnNlcnRpbmcgaXMgcHJlY2VkZWQgYnkgYQorICAlIG5vbi1kaXNjYXJkYWJsZSBpdGVtLCB0aGVyZWZvcmUgaXQgaXMgbm90IGEgcG90ZW50aWFsCisgICUgYnJlYWtwb2ludCwgdGhlcmVmb3JlIG5vIFxub2JyZWFrIG5lZWRlZC4KKyAgXGlmeFxsYXN0c2tpcG1hY3JvXHplcm9za2lwbWFjcm8KKyAgXGVsc2UKKyAgICBcdnNraXAtXHNraXAwCisgIFxmaQorICAlCisgIFxkb3N1YmluZHdyaXRlCisgICUKKyAgXGlmeFxsYXN0c2tpcG1hY3JvXHplcm9za2lwbWFjcm8KKyAgICAlIElmIFxsYXN0c2tpcCB3YXMgemVybywgcGVyaGFwcyB0aGUgbGFzdCBpdGVtIHdhcyBhIHBlbmFsdHksIGFuZAorICAgICUgcGVyaGFwcyBpdCB3YXMgPj0xMDAwMCwgZS5nLiwgYSBcbm9icmVhay4gIEluIHRoYXQgY2FzZSwgd2Ugd2FudAorICAgICUgdG8gcmUtaW5zZXJ0IHRoZSBzYW1lIHBlbmFsdHkgKHZhbHVlcyA+MTAwMDAgYXJlIHVzZWQgZm9yIHZhcmlvdXMKKyAgICAlIHNpZ25hbHMpOyBzaW5jZSB3ZSBqdXN0IGluc2VydGVkIGEgbm9uLWRpc2NhcmRhYmxlIGl0ZW0sIGFueQorICAgICUgZm9sbG93aW5nIGdsdWUgKHN1Y2ggYXMgYSBccGFyc2tpcCkgd291bGQgYmUgYSBicmVha3BvaW50LiAgRm9yIGV4YW1wbGU6CisgICAgJSAKKyAgICAlICAgQGRlZmZuIGRlZmZuLXdoYXRldmVyCisgICAgJSAgIEB2aW5kZXggaW5kZXgtd2hhdGV2ZXIKKyAgICAlICAgRGVzY3JpcHRpb24uCisgICAgJSB3b3VsZCBhbGxvdyBhIGJyZWFrIGJldHdlZW4gdGhlIGluZGV4LXdoYXRldmVyIHdoYXRzaXQKKyAgICAlIGFuZCB0aGUgIkRlc2NyaXB0aW9uLiIgcGFyYWdyYXBoLgorICAgIFxpZm51bVxjb3VudDI1NT45OTk5IFxwZW5hbHR5XGNvdW50MjU1IFxmaQorICBcZWxzZQorICAgICUgT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGhhZCBhIG5vbnplcm8gXGxhc3Rza2lwLAorICAgICUgdGhpcyBtYWtlLXVwIGdsdWUgd291bGQgYmUgcHJlY2VkZWQgYnkgYSBub24tZGlzY2FyZGFibGUgaXRlbQorICAgICUgKHRoZSB3aGF0c2l0IGZyb20gdGhlIFx3cml0ZSksIHNvIHdlIG11c3QgaW5zZXJ0IGEgXG5vYnJlYWsuCisgICAgXG5vYnJlYWtcdnNraXBcc2tpcDAKKyAgXGZpCit9CisKKyUgVGhlIGluZGV4IGVudHJ5IHdyaXR0ZW4gaW4gdGhlIGZpbGUgYWN0dWFsbHkgbG9va3MgbGlrZQorJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY30KKyUgb3IKKyUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9e3N1YnRvcGljfQorJSBUaGUgdGV4aW5kZXggcHJvZ3JhbSByZWFkcyBpbiB0aGVzZSBmaWxlcyBhbmQgd3JpdGVzIGZpbGVzCislIGNvbnRhaW5pbmcgdGhlc2Uga2luZHMgb2YgbGluZXM6CislICBcaW5pdGlhbCB7Y30KKyUgICAgIGJlZm9yZSB0aGUgZmlyc3QgdG9waWMgd2hvc2UgaW5pdGlhbCBpcyBjCislICBcZW50cnkge3RvcGljfXtwYWdlbGlzdH0KKyUgICAgIGZvciBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRob3V0IHN1YnRvcGljcworJSAgXHByaW1hcnkge3RvcGljfQorJSAgICAgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYSB0b3BpYyB0aGF0IGlzIHVzZWQgd2l0aCBzdWJ0b3BpY3MKKyUgIFxzZWNvbmRhcnkge3N1YnRvcGljfXtwYWdlbGlzdH0KKyUgICAgIGZvciBlYWNoIHN1YnRvcGljLgorCislIERlZmluZSB0aGUgdXNlci1hY2Nlc3NpYmxlIGluZGV4aW5nIGNvbW1hbmRzCislIEBmaW5kZXgsIEB2aW5kZXgsIEBraW5kZXgsIEBjaW5kZXguCisKK1xkZWZcZmluZGV4IHtcZm5pbmRleH0KK1xkZWZca2luZGV4IHtca3lpbmRleH0KK1xkZWZcY2luZGV4IHtcY3BpbmRleH0KK1xkZWZcdmluZGV4IHtcdnJpbmRleH0KK1xkZWZcdGluZGV4IHtcdHBpbmRleH0KK1xkZWZccGluZGV4IHtccGdpbmRleH0KKworXGRlZlxjaW5kZXhzdWIge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xjaW5kZXhzdWJ9Cit7XG9iZXlsaW5lcyAlCitcZ2RlZlxjaW5kZXhzdWIgIiMxIiAjMl5eTXtcZW5kZ3JvdXAgJQorXGRvc3ViaW5ke2NwfXsjMn17IzF9fX0KKworJSBEZWZpbmUgdGhlIG1hY3JvcyB1c2VkIGluIGZvcm1hdHRpbmcgb3V0cHV0IG9mIHRoZSBzb3J0ZWQgaW5kZXggbWF0ZXJpYWwuCisKKyUgQHByaW50aW5kZXggY2F1c2VzIGEgcGFydGljdWxhciBpbmRleCAodGhlID8/cyBmaWxlKSB0byBnZXQgcHJpbnRlZC4KKyUgSXQgZG9lcyBub3QgcHJpbnQgYW55IGNoYXB0ZXIgaGVhZGluZyAodXN1YWxseSBhbiBAdW5udW1iZXJlZCkuCislCitccGFyc2VhcmdkZWZccHJpbnRpbmRleHtcYmVnaW5ncm91cAorICBcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwezEwMDAwfSUKKyAgJQorICBcc21hbGxmb250cyBccm0KKyAgXHRvbGVyYW5jZSA9IDk1MDAKKyAgXGV2ZXJ5cGFyID0ge30lIGRvbid0IHdhbnQgdGhlIFxrZXJuXC1wYXJpbmRlbnQgZnJvbSBpbmRlbnRhdGlvbiBzdXBwcmVzc2lvbi4KKyAgJQorICAlIFNlZSBpZiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYW5kIGlzIG5vbmVtcHR5LgorICAlIENoYW5nZSBjYXRjb2RlIG9mIEAgaGVyZSBzbyB0aGF0IGlmIHRoZSBpbmRleCBmaWxlIGNvbnRhaW5zCisgICUgXGluaXRpYWwge0B9CisgICUgYXMgaXRzIGZpcnN0IGxpbmUsIFRlWCBkb2Vzbid0IGNvbXBsYWluIGFib3V0IG1pc21hdGNoZWQgYnJhY2VzCisgICUgKGJlY2F1c2UgaXQgdGhpbmtzIEB9IGlzIGEgY29udHJvbCBzZXF1ZW5jZSkuCisgIFxjYXRjb2RlYFxAID0gMTEKKyAgXG9wZW5pbiAxIFxqb2JuYW1lLiMxcworICBcaWZlb2YgMQorICAgICUgXGVuZGRvdWJsZWNvbHVtbnMgZ2V0cyBjb25mdXNlZCBpZiB0aGVyZSBpcyBubyB0ZXh0IGluIHRoZSBpbmRleCwKKyAgICAlIGFuZCBpdCBsb3NlcyB0aGUgY2hhcHRlciB0aXRsZSBhbmQgdGhlIGF1eCBmaWxlIGVudHJpZXMgZm9yIHRoZQorICAgICUgaW5kZXguICBUaGUgZWFzaWVzdCB3YXkgdG8gcHJldmVudCB0aGlzIHByb2JsZW0gaXMgdG8gbWFrZSBzdXJlCisgICAgJSB0aGVyZSBpcyBzb21lIHRleHQuCisgICAgXHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50CisgIFxlbHNlCisgICAgJQorICAgICUgSWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGJ1dCBpcyBlbXB0eSwgdGhlbiBcb3BlbmluIGxlYXZlcyBcaWZlb2YKKyAgICAlIGZhbHNlLiAgV2UgaGF2ZSB0byBtYWtlIFRlWCB0cnkgdG8gcmVhZCBzb21ldGhpbmcgZnJvbSB0aGUgZmlsZSwgc28KKyAgICAlIGl0IGNhbiBkaXNjb3ZlciBpZiB0aGVyZSBpcyBhbnl0aGluZyBpbiBpdC4KKyAgICBccmVhZCAxIHRvIFx0ZW1wCisgICAgXGlmZW9mIDEKKyAgICAgIFxwdXR3b3JkSW5kZXhJc0VtcHR5CisgICAgXGVsc2UKKyAgICAgICUgSW5kZXggZmlsZXMgYXJlIGFsbW9zdCBUZXhpbmZvIHNvdXJjZSwgYnV0IHdlIHVzZSBcIGFzIHRoZSBlc2NhcGUKKyAgICAgICUgY2hhcmFjdGVyLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBALCBidXQgdGhhdCdzIHRvbyBiaWcgYSBjaGFuZ2UKKyAgICAgICUgdG8gbWFrZSByaWdodCBub3cuCisgICAgICBcZGVmXGluZGV4YmFja3NsYXNoe1xiYWNrc2xhc2hjdXJmb250fSUKKyAgICAgIFxjYXRjb2RlYFxcID0gMAorICAgICAgXGVzY2FwZWNoYXIgPSBgXFwKKyAgICAgIFxiZWdpbmRvdWJsZWNvbHVtbnMKKyAgICAgIFxpbnB1dCBcam9ibmFtZS4jMXMKKyAgICAgIFxlbmRkb3VibGVjb2x1bW5zCisgICAgXGZpCisgIFxmaQorICBcY2xvc2VpbiAxCitcZW5kZ3JvdXB9CisKKyUgVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSBzb3J0ZWQgaW5kZXggZmlsZSBpdHNlbGYuCislIENoYW5nZSB0aGVtIHRvIGNvbnRyb2wgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluZGV4LgorCitcZGVmXGluaXRpYWwjMXt7JQorICAlIFNvbWUgbWlub3IgZm9udCBjaGFuZ2VzIGZvciB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICBcbGV0XHRlbnR0PVxzZWN0dCBcbGV0XHR0PVxzZWN0dCBcbGV0XHNmPVxzZWN0dAorICAlCisgICUgUmVtb3ZlIGFueSBnbHVlIHdlIG1heSBoYXZlLCB3ZSdsbCBiZSBpbnNlcnRpbmcgb3VyIG93bi4KKyAgXHJlbW92ZWxhc3Rza2lwCisgICUKKyAgJSBXZSBsaWtlIGJyZWFrcyBiZWZvcmUgdGhlIGluZGV4IGluaXRpYWxzLCBzbyBpbnNlcnQgYSBib251cy4KKyAgXG5vYnJlYWsKKyAgXHZza2lwIDBwdCBwbHVzIDNcYmFzZWxpbmVza2lwCisgIFxwZW5hbHR5IDAKKyAgXHZza2lwIDBwdCBwbHVzIC0zXGJhc2VsaW5lc2tpcAorICAlCisgICUgVHlwZXNldCB0aGUgaW5pdGlhbC4gIE1ha2luZyB0aGlzIGFkZCB1cCB0byBhIHdob2xlIG51bWJlciBvZgorICAlIGJhc2VsaW5lc2tpcHMgaW5jcmVhc2VzIHRoZSBjaGFuY2Ugb2YgdGhlIGRvdHMgbGluaW5nIHVwIGZyb20gY29sdW1uCisgICUgdG8gY29sdW1uLiAgSXQgc3RpbGwgd29uJ3Qgb2Z0ZW4gYmUgcGVyZmVjdCwgYmVjYXVzZSBvZiB0aGUgc3RyZXRjaAorICAlIHdlIG5lZWQgYmVmb3JlIGVhY2ggZW50cnksIGJ1dCBpdCdzIGJldHRlci4KKyAgJQorICAlIE5vIHNocmluayBiZWNhdXNlIGl0IGNvbmZ1c2VzIFxiYWxhbmNlY29sdW1ucy4KKyAgXHZza2lwIDEuNjdcYmFzZWxpbmVza2lwIHBsdXMgLjVcYmFzZWxpbmVza2lwCisgIFxsZWZ0bGluZXtcc2VjYmYgIzF9JQorICAlIERvIG91ciBiZXN0IG5vdCB0byBicmVhayBhZnRlciB0aGUgaW5pdGlhbC4KKyAgXG5vYnJlYWsKKyAgXHZza2lwIC4zM1xiYXNlbGluZXNraXAgcGx1cyAuMVxiYXNlbGluZXNraXAKK319CisKKyUgXGVudHJ5IHR5cGVzZXRzIGEgcGFyYWdyYXBoIGNvbnNpc3Rpbmcgb2YgdGhlIHRleHQgKCMxKSwgZG90IGxlYWRlcnMsIGFuZAorJSB0aGVuIHBhZ2UgbnVtYmVyICgjMikgZmx1c2hlZCB0byB0aGUgcmlnaHQgbWFyZ2luLiAgSXQgaXMgdXNlZCBmb3IgaW5kZXgKKyUgYW5kIHRhYmxlIG9mIGNvbnRlbnRzIGVudHJpZXMuICBUaGUgcGFyYWdyYXBoIGlzIGluZGVudGVkIGJ5IFxsZWZ0c2tpcC4KKyUKKyUgQSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gd291bGQgc3RhcnQgbGlrZSB0aGlzOgorJQlcZGVmXGVudHJ5IzEjMnsuLi4KKyUgQnV0IHRoaXMgZnJvemVzIHRoZSBjYXRjb2RlcyBpbiB0aGUgYXJndW1lbnQsIGFuZCBjYW4gY2F1c2UgcHJvYmxlbXMgdG8KKyUgQGNvZGUsIHdoaWNoIHNldHMgLSBhY3RpdmUuICBUaGlzIHByb2JsZW0gd2FzIGZpeGVkIGJ5IGEga2x1ZGdlLS0tCislIGBgLScnIHdhcyBhY3RpdmUgdGhyb3VnaG91dCB3aG9sZSBpbmRleCwgYnV0IHRoaXMgaXNuJ3QgcmVhbGx5IHJpZ2h0LgorJQorJSBUaGUgcmlnaHQgc29sdXRpb24gaXMgdG8gcHJldmVudCBcZW50cnkgZnJvbSBzd2FsbG93aW5nIHRoZSB3aG9sZSB0ZXh0LgorJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0ta2FzYWwsIDIxbm92MDMKK1xkZWZcZW50cnl7JQorICBcYmVnaW5ncm91cAorICAgICUKKyAgICAlIFN0YXJ0IGEgbmV3IHBhcmFncmFwaCBpZiBuZWNlc3NhcnksIHNvIG91ciBhc3NpZ25tZW50cyBiZWxvdyBjYW4ndAorICAgICUgYWZmZWN0IHByZXZpb3VzIHRleHQuCisgICAgXHBhcgorICAgICUKKyAgICAlIERvIG5vdCBmaWxsIG91dCB0aGUgbGFzdCBsaW5lIHdpdGggd2hpdGUgc3BhY2UuCisgICAgXHBhcmZpbGxza2lwID0gMGluCisgICAgJQorICAgICUgTm8gZXh0cmEgc3BhY2UgYWJvdmUgdGhpcyBwYXJhZ3JhcGguCisgICAgXHBhcnNraXAgPSAwaW4KKyAgICAlCisgICAgJSBEbyBub3QgcHJlZmVyIGEgc2VwYXJhdGUgbGluZSBlbmRpbmcgd2l0aCBhIGh5cGhlbiB0byBmZXdlciBsaW5lcy4KKyAgICBcZmluYWxoeXBoZW5kZW1lcml0cyA9IDAKKyAgICAlCisgICAgJSBcaGFuZ2luZGVudCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIGVudHJ5IHRleHQgYW5kIHBhZ2UgbnVtYmVyCisgICAgJSBkb24ndCBib3RoIGZpdCBvbiBvbmUgbGluZS4gIEluIHRoYXQgY2FzZSwgYm9iIHN1Z2dlc3RzIHN0YXJ0aW5nIHRoZQorICAgICUgZG90cyBwcmV0dHkgZmFyIG92ZXIgb24gdGhlIGxpbmUuICBVbmZvcnR1bmF0ZWx5LCBhIGxhcmdlCisgICAgJSBpbmRlbnRhdGlvbiBsb29rcyB3cm9uZyB3aGVuIHRoZSBlbnRyeSB0ZXh0IGl0c2VsZiBpcyBicm9rZW4gYWNyb3NzCisgICAgJSBsaW5lcy4gIFNvIHdlIHVzZSBhIHNtYWxsIGluZGVudGF0aW9uIGFuZCBwdXQgdXAgd2l0aCBsb25nIGxlYWRlcnMuCisgICAgJQorICAgICUgXGhhbmdhZnRlciBpcyByZXNldCB0byAxICh3aGljaCBpcyB0aGUgdmFsdWUgd2Ugd2FudCkgYXQgdGhlIHN0YXJ0CisgICAgJSBvZiBlYWNoIHBhcmFncmFwaCwgc28gd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGF0LgorICAgIFxoYW5naW5kZW50ID0gMmVtCisgICAgJQorICAgICUgV2hlbiB0aGUgZW50cnkgdGV4dCBuZWVkcyB0byBiZSBicm9rZW4sIGp1c3QgZmlsbCBvdXQgdGhlIGZpcnN0IGxpbmUKKyAgICAlIHdpdGggYmxhbmsgc3BhY2UuCisgICAgXHJpZ2h0c2tpcCA9IDBwdCBwbHVzMWZpbAorICAgICUKKyAgICAlIEEgYml0IG9mIHN0cmV0Y2ggYmVmb3JlIGVhY2ggZW50cnkgZm9yIHRoZSBiZW5lZml0IG9mIGJhbGFuY2luZworICAgICUgY29sdW1ucy4KKyAgICBcdnNraXAgMHB0IHBsdXMxcHQKKyAgICAlCisgICAgJSBTd2FsbG93IHRoZSBsZWZ0IGJyYWNlIG9mIHRoZSB0ZXh0IChmaXJzdCBwYXJhbWV0ZXIpOgorICAgIFxhZnRlcmFzc2lnbm1lbnRcZG9lbnRyeQorICAgIFxsZXRcdGVtcCA9Cit9CitcZGVmXGRvZW50cnl7JQorICAgIFxiZ3JvdXAgJSBJbnN0ZWFkIG9mIHRoZSBzd2FsbG93ZWQgYnJhY2UuCisgICAgICBcbm9pbmRlbnQKKyAgICAgIFxhZnRlcmdyb3VwXGZpbmlzaGVudHJ5CisgICAgICAlIEFuZCBub3cgY29tZXMgdGhlIHRleHQgb2YgdGhlIGVudHJ5LgorfQorXGRlZlxmaW5pc2hlbnRyeSMxeyUKKyAgICAlICMxIGlzIHRoZSBwYWdlIG51bWJlci4KKyAgICAlCisgICAgJSBUaGUgZm9sbG93aW5nIGlzIGtsdWRnZWQgdG8gbm90IG91dHB1dCBhIGxpbmUgb2YgZG90cyBpbiB0aGUgaW5kZXggaWYKKyAgICAlIHRoZXJlIGFyZSBubyBwYWdlIG51bWJlcnMuICBUaGUgbmV4dCBwZXJzb24gd2hvIGJyZWFrcyB0aGlzIHdpbGwgYmUKKyAgICAlIGN1cnNlZCBieSBhIFVuaXggZGFlbW9uLgorICAgIFxkZWZcdGVtcGF7e1xybSB9fSUKKyAgICBcZGVmXHRlbXBieyMxfSUKKyAgICBcZWRlZlx0ZW1wY3tcdGVtcGF9JQorICAgIFxlZGVmXHRlbXBke1x0ZW1wYn0lCisgICAgXGlmeFx0ZW1wY1x0ZW1wZAorICAgICAgXCAlCisgICAgXGVsc2UKKyAgICAgICUKKyAgICAgICUgSWYgd2UgbXVzdCwgcHV0IHRoZSBwYWdlIG51bWJlciBvbiBhIGxpbmUgb2YgaXRzIG93biwgYW5kIGZpbGwgb3V0CisgICAgICAlIHRoaXMgbGluZSB3aXRoIGJsYW5rIHNwYWNlLiAgKFRoZSBcaGZpbCBpcyBvdmVyd2hlbG1lZCB3aXRoIHRoZQorICAgICAgJSBmaWxsIGxlYWRlcnMgZ2x1ZSBpbiBcaW5kZXhkb3RmaWxsIGlmIHRoZSBwYWdlIG51bWJlciBkb2VzIGZpdC4pCisgICAgICBcaGZpbFxwZW5hbHR5NTAKKyAgICAgIFxudWxsXG5vYnJlYWtcaW5kZXhkb3RmaWxsICUgSGF2ZSBsZWFkZXJzIGJlZm9yZSB0aGUgcGFnZSBudW1iZXIuCisgICAgICAlCisgICAgICAlIFRoZSBgXCAnIGhlcmUgaXMgcmVtb3ZlZCBieSB0aGUgaW1wbGljaXQgXHVuc2tpcCB0aGF0IFRlWCBkb2VzIGFzCisgICAgICAlIHBhcnQgb2YgKHRoZSBwcmltaXRpdmUpIFxwYXIuICBXaXRob3V0IGl0LCBhIHNwdXJpb3VzIHVuZGVyZnVsbAorICAgICAgJSBcaGJveCBlbnN1ZXMuCisgICAgICBcaWZwZGYKKwlccGRmZ2V0dG9rcyMxLiUKKwlcIFx0aGVcdG9rc0EKKyAgICAgIFxlbHNlCisJXCAjMSUKKyAgICAgIFxmaQorICAgIFxmaQorICAgIFxwYXIKKyAgXGVuZGdyb3VwCit9CisKKyUgTGlrZSBcZG90ZmlsbCBleGNlcHQgdGFrZXMgYXQgbGVhc3QgMSBlbS4KK1xkZWZcaW5kZXhkb3RmaWxse1xjbGVhZGVycworICBcaGJveHskXG1hdGhzdXJyb3VuZD0wcHQgXG1rZXJuMS41bXUgJHtcaXQgLn0kIFxta2VybjEuNW11JH1caHNraXAgMWVtIHBsdXMgMWZpbGx9CisKK1xkZWZccHJpbWFyeSAjMXtcbGluZXsjMVxoZmlsfX0KKworXG5ld3NraXBcc2Vjb25kYXJ5aW5kZW50IFxzZWNvbmRhcnlpbmRlbnQ9MC41Y20KK1xkZWZcc2Vjb25kYXJ5IzEjMnt7JQorICBccGFyZmlsbHNraXA9MGluCisgIFxwYXJza2lwPTBpbgorICBcaGFuZ2luZGVudD0xaW4KKyAgXGhhbmdhZnRlcj0xCisgIFxub2luZGVudFxoc2tpcFxzZWNvbmRhcnlpbmRlbnRcaGJveHsjMX1caW5kZXhkb3RmaWxsCisgIFxpZnBkZgorICAgIFxwZGZnZXR0b2tzIzIuXCBcdGhlXHRva3NBICUgVGhlIHBhZ2UgbnVtYmVyIGVuZHMgdGhlIHBhcmFncmFwaC4KKyAgXGVsc2UKKyAgICAjMgorICBcZmkKKyAgXHBhcgorfX0KKworJSBEZWZpbmUgdHdvLWNvbHVtbiBtb2RlLCB3aGljaCB3ZSB1c2UgdG8gdHlwZXNldCBpbmRleGVzLgorJSBBZGFwdGVkIGZyb20gdGhlIFRlWGJvb2ssIHBhZ2UgNDE2LCB3aGljaCBpcyB0byBzYXksCislIHRoZSBtYW5tYWMudGV4IGZvcm1hdCB1c2VkIHRvIHByaW50IHRoZSBUZVhib29rIGl0c2VsZi4KK1xjYXRjb2RlYFxAPTExCisKK1xuZXdib3hccGFydGlhbHBhZ2UKK1xuZXdkaW1lblxkb3VibGVjb2x1bW5oc2l6ZQorCitcZGVmXGJlZ2luZG91YmxlY29sdW1uc3tcYmVnaW5ncm91cCAlIGVuZGVkIGJ5IFxlbmRkb3VibGVjb2x1bW5zCisgICUgR3JhYiBhbnkgc2luZ2xlLWNvbHVtbiBtYXRlcmlhbCBhYm92ZSB1cy4KKyAgXG91dHB1dCA9IHslCisgICAgJQorICAgICUgSGVyZSBpcyBhIHBvc3NpYmlsaXR5IG5vdCBmb3Jlc2VlbiBpbiBtYW5tYWM6IGlmIHdlIGFjY3VtdWxhdGUgYQorICAgICUgd2hvbGUgbG90IG9mIG1hdGVyaWFsLCB3ZSBtaWdodCBlbmQgdXAgY2FsbGluZyB0aGlzIFxvdXRwdXQKKyAgICAlIHJvdXRpbmUgdHdpY2UgaW4gYSByb3cgKHNlZSB0aGUgZG91YmxlY29sLWxvc2UgdGVzdCwgd2hpY2ggaXMKKyAgICAlIGVzc2VudGlhbGx5IGEgY291cGxlIG9mIGluZGV4ZXMgd2l0aCBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmKS4gIEluCisgICAgJSB0aGF0IGNhc2Ugd2UganVzdCBzaGlwIG91dCB3aGF0IGlzIGluIFxwYXJ0aWFscGFnZSB3aXRoIHRoZSBub3JtYWwKKyAgICAlIG91dHB1dCByb3V0aW5lLiAgR2VuZXJhbGx5LCBccGFydGlhbHBhZ2Ugd2lsbCBiZSBlbXB0eSB3aGVuIHRoaXMKKyAgICAlIHJ1bnMgYW5kIHRoaXMgd2lsbCBiZSBhIG5vLW9wLiAgU2VlIHRoZSBpbmRleHNwcmVhZC50ZXggdGVzdCBjYXNlLgorICAgIFxpZnZvaWRccGFydGlhbHBhZ2UgXGVsc2UKKyAgICAgIFxvbmVwYWdlb3V0e1xwYWdlY29udGVudHNccGFydGlhbHBhZ2V9JQorICAgIFxmaQorICAgICUKKyAgICBcZ2xvYmFsXHNldGJveFxwYXJ0aWFscGFnZSA9IFx2Ym94eyUKKyAgICAgICUgVW52Ym94IHRoZSBtYWluIG91dHB1dCBwYWdlLgorICAgICAgXHVudmJveFxQQUdFCisgICAgICBca2Vybi1cdG9wc2tpcCBca2VyblxiYXNlbGluZXNraXAKKyAgICB9JQorICB9JQorICBcZWplY3QgJSBydW4gdGhhdCBvdXRwdXQgcm91dGluZSB0byBzZXQgXHBhcnRpYWxwYWdlCisgICUKKyAgJSBVc2UgdGhlIGRvdWJsZS1jb2x1bW4gb3V0cHV0IHJvdXRpbmUgZm9yIHN1YnNlcXVlbnQgcGFnZXMuCisgIFxvdXRwdXQgPSB7XGRvdWJsZWNvbHVtbm91dH0lCisgICUKKyAgJSBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBwYXJhbWV0ZXJzLiAgV2UgY291bGQgZG8gdGhpcyBvbmNlIG91dHNpZGUgdGhpcworICAlIHJvdXRpbmUsIGluIGVhY2ggb2YgQHNtYWxsYm9vaywgQGFmb3VycGFwZXIsIGFuZCB0aGUgZGVmYXVsdCA4LjV4MTEKKyAgJSBmb3JtYXQsIGJ1dCB0aGVuIHdlIHJlcGVhdCB0aGUgc2FtZSBjb21wdXRhdGlvbi4gIFJlcGVhdGluZyBhIGNvdXBsZQorICAlIG9mIGFzc2lnbm1lbnRzIG9uY2UgcGVyIGluZGV4IGlzIGNsZWFybHkgbWVhbmluZ2xlc3MgZm9yIHRoZQorICAlIGV4ZWN1dGlvbiB0aW1lLCBzbyB3ZSBtYXkgYXMgd2VsbCBkbyBpdCBpbiBvbmUgcGxhY2UuCisgICUKKyAgJSBGaXJzdCB3ZSBoYWx2ZSB0aGUgbGluZSBsZW5ndGgsIGxlc3MgYSBsaXR0bGUgZm9yIHRoZSBndXR0ZXIgYmV0d2VlbgorICAlIHRoZSBjb2x1bW5zLiAgV2UgY29tcHV0ZSB0aGUgZ3V0dGVyIGJhc2VkIG9uIHRoZSBsaW5lIGxlbmd0aCwgc28gaXQKKyAgJSBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgcGFwZXIgZm9ybWF0LiAgVGhlIG1hZ2ljIGNvbnN0YW50CisgICUgYmVsb3cgaXMgY2hvc2VuIHNvIHRoYXQgdGhlIGd1dHRlciBoYXMgdGhlIHNhbWUgdmFsdWUgKHdlbGwsICstPDFwdCkKKyAgJSBhcyBpdCBkaWQgd2hlbiB3ZSBoYXJkLWNvZGVkIGl0LgorICAlCisgICUgV2UgcHV0IHRoZSByZXN1bHQgaW4gYSBzZXBhcmF0ZSByZWdpc3RlciwgXGRvdWJsZWNvbHVtaHNpemUsIHNvIHdlCisgICUgY2FuIHJlc3RvcmUgaXQgaW4gXHBhZ2Vzb2ZhciwgYWZ0ZXIgXGhzaXplIGl0c2VsZiBoYXMgKHBvdGVudGlhbGx5KQorICAlIGJlZW4gY2xvYmJlcmVkLgorICAlCisgIFxkb3VibGVjb2x1bW5oc2l6ZSA9IFxoc2l6ZQorICAgIFxhZHZhbmNlXGRvdWJsZWNvbHVtbmhzaXplIGJ5IC0uMDQxNTRcaHNpemUKKyAgICBcZGl2aWRlXGRvdWJsZWNvbHVtbmhzaXplIGJ5IDIKKyAgXGhzaXplID0gXGRvdWJsZWNvbHVtbmhzaXplCisgICUKKyAgJSBEb3VibGUgdGhlIFx2c2l6ZSBhcyB3ZWxsLiAgKFdlIGRvbid0IG5lZWQgYSBzZXBhcmF0ZSByZWdpc3RlciBoZXJlLAorICAlIHNpbmNlIG5vYm9keSBjbG9iYmVycyBcdnNpemUuKQorICBcdnNpemUgPSAyXHZzaXplCit9CisKKyUgVGhlIGRvdWJsZS1jb2x1bW4gb3V0cHV0IHJvdXRpbmUgZm9yIGFsbCBkb3VibGUtY29sdW1uIHBhZ2VzIGV4Y2VwdAorJSB0aGUgbGFzdC4KKyUKK1xkZWZcZG91YmxlY29sdW1ub3V0eyUKKyAgXHNwbGl0dG9wc2tpcD1cdG9wc2tpcCBcc3BsaXRtYXhkZXB0aD1cbWF4ZGVwdGgKKyAgJSBHZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSBmb3IgdGhlIGRvdWJsZSBjb2x1bW5zIC0tIHRoZSBub3JtYWwKKyAgJSAodW5kb3VibGVkKSBwYWdlIGhlaWdodCBtaW51cyBhbnkgbWF0ZXJpYWwgbGVmdCBvdmVyIGZyb20gdGhlCisgICUgcHJldmlvdXMgcGFnZS4KKyAgXGRpbWVuQCA9IFx2c2l6ZQorICBcZGl2aWRlXGRpbWVuQCBieSAyCisgIFxhZHZhbmNlXGRpbWVuQCBieSAtXGh0XHBhcnRpYWxwYWdlCisgICUKKyAgJSBib3gwIHdpbGwgYmUgdGhlIGxlZnQtaGFuZCBjb2x1bW4sIGJveDIgdGhlIHJpZ2h0LgorICBcc2V0Ym94MD1cdnNwbGl0MjU1IHRvXGRpbWVuQCBcc2V0Ym94Mj1cdnNwbGl0MjU1IHRvXGRpbWVuQAorICBcb25lcGFnZW91dFxwYWdlc29mYXIKKyAgXHVudmJveDI1NQorICBccGVuYWx0eVxvdXRwdXRwZW5hbHR5Cit9CislCislIFJlLW91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG91dHB1dCBwYWdlIC0tIGFueSBwcmV2aW91cyBtYXRlcmlhbCwKKyUgZm9sbG93ZWQgYnkgdGhlIHR3byBib3hlcyB3ZSBqdXN0IHNwbGl0LCBpbiBib3gwIGFuZCBib3gyLgorXGRlZlxwYWdlc29mYXJ7JQorICBcdW52Ym94XHBhcnRpYWxwYWdlCisgICUKKyAgXGhzaXplID0gXGRvdWJsZWNvbHVtbmhzaXplCisgIFx3ZDA9XGhzaXplIFx3ZDI9XGhzaXplCisgIFxoYm94IHRvXHBhZ2V3aWR0aHtcYm94MFxoZmlsXGJveDJ9JQorfQorJQorJSBBbGwgZG9uZSB3aXRoIGRvdWJsZSBjb2x1bW5zLgorXGRlZlxlbmRkb3VibGVjb2x1bW5zeyUKKyAgXG91dHB1dCA9IHslCisgICAgJSBTcGxpdCB0aGUgbGFzdCBvZiB0aGUgZG91YmxlLWNvbHVtbiBtYXRlcmlhbC4gIExlYXZlIGl0IG9uIHRoZQorICAgICUgY3VycmVudCBwYWdlLCBubyBhdXRvbWF0aWMgcGFnZSBicmVhay4KKyAgICBcYmFsYW5jZWNvbHVtbnMKKyAgICAlCisgICAgJSBJZiB3ZSBlbmQgdXAgc3BsaXR0aW5nIHRvbyBtdWNoIG1hdGVyaWFsIGZvciB0aGUgY3VycmVudCBwYWdlLAorICAgICUgdGhvdWdoLCB0aGVyZSB3aWxsIGJlIGFub3RoZXIgcGFnZSBicmVhayByaWdodCBhZnRlciB0aGlzIFxvdXRwdXQKKyAgICAlIGludm9jYXRpb24gZW5kcy4gIEhhdmluZyBjYWxsZWQgXGJhbGFuY2Vjb2x1bW5zIG9uY2UsIHdlIGRvIG5vdAorICAgICUgd2FudCB0byBjYWxsIGl0IGFnYWluLiAgVGhlcmVmb3JlLCByZXNldCBcb3V0cHV0IHRvIGl0cyBub3JtYWwKKyAgICAlIGRlZmluaXRpb24gcmlnaHQgYXdheS4gIChXZSBob3BlIFxiYWxhbmNlY29sdW1ucyB3aWxsIG5ldmVyIGJlCisgICAgJSBjYWxsZWQgb24gdG8gYmFsYW5jZSB0b28gbXVjaCBtYXRlcmlhbCwgYnV0IGlmIGl0IGlzLCB0aGlzIG1ha2VzCisgICAgJSB0aGUgb3V0cHV0IHNvbWV3aGF0IG1vcmUgcGFsYXRhYmxlLikKKyAgICBcZ2xvYmFsXG91dHB1dCA9IHtcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXFBBR0V9fSUKKyAgfSUKKyAgXGVqZWN0CisgIFxlbmRncm91cCAlIHN0YXJ0ZWQgaW4gXGJlZ2luZG91YmxlY29sdW1ucworICAlCisgICUgXHBhZ2Vnb2FsIHdhcyBzZXQgdG8gdGhlIGRvdWJsZWQgXHZzaXplIGFib3ZlLCBzaW5jZSB3ZSByZXN0YXJ0ZWQKKyAgJSB0aGUgY3VycmVudCBwYWdlLiAgV2UncmUgbm93IGJhY2sgdG8gbm9ybWFsIHNpbmdsZS1jb2x1bW4KKyAgJSB0eXBlc2V0dGluZywgc28gcmVzZXQgXHBhZ2Vnb2FsIHRvIHRoZSBub3JtYWwgXHZzaXplIChhZnRlciB0aGUKKyAgJSBcZW5kZ3JvdXAgd2hlcmUgXHZzaXplIGdvdCByZXN0b3JlZCkuCisgIFxwYWdlZ29hbCA9IFx2c2l6ZQorfQorJQorJSBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZG91YmxlIGNvbHVtbiBtYXRlcmlhbC4KK1xkZWZcYmFsYW5jZWNvbHVtbnN7JQorICBcc2V0Ym94MCA9IFx2Ym94e1x1bnZib3gyNTV9JSBsaWtlIFxib3gyNTUgYnV0IG1vcmUgZWZmaWNpZW50LCBzZWUgcC4xMjAuCisgIFxkaW1lbkAgPSBcaHQwCisgIFxhZHZhbmNlXGRpbWVuQCBieSBcdG9wc2tpcAorICBcYWR2YW5jZVxkaW1lbkAgYnktXGJhc2VsaW5lc2tpcAorICBcZGl2aWRlXGRpbWVuQCBieSAyICUgdGFyZ2V0IHRvIHNwbGl0IHRvCisgICVkZWJ1Z1xtZXNzYWdle2ZpbmFsIDItY29sdW1uIG1hdGVyaWFsIGhlaWdodD1cdGhlXGh0MCwgdGFyZ2V0PVx0aGVcZGltZW5ALn0lCisgIFxzcGxpdHRvcHNraXAgPSBcdG9wc2tpcAorICAlIExvb3AgdW50aWwgd2UgZ2V0IGEgZGVjZW50IGJyZWFrcG9pbnQuCisgIHslCisgICAgXHZiYWRuZXNzID0gMTAwMDAKKyAgICBcbG9vcAorICAgICAgXGdsb2JhbFxzZXRib3gzID0gXGNvcHkwCisgICAgICBcZ2xvYmFsXHNldGJveDEgPSBcdnNwbGl0MyB0byBcZGltZW5ACisgICAgXGlmZGltXGh0Mz5cZGltZW5ACisgICAgICBcZ2xvYmFsXGFkdmFuY2VcZGltZW5AIGJ5IDFwdAorICAgIFxyZXBlYXQKKyAgfSUKKyAgJWRlYnVnXG1lc3NhZ2V7c3BsaXQgdG8gXHRoZVxkaW1lbkAsIGNvbHVtbiBoZWlnaHRzOiBcdGhlXGh0MSwgXHRoZVxodDMufSUKKyAgXHNldGJveDA9XHZib3ggdG9cZGltZW5Ae1x1bnZib3gxfSUKKyAgXHNldGJveDI9XHZib3ggdG9cZGltZW5Ae1x1bnZib3gzfSUKKyAgJQorICBccGFnZXNvZmFyCit9CitcY2F0Y29kZWBcQCA9IFxvdGhlcgorCisKK1xtZXNzYWdle3NlY3Rpb25pbmcsfQorJSBDaGFwdGVycywgc2VjdGlvbnMsIGV0Yy4KKworJSBcdW5udW1iZXJlZG5vIGlzIGFuIG94eW1vcm9uLCBvZiBjb3Vyc2UuICBCdXQgd2UgY291bnQgdGhlIHVubnVtYmVyZWQKKyUgc2VjdGlvbnMgc28gdGhhdCB3ZSBjYW4gcmVmZXIgdG8gdGhlbSB1bmFtYmlndW91c2x5IGluIHRoZSBwZGYKKyUgb3V0bGluZXMgYnkgdGhlaXIgInNlY3Rpb24gbnVtYmVyIi4gIFdlIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBjaGFwdGVyCislIG51bWJlcnMgYnkgc3RhcnRpbmcgdGhlbSBhdCAxMDAwMC4gIChJZiBhIGRvY3VtZW50IGV2ZXIgaGFzIDEwMDAwCislIGNoYXB0ZXJzLCB3ZSdyZSBpbiB0cm91YmxlIGFueXdheSwgSSdtIHN1cmUuKQorXG5ld2NvdW50XHVubnVtYmVyZWRubyBcdW5udW1iZXJlZG5vID0gMTAwMDAKK1xuZXdjb3VudFxjaGFwbm8KK1xuZXdjb3VudFxzZWNubyAgICAgICAgXHNlY25vPTAKK1xuZXdjb3VudFxzdWJzZWNubyAgICAgXHN1YnNlY25vPTAKK1xuZXdjb3VudFxzdWJzdWJzZWNubyAgXHN1YnN1YnNlY25vPTAKKworJSBUaGlzIGNvdW50ZXIgaXMgZnVubnkgc2luY2UgaXQgY291bnRzIHRocm91Z2ggY2hhcmNvZGVzIG9mIGxldHRlcnMgQSwgQiwgLi4uCitcbmV3Y291bnRcYXBwZW5kaXhubyAgXGFwcGVuZGl4bm8gPSBgXEAKKyUKKyUgXGRlZlxhcHBlbmRpeGxldHRlcntcY2hhclx0aGVcYXBwZW5kaXhub30KKyUgV2UgZG8gdGhlIGZvbGxvd2luZyB1Z2x5IGNvbmRpdGlvbmFsIGluc3RlYWQgb2YgdGhlIGFib3ZlIHNpbXBsZQorJSBjb25zdHJ1Y3QgZm9yIHRoZSBzYWtlIG9mIHBkZnRleCwgd2hpY2ggbmVlZHMgdGhlIGFjdHVhbAorJSBsZXR0ZXIgaW4gdGhlIGV4cGFuc2lvbiwgbm90IGp1c3QgdHlwZXNldC4KKyUKK1xkZWZcYXBwZW5kaXhsZXR0ZXJ7JQorICBcaWZudW1cYXBwZW5kaXhubz1gQSBBJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBCIEIlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEMgQyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gRCBEJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBFIEUlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEYgRiUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gRyBHJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBIIEglCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEkgSSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gSiBKJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBLIEslCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEwgTCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTSBNJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBOIE4lCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YE8gTyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gUCBQJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBRIFElCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFIgUiUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gUyBTJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBUIFQlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFUgVSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gViBWJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBXIFclCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFggWCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gWSBZJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBaIFolCisgICUgVGhlIFx0aGUgaXMgbmVjZXNzYXJ5LCBkZXNwaXRlIGFwcGVhcmFuY2VzLCBiZWNhdXNlIFxhcHBlbmRpeGxldHRlciBpcworICAlIGV4cGFuZGVkIHdoaWxlIHdyaXRpbmcgdGhlIC50b2MgZmlsZS4gIFxjaGFyXGFwcGVuZGl4bm8gaXMgbm90CisgICUgZXhwYW5kYWJsZSwgdGh1cyBpdCBpcyB3cml0dGVuIGxpdGVyYWxseSwgdGh1cyBhbGwgYXBwZW5kaXhlcyBjb21lIG91dAorICAlIHdpdGggdGhlIHNhbWUgbGV0dGVyIChvciBAKSBpbiB0aGUgdG9jIHdpdGhvdXQgaXQuCisgIFxlbHNlXGNoYXJcdGhlXGFwcGVuZGl4bm8KKyAgXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpCisgIFxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaX0KKworJSBFYWNoIEBjaGFwdGVyIGRlZmluZXMgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgY2hhcHRlci4KKyUgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MgY2FuIHVzZSBpdC4gIEBzZWN0aW9uIGRvZXMgbGlrZXdpc2UuCislIEhvd2V2ZXIsIHRoZXkgYXJlIG5vdCByZWxpYWJsZSwgYmVjYXVzZSB3ZSBkb24ndCB1c2UgbWFya3MuCitcZGVmXHRoaXNjaGFwdGVye30KK1xkZWZcdGhpc3NlY3Rpb257fQorCitcbmV3Y291bnRcYWJzc2VjbGV2ZWwgJSB1c2VkIHRvIGNhbGN1bGF0ZSBwcm9wZXIgaGVhZGluZyBsZXZlbAorXG5ld2NvdW50XHNlY2Jhc2Vcc2VjYmFzZT0wICUgQHJhaXNlc2VjdGlvbnMvQGxvd2Vyc2VjdGlvbnMgbW9kaWZ5IHRoaXMgY291bnQKKworJSBAcmFpc2VzZWN0aW9uczogdHJlYXQgQHNlY3Rpb24gYXMgY2hhcHRlciwgQHN1YnNlY3Rpb24gYXMgc2VjdGlvbiwgZXRjLgorXGRlZlxyYWlzZXNlY3Rpb25ze1xnbG9iYWxcYWR2YW5jZVxzZWNiYXNlIGJ5IC0xfQorXGxldFx1cD1ccmFpc2VzZWN0aW9ucyAlIG9yaWdpbmFsIEJGb3ggbmFtZQorCislIEBsb3dlcnNlY3Rpb25zOiB0cmVhdCBAY2hhcHRlciBhcyBzZWN0aW9uLCBAc2VjdGlvbiBhcyBzdWJzZWN0aW9uLCBldGMuCitcZGVmXGxvd2Vyc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgMX0KK1xsZXRcZG93bj1cbG93ZXJzZWN0aW9ucyAlIG9yaWdpbmFsIEJGb3ggbmFtZQorCislIHdlIG9ubHkgaGF2ZSBzdWJzdWIuCitcY2hhcmRlZlxtYXhzZWNsZXZlbCA9IDMKKyUKKyUgQSBudW1iZXJlZCBzZWN0aW9uIHdpdGhpbiBhbiB1bm51bWJlcmVkIGNoYW5nZXMgdG8gdW5udW1iZXJlZCB0b28uCislIFRvIGFjaGl2ZSB0aGlzLCByZW1lbWJlciB0aGUgImJpZ2dlc3QiIHVubnVtLiBzZWMuIHdlIGFyZSBjdXJyZW50bHkgaW46CitcY2hhcmRlZlx1bm1sZXZlbCA9IFxtYXhzZWNsZXZlbAorJQorJSBUcmFjZSB3aGV0aGVyIHRoZSBjdXJyZW50IGNoYXB0ZXIgaXMgYW4gYXBwZW5kaXggb3Igbm90OgorJSBcY2hhcGhlYWR0eXBlIGlzICJOIiBvciAiQSIsIHVubnVtYmVyZWQgY2hhcHRlcnMgYXJlIGlnbm9yZWQuCitcZGVmXGNoYXBoZWFkdHlwZXtOfQorCislIENob29zZSBhIGhlYWRpbmcgbWFjcm8KKyUgIzEgaXMgaGVhZGluZyB0eXBlCislICMyIGlzIGhlYWRpbmcgbGV2ZWwKKyUgIzMgaXMgdGV4dCBmb3IgaGVhZGluZworXGRlZlxnZW5oZWFkIzEjMiMzeyUKKyAgJSBDb21wdXRlIHRoZSBhYnMuIHNlYy4gbGV2ZWw6CisgIFxhYnNzZWNsZXZlbD0jMgorICBcYWR2YW5jZVxhYnNzZWNsZXZlbCBieSBcc2VjYmFzZQorICAlIE1ha2Ugc3VyZSBcYWJzc2VjbGV2ZWwgZG9lc24ndCBmYWxsIG91dHNpZGUgdGhlIHJhbmdlOgorICBcaWZudW0gXGFic3NlY2xldmVsIDwgMAorICAgIFxhYnNzZWNsZXZlbCA9IDAKKyAgXGVsc2UKKyAgICBcaWZudW0gXGFic3NlY2xldmVsID4gMworICAgICAgXGFic3NlY2xldmVsID0gMworICAgIFxmaQorICBcZmkKKyAgJSBUaGUgaGVhZGluZyB0eXBlOgorICBcZGVmXGhlYWR0eXBleyMxfSUKKyAgXGlmIFxoZWFkdHlwZSBVJQorICAgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPCBcdW5tbGV2ZWwKKyAgICAgIFxjaGFyZGVmXHVubWxldmVsID0gXGFic3NlY2xldmVsCisgICAgXGZpCisgIFxlbHNlCisgICAgJSBDaGVjayBmb3IgYXBwZW5kaXggc2VjdGlvbnM6CisgICAgXGlmbnVtIFxhYnNzZWNsZXZlbCA9IDAKKyAgICAgIFxlZGVmXGNoYXBoZWFkdHlwZXtcaGVhZHR5cGV9JQorICAgIFxlbHNlCisgICAgICBcaWYgXGhlYWR0eXBlIEFcaWYgXGNoYXBoZWFkdHlwZSBOJQorCVxlcnJtZXNzYWdle0BhcHBlbmRpeC4uLiB3aXRoaW4gYSBub24tYXBwZW5kaXggY2hhcHRlcn0lCisgICAgICBcZmlcZmkKKyAgICBcZmkKKyAgICAlIENoZWNrIGZvciBudW1iZXJlZCB3aXRoaW4gdW5udW1iZXJlZDoKKyAgICBcaWZudW0gXGFic3NlY2xldmVsID4gXHVubWxldmVsCisgICAgICBcZGVmXGhlYWR0eXBle1V9JQorICAgIFxlbHNlCisgICAgICBcY2hhcmRlZlx1bm1sZXZlbCA9IDMKKyAgICBcZmkKKyAgXGZpCisgICUgTm93IHByaW50IHRoZSBoZWFkaW5nOgorICBcaWYgXGhlYWR0eXBlIFUlCisgICAgXGlmY2FzZVxhYnNzZWNsZXZlbAorCVx1bm51bWJlcmVkenp6eyMzfSUKKyAgICBcb3IgXHVubnVtYmVyZWRzZWN6enp7IzN9JQorICAgIFxvciBcdW5udW1iZXJlZHN1YnNlY3p6ensjM30lCisgICAgXG9yIFx1bm51bWJlcmVkc3Vic3Vic2Vjenp6eyMzfSUKKyAgICBcZmkKKyAgXGVsc2UKKyAgICBcaWYgXGhlYWR0eXBlIEElCisgICAgICBcaWZjYXNlXGFic3NlY2xldmVsCisJICBcYXBwZW5kaXh6enp7IzN9JQorICAgICAgXG9yIFxhcHBlbmRpeHNlY3Rpb256enp7IzN9JQorICAgICAgXG9yIFxhcHBlbmRpeHN1YnNlY3p6ensjM30lCisgICAgICBcb3IgXGFwcGVuZGl4c3Vic3Vic2Vjenp6eyMzfSUKKyAgICAgIFxmaQorICAgIFxlbHNlCisgICAgICBcaWZjYXNlXGFic3NlY2xldmVsCisJICBcY2hhcHRlcnp6ensjM30lCisgICAgICBcb3IgXHNlY3p6ensjM30lCisgICAgICBcb3IgXG51bWJlcmVkc3Vic2Vjenp6eyMzfSUKKyAgICAgIFxvciBcbnVtYmVyZWRzdWJzdWJzZWN6enp7IzN9JQorICAgICAgXGZpCisgICAgXGZpCisgIFxmaQorICBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudAorfQorCislIGFuIGludGVyZmFjZToKK1xkZWZcbnVtaGVhZHtcZ2VuaGVhZCBOfQorXGRlZlxhcHBoZWFke1xnZW5oZWFkIEF9CitcZGVmXHVubm1oZWFke1xnZW5oZWFkIFV9CisKKyUgQGNoYXB0ZXIsIEBhcHBlbmRpeCwgQHVubnVtYmVyZWQuICBJbmNyZW1lbnQgdG9wLWxldmVsIGNvdW50ZXIsIHJlc2V0CislIGFsbCBsb3dlci1sZXZlbCBzZWN0aW9uaW5nIGNvdW50ZXJzIHRvIHplcm8uCislCislIEFsc28gc2V0IFxjaGFwbGV2ZWxwcmVmaXgsIHdoaWNoIHdlIHByZXBlbmQgdG8gQGZsb2F0IHNlcXVlbmNlIG51bWJlcnMKKyUgKGUuZy4sIGZpZ3VyZXMpLCBxLnYuICBCeSBkZWZhdWx0IChiZWZvcmUgYW55IGNoYXB0ZXIpLCB0aGF0IGlzIGVtcHR5LgorXGxldFxjaGFwbGV2ZWxwcmVmaXggPSBcZW1wdHkKKyUKK1xvdXRlclxwYXJzZWFyZ2RlZlxjaGFwdGVye1xudW1oZWFkMHsjMX19ICUgbm9ybWFsbHkgbnVtaGVhZDAgY2FsbHMgY2hhcHRlcnp6egorXGRlZlxjaGFwdGVyenp6IzF7JQorICAlIHNlY3Rpb24gcmVzZXR0aW5nIGlzIFxnbG9iYWwgaW4gY2FzZSB0aGUgY2hhcHRlciBpcyBpbiBhIGdyb3VwLCBzdWNoCisgICUgYXMgYW4gQGluY2x1ZGUgZmlsZS4KKyAgXGdsb2JhbFxzZWNubz0wIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAKKyAgICBcZ2xvYmFsXGFkdmFuY2VcY2hhcG5vIGJ5IDEKKyAgJQorICAlIFVzZWQgZm9yIFxmbG9hdC4KKyAgXGdkZWZcY2hhcGxldmVscHJlZml4e1x0aGVcY2hhcG5vLn0lCisgIFxyZXNldGFsbGZsb2F0bm9zCisgICUKKyAgXG1lc3NhZ2V7XHB1dHdvcmRDaGFwdGVyXHNwYWNlIFx0aGVcY2hhcG5vfSUKKyAgJQorICAlIFdyaXRlIHRoZSBhY3R1YWwgaGVhZGluZy4KKyAgXGNoYXBtYWNyb3sjMX17WW51bWJlcmVkfXtcdGhlXGNoYXBub30lCisgICUKKyAgJSBTbyBAc2VjdGlvbiBhbmQgdGhlIGxpa2UgYXJlIG51bWJlcmVkIHVuZGVybmVhdGggdGhpcyBjaGFwdGVyLgorICBcZ2xvYmFsXGxldFxzZWN0aW9uID0gXG51bWJlcmVkc2VjCisgIFxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnN1YnNlYworfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXh7XGFwcGhlYWQweyMxfX0gJSBub3JtYWxseSBhcHBoZWFkMCBjYWxscyBhcHBlbmRpeHp6egorXGRlZlxhcHBlbmRpeHp6eiMxeyUKKyAgXGdsb2JhbFxzZWNubz0wIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAKKyAgICBcZ2xvYmFsXGFkdmFuY2VcYXBwZW5kaXhubyBieSAxCisgIFxnZGVmXGNoYXBsZXZlbHByZWZpeHtcYXBwZW5kaXhsZXR0ZXIufSUKKyAgXHJlc2V0YWxsZmxvYXRub3MKKyAgJQorICBcZGVmXGFwcGVuZGl4bnVte1xwdXR3b3JkQXBwZW5kaXhcc3BhY2UgXGFwcGVuZGl4bGV0dGVyfSUKKyAgXG1lc3NhZ2V7XGFwcGVuZGl4bnVtfSUKKyAgJQorICBcY2hhcG1hY3JveyMxfXtZYXBwZW5kaXh9e1xhcHBlbmRpeGxldHRlcn0lCisgICUKKyAgXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFxhcHBlbmRpeHNlYworICBcZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXGFwcGVuZGl4c3Vic2VjCisgIFxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzdWJzZWMKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWR7XHVubm1oZWFkMHsjMX19ICUgbm9ybWFsbHkgdW5ubWhlYWQwIGNhbGxzIHVubnVtYmVyZWR6enoKK1xkZWZcdW5udW1iZXJlZHp6eiMxeyUKKyAgXGdsb2JhbFxzZWNubz0wIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAKKyAgICBcZ2xvYmFsXGFkdmFuY2VcdW5udW1iZXJlZG5vIGJ5IDEKKyAgJQorICAlIFNpbmNlIGFuIHVubnVtYmVyZWQgaGFzIG5vIG51bWJlciwgbm8gcHJlZml4IGZvciBmaWd1cmVzLgorICBcZ2xvYmFsXGxldFxjaGFwbGV2ZWxwcmVmaXggPSBcZW1wdHkKKyAgXHJlc2V0YWxsZmxvYXRub3MKKyAgJQorICAlIFRoaXMgdXNlZCB0byBiZSBzaW1wbHkgXG1lc3NhZ2V7IzF9LCBidXQgVGVYIGZ1bGx5IGV4cGFuZHMgdGhlCisgICUgYXJndW1lbnQgdG8gXG1lc3NhZ2UuICBUaGVyZWZvcmUsIGlmICMxIGNvbnRhaW5lZCBALWNvbW1hbmRzLCBUZVgKKyAgJSBleHBhbmRlZCB0aGVtLiAgRm9yIGV4YW1wbGUsIGluIGBAdW5udW1iZXJlZCBUaGUgQGNpdGV7Qm9va30nLCBUZVgKKyAgJSBleHBhbmRlZCBAY2l0ZSAod2hpY2ggdHVybnMgb3V0IHRvIGNhdXNlIGVycm9ycyBiZWNhdXNlIFxjaXRlIGlzIG1lYW50CisgICUgdG8gYmUgZXhlY3V0ZWQsIG5vdCBleHBhbmRlZCkuCisgICUKKyAgJSBBbnl3YXksIHdlIGRvbid0IHdhbnQgdGhlIGZ1bGx5LWV4cGFuZGVkIGRlZmluaXRpb24gb2YgQGNpdGUgdG8gYXBwZWFyCisgICUgYXMgYSByZXN1bHQgb2YgdGhlIFxtZXNzYWdlLCB3ZSBqdXN0IHdhbnQgYEBjaXRlJyBpdHNlbGYuICBXZSB1c2UKKyAgJSBcdGhlPHRva3MgcmVnaXN0ZXI+IHRvIGFjaGlldmUgdGhpczogVGVYIGV4cGFuZHMgXHRoZTx0b2tzPiBvbmx5IG9uY2UsCisgICUgc2ltcGx5IHlpZWxkaW5nIHRoZSBjb250ZW50cyBvZiA8dG9rcyByZWdpc3Rlcj4uICAoV2UgYWxzbyBkbyB0aGlzIGZvcgorICAlIHRoZSB0b2MgZW50cmllcy4pCisgIFx0b2tzMCA9IHsjMX0lCisgIFxtZXNzYWdleyhcdGhlXHRva3MwKX0lCisgICUKKyAgXGNoYXBtYWNyb3sjMX17WW5vdGhpbmd9e1x0aGVcdW5udW1iZXJlZG5vfSUKKyAgJQorICBcZ2xvYmFsXGxldFxzZWN0aW9uID0gXHVubnVtYmVyZWRzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFx1bm51bWJlcmVkc3Vic2VjCisgIFxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcdW5udW1iZXJlZHN1YnN1YnNlYworfQorCislIEBjZW50ZXJjaGFwIGlzIGxpa2UgQHVubnVtYmVyZWQsIGJ1dCB0aGUgaGVhZGluZyBpcyBjZW50ZXJlZC4KK1xvdXRlclxwYXJzZWFyZ2RlZlxjZW50ZXJjaGFweyUKKyAgJSBXZWxsLCB3ZSBjb3VsZCBkbyB0aGUgZm9sbG93aW5nIGluIGEgZ3JvdXAsIGJ1dCB0aGF0IHdvdWxkIGJyZWFrCisgICUgYW4gYXNzdW1wdGlvbiB0aGF0IFxjaGFwbWFjcm8gaXMgY2FsbGVkIGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwuCisgICUgVGh1cyB3ZSBhcmUgc2FmZXIgdGhpcyB3YXk6CQktLWthc2FsLCAyNGZlYjA0CisgIFxsZXRcY2VudGVycGFyYW1ldGVyc21heWJlID0gXGNlbnRlcnBhcmFtZXRlcnMKKyAgXHVubm1oZWFkMHsjMX0lCisgIFxsZXRcY2VudGVycGFyYW1ldGVyc21heWJlID0gXHJlbGF4Cit9CisKKyUgQHRvcCBpcyBsaWtlIEB1bm51bWJlcmVkLgorXGxldFx0b3BcdW5udW1iZXJlZAorCislIFNlY3Rpb25zLgorXG91dGVyXHBhcnNlYXJnZGVmXG51bWJlcmVkc2Vje1xudW1oZWFkMXsjMX19ICUgbm9ybWFsbHkgY2FsbHMgc2Vjenp6CitcZGVmXHNlY3p6eiMxeyUKKyAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzZWN9e1ludW1iZXJlZH17XHRoZVxjaGFwbm8uXHRoZVxzZWNub30lCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlxhcHBlbmRpeHNlY3Rpb257XGFwcGhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBhcHBlbmRpeHNlY3Rpb256enoKK1xkZWZcYXBwZW5kaXhzZWN0aW9uenp6IzF7JQorICBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3NlY317WWFwcGVuZGl4fXtcYXBwZW5kaXhsZXR0ZXIuXHRoZVxzZWNub30lCit9CitcbGV0XGFwcGVuZGl4c2VjXGFwcGVuZGl4c2VjdGlvbgorCitcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHNlY3tcdW5ubWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc2Vjenp6CitcZGVmXHVubnVtYmVyZWRzZWN6enojMXslCisgIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c2VjfXtZbm90aGluZ317XHRoZVx1bm51bWJlcmVkbm8uXHRoZVxzZWNub30lCit9CisKKyUgU3Vic2VjdGlvbnMuCitcb3V0ZXJccGFyc2VhcmdkZWZcbnVtYmVyZWRzdWJzZWN7XG51bWhlYWQyeyMxfX0gJSBub3JtYWxseSBjYWxscyBudW1iZXJlZHN1YnNlY3p6egorXGRlZlxudW1iZXJlZHN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnNlY317WW51bWJlcmVkfXtcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm99JQorfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXhzdWJzZWN7XGFwcGhlYWQyeyMxfX0gJSBub3JtYWxseSBjYWxscyBhcHBlbmRpeHN1YnNlY3p6egorXGRlZlxhcHBlbmRpeHN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnNlY317WWFwcGVuZGl4fSUKKyAgICAgICAgICAgICAgICAge1xhcHBlbmRpeGxldHRlci5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm99JQorfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHN1YnNlY3tcdW5ubWhlYWQyeyMxfX0gJW5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzdWJzZWN6enoKK1xkZWZcdW5udW1iZXJlZHN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnNlY317WW5vdGhpbmd9JQorICAgICAgICAgICAgICAgICB7XHRoZVx1bm51bWJlcmVkbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vfSUKK30KKworJSBTdWJzdWJzZWN0aW9ucy4KK1xvdXRlclxwYXJzZWFyZ2RlZlxudW1iZXJlZHN1YnN1YnNlY3tcbnVtaGVhZDN7IzF9fSAlIG5vcm1hbGx5IG51bWJlcmVkc3Vic3Vic2Vjenp6CitcZGVmXG51bWJlcmVkc3Vic3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic3Vic2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnN1YnNlY317WW51bWJlcmVkfSUKKyAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vfSUKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4c3Vic3Vic2Vje1xhcHBoZWFkM3sjMX19ICUgbm9ybWFsbHkgYXBwZW5kaXhzdWJzdWJzZWN6enoKK1xkZWZcYXBwZW5kaXhzdWJzdWJzZWN6enojMXslCisgIFxnbG9iYWxcYWR2YW5jZVxzdWJzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic3Vic2VjfXtZYXBwZW5kaXh9JQorICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vfSUKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN7XHVubm1oZWFkM3sjMX19ICVub3JtYWxseSB1bm51bWJlcmVkc3Vic3Vic2Vjenp6CitcZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN6enojMXslCisgIFxnbG9iYWxcYWR2YW5jZVxzdWJzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic3Vic2VjfXtZbm90aGluZ30lCisgICAgICAgICAgICAgICAgIHtcdGhlXHVubnVtYmVyZWRuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNub30lCit9CisKKyUgVGhlc2UgbWFjcm9zIGNvbnRyb2wgd2hhdCB0aGUgc2VjdGlvbiBjb21tYW5kcyBkbywgYWNjb3JkaW5nCislIHRvIHdoYXQga2luZCBvZiBjaGFwdGVyIHdlIGFyZSBpbiAob3JkaW5hcnksIGFwcGVuZGl4LCBvciB1bm51bWJlcmVkKS4KKyUgRGVmaW5lIHRoZW0gYnkgZGVmYXVsdCBmb3IgYSBudW1iZXJlZCBjaGFwdGVyLgorXGxldFxzZWN0aW9uID0gXG51bWJlcmVkc2VjCitcbGV0XHN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzZWMKK1xsZXRcc3Vic3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnN1YnNlYworCislIERlZmluZSBAbWFqb3JoZWFkaW5nLCBAaGVhZGluZyBhbmQgQHN1YmhlYWRpbmcKKworJSBOT1RFIG9uIHVzZSBvZiBcdmJveCBmb3IgY2hhcHRlciBoZWFkaW5ncywgc2VjdGlvbiBoZWFkaW5ncywgYW5kIHN1Y2g6CislICAgICAgIDEpIFdlIHVzZSBcdmJveCByYXRoZXIgdGhhbiB0aGUgZWFybGllciBcbGluZSB0byBwZXJtaXQKKyUgICAgICAgICAgb3ZlcmxvbmcgaGVhZGluZ3MgdG8gZm9sZC4KKyUgICAgICAgMikgXGh5cGhlbnBlbmFsdHkgaXMgc2V0IHRvIDEwMDAwIGJlY2F1c2UgaHlwaGVuYXRpb24gaW4gYQorJSAgICAgICAgICBoZWFkaW5nIGlzIG9ibm94aW91czsgdGhpcyBmb3JiaWRzIGl0LgorJSAgICAgICAzKSBMaWtld2lzZSwgaGVhZGluZ3MgbG9vayBiZXN0IGlmIG5vIFxwYXJpbmRlbnQgaXMgdXNlZCwgYW5kCislICAgICAgICAgIGlmIGp1c3RpZmljYXRpb24gaXMgbm90IGF0dGVtcHRlZC4gIEhlbmNlIFxyYWdnZWRyaWdodC4KKworCitcZGVmXG1ham9yaGVhZGluZ3slCisgIHtcYWR2YW5jZVxjaGFwaGVhZGluZ3NraXAgYnkgMTBwdCBcY2hhcGJyZWFrIH0lCisgIFxwYXJzZWFyZ1xjaGFwaGVhZGluZ3p6egorfQorCitcZGVmXGNoYXBoZWFkaW5ne1xjaGFwYnJlYWsgXHBhcnNlYXJnXGNoYXBoZWFkaW5nenp6fQorXGRlZlxjaGFwaGVhZGluZ3p6eiMxeyUKKyAge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKKyAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHRccmFnZ2VkcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX0lCisgIFxiaWdza2lwIFxwYXJccGVuYWx0eSAyMDBccmVsYXgKKyAgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQKK30KKworJSBAaGVhZGluZywgQHN1YmhlYWRpbmcsIEBzdWJzdWJoZWFkaW5nLgorXHBhcnNlYXJnZGVmXGhlYWRpbmd7XHNlY3Rpb25oZWFkaW5neyMxfXtzZWN9e1lvbWl0ZnJvbXRvY317fQorICBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudH0KK1xwYXJzZWFyZ2RlZlxzdWJoZWFkaW5ne1xzZWN0aW9uaGVhZGluZ3sjMX17c3Vic2VjfXtZb21pdGZyb210b2N9e30KKyAgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnR9CitccGFyc2VhcmdkZWZcc3Vic3ViaGVhZGluZ3tcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnN1YnNlY317WW9taXRmcm9tdG9jfXt9CisgIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50fQorCislIFRoZXNlIG1hY3JvcyBnZW5lcmF0ZSBhIGNoYXB0ZXIsIHNlY3Rpb24sIGV0Yy4gaGVhZGluZyBvbmx5CislIChpbmNsdWRpbmcgd2hpdGVzcGFjZSwgbGluZWJyZWFraW5nLCBldGMuIGFyb3VuZCBpdCksCislIGdpdmVuIGFsbCB0aGUgaW5mb3JtYXRpb24gaW4gY29udmVuaWVudCwgcGFyc2VkIGZvcm0uCisKKyUlJSBBcmdzIGFyZSB0aGUgc2tpcCBhbmQgcGVuYWx0eSAodXN1YWxseSBuZWdhdGl2ZSkKK1xkZWZcZG9icmVhayMxIzJ7XHBhclxpZmRpbVxsYXN0c2tpcDwjMVxyZW1vdmVsYXN0c2tpcFxwZW5hbHR5IzJcdnNraXAjMVxmaX0KKworJSUlIERlZmluZSBwbGFpbiBjaGFwdGVyIHN0YXJ0cywgYW5kIHBhZ2Ugb24vb2ZmIHN3aXRjaGluZyBmb3IgaXQKKyUgUGFyYW1ldGVyIGNvbnRyb2xsaW5nIHNraXAgYmVmb3JlIGNoYXB0ZXIgaGVhZGluZ3MgKGlmIG5lZWRlZCkKKworXG5ld3NraXBcY2hhcGhlYWRpbmdza2lwCisKK1xkZWZcY2hhcGJyZWFre1xkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXAgey00MDAwfX0KK1xkZWZcY2hhcHBhZ2Vye1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KK1xkZWZcY2hhcG9kZHBhZ2V7XGNoYXBwYWdlciBcaWZvZGRccGFnZW5vIFxlbHNlIFxoYm94IHRvIDBwdHt9IFxjaGFwcGFnZXJcZml9CisKK1xkZWZcc2V0Y2hhcHRlcm5ld3BhZ2UgIzEge1xjc25hbWUgQ0hBUFBBRyMxXGVuZGNzbmFtZX0KKworXGRlZlxDSEFQUEFHb2ZmeyUKK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKK1xnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBicmVhaworXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcn0KKworXGRlZlxDSEFQUEFHb257JQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgorXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcHBhZ2VyCitcZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcHBhZ2VyCitcZ2xvYmFsXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU3NpbmdsZX19CisKK1xkZWZcQ0hBUFBBR29kZHslCitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKK1xnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBvZGRwYWdlCitcZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcG9kZHBhZ2UKK1xnbG9iYWxcZGVmXEhFQURJTkdTb257XEhFQURJTkdTZG91YmxlfX0KKworXENIQVBQQUdvbgorCislIENoYXB0ZXIgb3BlbmluZy4KKyUKKyUgIzEgaXMgdGhlIHRleHQsICMyIGlzIHRoZSBzZWN0aW9uIHR5cGUgKFludW1iZXJlZCwgWW5vdGhpbmcsCislIFlhcHBlbmRpeCwgWW9taXRmcm9tdG9jKSwgIzMgdGhlIGNoYXB0ZXIgbnVtYmVyLgorJQorJSBUbyB0ZXN0IGFnYWluc3Qgb3VyIGFyZ3VtZW50LgorXGRlZlxZbm90aGluZ2tleXdvcmR7WW5vdGhpbmd9CitcZGVmXFlvbWl0ZnJvbXRvY2tleXdvcmR7WW9taXRmcm9tdG9jfQorXGRlZlxZYXBwZW5kaXhrZXl3b3Jke1lhcHBlbmRpeH0KKyUKK1xkZWZcY2hhcG1hY3JvIzEjMiMzeyUKKyAgXHBjaGFwc2VwbWFjcm8KKyAgeyUKKyAgICBcY2hhcGZvbnRzIFxybQorICAgICUKKyAgICAlIEhhdmUgdG8gZGVmaW5lIFx0aGlzc2VjdGlvbiBiZWZvcmUgY2FsbGluZyBcZG9ub2RlcmVmLCBiZWNhdXNlIHRoZQorICAgICUgeHJlZiBjb2RlIGV2ZW50dWFsbHkgdXNlcyBpdC4gIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBoYXMgdG8gYmUgY2FsbGVkCisgICAgJSBhZnRlciBccGNoYXBzZXBtYWNybywgb3IgdGhlIGhlYWRsaW5lIHdpbGwgY2hhbmdlIHRvbyBzb29uLgorICAgIFxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKKyAgICBcZ2RlZlx0aGlzY2hhcHRlcm5hbWV7IzF9JQorICAgICUKKyAgICAlIE9ubHkgaW5zZXJ0IHRoZSBzZXBhcmF0aW5nIHNwYWNlIGlmIHdlIGhhdmUgYSBjaGFwdGVyL2FwcGVuZGl4CisgICAgJSBudW1iZXIsIGFuZCBkb24ndCBwcmludCB0aGUgdW5udW1iZXJlZCBgYG51bWJlcicnLgorICAgIFxkZWZcdGVtcHR5cGV7IzJ9JQorICAgIFxpZnhcdGVtcHR5cGVcWW5vdGhpbmdrZXl3b3JkCisgICAgICBcc2V0Ym94MCA9IFxoYm94e30lCisgICAgICBcZGVmXHRvY3R5cGV7dW5uY2hhcH0lCisgICAgICBcZ2RlZlx0aGlzY2hhcHRlcnsjMX0lCisgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlvbWl0ZnJvbXRvY2tleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7fSUgY29udGVudHMgbGlrZSB1bm51bWJlcmVkLCBidXQgbm8gdG9jIGVudHJ5CisgICAgICBcZGVmXHRvY3R5cGV7b21pdH0lCisgICAgICBcZ2RlZlx0aGlzY2hhcHRlcnt9JQorICAgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZYXBwZW5kaXhrZXl3b3JkCisgICAgICBcc2V0Ym94MCA9IFxoYm94e1xwdXR3b3JkQXBwZW5kaXh7fSAjM1xlbnNwYWNlfSUKKyAgICAgIFxkZWZcdG9jdHlwZXthcHB9JQorICAgICAgJSBXZSBkb24ndCBzdWJzdGl0dXRlIHRoZSBhY3R1YWwgY2hhcHRlciBuYW1lIGludG8gXHRoaXNjaGFwdGVyCisgICAgICAlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBpdHMgbWFjcm9zIGV2YWx1YXRlZCBub3cuICBBbmQgd2UgZG9uJ3QKKyAgICAgICUgdXNlIFx0aGlzc2VjdGlvbiBiZWNhdXNlIHRoYXQgY2hhbmdlcyB3aXRoIGVhY2ggc2VjdGlvbi4KKyAgICAgICUKKyAgICAgIFx4ZGVmXHRoaXNjaGFwdGVye1xwdXR3b3JkQXBwZW5kaXh7fSBcYXBwZW5kaXhsZXR0ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBcbm9leHBhbmRcdGhpc2NoYXB0ZXJuYW1lfSUKKyAgICBcZWxzZQorICAgICAgXHNldGJveDAgPSBcaGJveHsjM1xlbnNwYWNlfSUKKyAgICAgIFxkZWZcdG9jdHlwZXtudW1jaGFwfSUKKyAgICAgIFx4ZGVmXHRoaXNjaGFwdGVye1xwdXR3b3JkQ2hhcHRlcnt9IFx0aGVcY2hhcG5vOgorICAgICAgICAgICAgICAgICAgICAgICAgXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCisgICAgXGZpXGZpXGZpCisgICAgJQorICAgICUgV3JpdGUgdGhlIHRvYyBlbnRyeSBmb3IgdGhpcyBjaGFwdGVyLiAgTXVzdCBjb21lIGJlZm9yZSB0aGUKKyAgICAlIFxkb25vZGVyZWYsIGJlY2F1c2Ugd2UgaW5jbHVkZSB0aGUgY3VycmVudCBub2RlIG5hbWUgaW4gdGhlIHRvYworICAgICUgZW50cnksIGFuZCBcZG9ub2RlcmVmIHJlc2V0cyBpdCB0byBlbXB0eS4KKyAgICBcd3JpdGV0b2NlbnRyeXtcdG9jdHlwZX17IzF9eyMzfSUKKyAgICAlCisgICAgJSBGb3IgcGRmdGV4LCB3ZSBoYXZlIHRvIHdyaXRlIG91dCB0aGUgbm9kZSBkZWZpbml0aW9uIChha2EsIG1ha2UKKyAgICAlIHRoZSBwZGZkZXN0KSBhZnRlciBhbnkgcGFnZSBicmVhaywgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIHRleHQgaGFzCisgICAgJSBiZWVuIHR5cGVzZXQuICBJZiB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBwZGYgb3V0bGluZSBpcyBhZnRlciB0aGUKKyAgICAlIHRleHQsIHRoZW4ganVtcGluZyBmcm9tIHRoZSBvdXRsaW5lIG1heSB3aW5kIHVwIHdpdGggdGhlIHRleHQgbm90CisgICAgJSBiZWluZyB2aXNpYmxlLCBmb3IgaW5zdGFuY2UgdW5kZXIgaGlnaCBtYWduaWZpY2F0aW9uLgorICAgIFxkb25vZGVyZWZ7IzJ9JQorICAgICUKKyAgICAlIFR5cGVzZXQgdGhlIGFjdHVhbCBoZWFkaW5nLgorICAgIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwIFx0b2xlcmFuY2U9NTAwMCBccGFyaW5kZW50PTBwdCBccmFnZ2VkcmlnaHQKKyAgICAgICAgICBcaGFuZ2luZGVudD1cd2QwIFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUKKyAgICAgICAgICBcdW5oYm94MCAjMVxwYXJ9JQorICB9JQorICBcbm9icmVha1xiaWdza2lwICUgbm8gcGFnZSBicmVhayBhZnRlciBhIGNoYXB0ZXIgdGl0bGUKKyAgXG5vYnJlYWsKK30KKworJSBAY2VudGVyY2hhcCAtLSBjZW50ZXJlZCBhbmQgdW5udW1iZXJlZC4KK1xsZXRcY2VudGVycGFyYW1ldGVyc21heWJlID0gXHJlbGF4CitcZGVmXGNlbnRlcnBhcmFtZXRlcnN7JQorICBcYWR2YW5jZVxyaWdodHNraXAgYnkgM1xyaWdodHNraXAKKyAgXGxlZnRza2lwID0gXHJpZ2h0c2tpcAorICBccGFyZmlsbHNraXAgPSAwcHQKK30KKworCislIEkgZG9uJ3QgdGhpbmsgdGhpcyBjaGFwdGVyIHN0eWxlIGlzIHN1cHBvcnRlZCBhbnkgbW9yZSwgc28gSSdtIG5vdAorJSB1cGRhdGluZyBpdCB3aXRoIHRoZSBuZXcgbm9kZXJlZiBzdHVmZi4gIFdlJ2xsIHNlZS4gIC0ta2FybCwgMTFhdWcwMy4KKyUKK1xkZWZcc2V0Y2hhcHRlcnN0eWxlICMxIHtcY3NuYW1lIENIQVBGIzFcZW5kY3NuYW1lfQorJQorXGRlZlx1bm5jaGZvcGVuICMxeyUKK1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAorICAgICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAorICAgICAgICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhaworfQorXGRlZlxjaGZvcGVuICMxIzJ7XGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzCitcdmJveCB0byAzaW57XHZmaWwgXGhib3ggdG9caHNpemV7XGhmaWwgIzJ9IFxoYm94IHRvXGhzaXple1xoZmlsICMxfSBcdmZpbH19JQorXHBhclxwZW5hbHR5IDUwMDAgJQorfQorXGRlZlxjZW50ZXJjaGZvcGVuICMxeyUKK1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAorICAgICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdAorICAgICAgICAgICAgICAgICAgICAgICBcaGZpbGwge1xybSAjMX1caGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhaworfQorXGRlZlxDSEFQRm9wZW57JQorICBcZ2xvYmFsXGxldFxjaGFwbWFjcm89XGNoZm9wZW4KKyAgXGdsb2JhbFxsZXRcY2VudGVyY2hhcG1hY3JvPVxjZW50ZXJjaGZvcGVufQorCisKKyUgU2VjdGlvbiB0aXRsZXMuICBUaGVzZSBtYWNyb3MgY29tYmluZSB0aGUgc2VjdGlvbiBudW1iZXIgcGFydHMgYW5kCislIGNhbGwgdGhlIGdlbmVyaWMgXHNlY3Rpb25oZWFkaW5nIHRvIGRvIHRoZSBwcmludGluZy4KKyUKK1xuZXdza2lwXHNlY2hlYWRpbmdza2lwCitcZGVmXHNlY2hlYWRpbmdicmVha3tcZG9icmVhayBcc2VjaGVhZGluZ3NraXB7LTEwMDB9fQorCislIFN1YnNlY3Rpb24gdGl0bGVzLgorXG5ld3NraXBcc3Vic2VjaGVhZGluZ3NraXAKK1xkZWZcc3Vic2VjaGVhZGluZ2JyZWFre1xkb2JyZWFrIFxzdWJzZWNoZWFkaW5nc2tpcHstNTAwfX0KKworJSBTdWJzdWJzZWN0aW9uIHRpdGxlcy4KK1xkZWZcc3Vic3Vic2VjaGVhZGluZ3NraXB7XHN1YnNlY2hlYWRpbmdza2lwfQorXGRlZlxzdWJzdWJzZWNoZWFkaW5nYnJlYWt7XHN1YnNlY2hlYWRpbmdicmVha30KKworCislIFByaW50IGFueSBzaXplLCBhbnkgdHlwZSwgc2VjdGlvbiB0aXRsZS4KKyUKKyUgIzEgaXMgdGhlIHRleHQsICMyIGlzIHRoZSBzZWN0aW9uIGxldmVsIChzZWMvc3Vic2VjL3N1YnN1YnNlYyksICMzIGlzCislIHRoZSBzZWN0aW9uIHR5cGUgZm9yIHhyZWZzIChZbnVtYmVyZWQsIFlub3RoaW5nLCBZYXBwZW5kaXgpLCAjNCBpcyB0aGUKKyUgc2VjdGlvbiBudW1iZXIuCislCitcZGVmXHNlY3Rpb25oZWFkaW5nIzEjMiMzIzR7JQorICB7JQorICAgICUgU3dpdGNoIHRvIHRoZSByaWdodCBzZXQgb2YgZm9udHMuCisgICAgXGNzbmFtZSAjMmZvbnRzXGVuZGNzbmFtZSBccm0KKyAgICAlCisgICAgJSBJbnNlcnQgc3BhY2UgYWJvdmUgdGhlIGhlYWRpbmcuCisgICAgXGNzbmFtZSAjMmhlYWRpbmdicmVha1xlbmRjc25hbWUKKyAgICAlCisgICAgJSBPbmx5IGluc2VydCB0aGUgc3BhY2UgYWZ0ZXIgdGhlIG51bWJlciBpZiB3ZSBoYXZlIGEgc2VjdGlvbiBudW1iZXIuCisgICAgXGRlZlxzZWN0aW9ubGV2ZWx7IzJ9JQorICAgIFxkZWZcdGVtcHR5cGV7IzN9JQorICAgICUKKyAgICBcaWZ4XHRlbXB0eXBlXFlub3RoaW5na2V5d29yZAorICAgICAgXHNldGJveDAgPSBcaGJveHt9JQorICAgICAgXGRlZlx0b2N0eXBle3Vubn0lCisgICAgICBcZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCisgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlvbWl0ZnJvbXRvY2tleXdvcmQKKyAgICAgICUgZm9yIEBoZWFkaW5ncyAtLSBubyBzZWN0aW9uIG51bWJlciwgZG9uJ3QgaW5jbHVkZSBpbiB0b2MsCisgICAgICAlIGFuZCBkb24ndCByZWRlZmluZSBcdGhpc3NlY3Rpb24uCisgICAgICBcc2V0Ym94MCA9IFxoYm94e30lCisgICAgICBcZGVmXHRvY3R5cGV7b21pdH0lCisgICAgICBcbGV0XHNlY3Rpb25sZXZlbD1cZW1wdHkKKyAgICBcZWxzZVxpZnhcdGVtcHR5cGVcWWFwcGVuZGl4a2V5d29yZAorICAgICAgXHNldGJveDAgPSBcaGJveHsjNFxlbnNwYWNlfSUKKyAgICAgIFxkZWZcdG9jdHlwZXthcHB9JQorICAgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgIFxlbHNlCisgICAgICBcc2V0Ym94MCA9IFxoYm94eyM0XGVuc3BhY2V9JQorICAgICAgXGRlZlx0b2N0eXBle251bX0lCisgICAgICBcZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCisgICAgXGZpXGZpXGZpCisgICAgJQorICAgICUgV3JpdGUgdGhlIHRvYyBlbnRyeSAoYmVmb3JlIFxkb25vZGVyZWYpLiAgU2VlIGNvbW1lbnRzIGluIFxjaGFwbWFjcm8uCisgICAgXHdyaXRldG9jZW50cnl7XHRvY3R5cGVcc2VjdGlvbmxldmVsfXsjMX17IzR9JQorICAgICUKKyAgICAlIFdyaXRlIHRoZSBub2RlIHJlZmVyZW5jZSAoPSBwZGYgZGVzdGluYXRpb24gZm9yIHBkZnRleCkuCisgICAgJSBBZ2Fpbiwgc2VlIGNvbW1lbnRzIGluIFxjaGFwbWFjcm8uCisgICAgXGRvbm9kZXJlZnsjM30lCisgICAgJQorICAgICUgSW50ZXJsaW5lIGdsdWUgd2lsbCBiZSBpbnNlcnRlZCB3aGVuIHRoZSB2Ym94IGlzIGNvbXBsZXRlZC4KKyAgICAlIFRoYXQgZ2x1ZSB3aWxsIGJlIGEgdmFsaWQgYnJlYWtwb2ludCBmb3IgdGhlIHBhZ2UsIHNpbmNlIGl0J2xsIGJlCisgICAgJSBwcmVjZWRlZCBieSBhIHdoYXRzaXQgKHVzdWFsbHkgZnJvbSB0aGUgXGRvbm9kZXJlZiwgb3IgZnJvbSB0aGUKKyAgICAlIFx3cml0ZXRvY2VudHJ5IGlmIHRoZXJlIHdhcyBubyBub2RlKS4gIFdlIGRvbid0IHdhbnQgdG8gYWxsb3cgdGhhdAorICAgICUgYnJlYWssIHNpbmNlIHRoZW4gdGhlIHdoYXRzaXRzIGNvdWxkIGVuZCB1cCBvbiBwYWdlIG4gd2hpbGUgdGhlCisgICAgJSBzZWN0aW9uIGlzIG9uIHBhZ2UgbisxLCB0aHVzIHRvYy9ldGMuIGFyZSB3cm9uZy4gIERlYmlhbiBidWcgMjc2MDAwLgorICAgIFxub2JyZWFrCisgICAgJQorICAgICUgT3V0cHV0IHRoZSBhY3R1YWwgc2VjdGlvbiBoZWFkaW5nLgorICAgIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwIFx0b2xlcmFuY2U9NTAwMCBccGFyaW5kZW50PTBwdCBccmFnZ2VkcmlnaHQKKyAgICAgICAgICBcaGFuZ2luZGVudD1cd2QwICAlIHplcm8gaWYgbm8gc2VjdGlvbiBudW1iZXIKKyAgICAgICAgICBcdW5oYm94MCAjMX0lCisgIH0lCisgICUgQWRkIGV4dHJhIHNwYWNlIGFmdGVyIHRoZSBoZWFkaW5nIC0tIGhhbGYgb2Ygd2hhdGV2ZXIgY2FtZSBhYm92ZSBpdC4KKyAgJSBEb24ndCBhbGxvdyBzdHJldGNoLCB0aG91Z2guCisgIFxrZXJuIC41IFxjc25hbWUgIzJoZWFkaW5nc2tpcFxlbmRjc25hbWUKKyAgJQorICAlIERvIG5vdCBsZXQgdGhlIGtlcm4gYmUgYSBwb3RlbnRpYWwgYnJlYWtwb2ludCwgYXMgaXQgd291bGQgYmUgaWYgaXQKKyAgJSB3YXMgZm9sbG93ZWQgYnkgZ2x1ZS4KKyAgXG5vYnJlYWsKKyAgJQorICAlIFdlJ2xsIGFsbW9zdCBjZXJ0YWlubHkgc3RhcnQgYSBwYXJhZ3JhcGggbmV4dCwgc28gZG9uJ3QgbGV0IHRoYXQKKyAgJSBnbHVlIGFjY3VtdWxhdGUuICAoTm90IGEgYnJlYWtwb2ludCBiZWNhdXNlIGl0J3MgcHJlY2VkZWQgYnkgYQorICAlIGRpc2NhcmRhYmxlIGl0ZW0uKQorICBcdnNraXAtXHBhcnNraXAKKyAgJSAKKyAgJSBUaGlzIGlzIHB1cmVseSBzbyB0aGUgbGFzdCBpdGVtIG9uIHRoZSBsaXN0IGlzIGEga25vd24gXHBlbmFsdHkgPgorICAlIDEwMDAwLiAgVGhpcyBpcyBzbyBcc3RhcnRkZWZ1biBjYW4gYXZvaWQgYWxsb3dpbmcgYnJlYWtwb2ludHMgYWZ0ZXIKKyAgJSBzZWN0aW9uIGhlYWRpbmdzLiAgT3RoZXJ3aXNlLCBpdCB3b3VsZCBpbnNlcnQgYSB2YWxpZCBicmVha3BvaW50IGJldHdlZW46CisgICUgCisgICUgICBAc2VjdGlvbiBzZWMtd2hhdGV2ZXIKKyAgJSAgIEBkZWZmbiBkZWYtd2hhdGV2ZXIKKyAgXHBlbmFsdHkgMTAwMDEKK30KKworCitcbWVzc2FnZXt0b2MsfQorJSBUYWJsZSBvZiBjb250ZW50cy4KK1xuZXd3cml0ZVx0b2NmaWxlCisKKyUgV3JpdGUgYW4gZW50cnkgdG8gdGhlIHRvYyBmaWxlLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyUgQ2FsbGVkIGZyb20gQGNoYXB0ZXIsIGV0Yy4KKyUKKyUgRXhhbXBsZSB1c2FnZTogXHdyaXRldG9jZW50cnl7c2VjfXtTZWN0aW9uIE5hbWV9e1x0aGVcY2hhcG5vLlx0aGVcc2Vjbm99CislIFdlIGFwcGVuZCB0aGUgY3VycmVudCBub2RlIG5hbWUgKGlmIGFueSkgYW5kIHBhZ2UgbnVtYmVyIGFzIGFkZGl0aW9uYWwKKyUgYXJndW1lbnRzIGZvciB0aGUgXHtjaGFwLHNlYywuLi59ZW50cnkgbWFjcm9zIHdoaWNoIHdpbGwgZXZlbnR1YWxseQorJSByZWFkIHRoaXMuICBUaGUgbm9kZSBuYW1lIGlzIHVzZWQgaW4gdGhlIHBkZiBvdXRsaW5lcyBhcyB0aGUKKyUgZGVzdGluYXRpb24gdG8ganVtcCB0by4KKyUKKyUgV2Ugb3BlbiB0aGUgLnRvYyBmaWxlIGZvciB3cml0aW5nIGhlcmUgaW5zdGVhZCBvZiBhdCBAc2V0ZmlsZW5hbWUgKG9yCislIGFueSBvdGhlciBmaXhlZCB0aW1lKSBzbyB0aGF0IEBjb250ZW50cyBjYW4gYmUgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LgorJSBCdXQgaWYgIzEgaXMgYG9taXQnLCB0aGVuIHdlIGRvbid0IGRvIGFueXRoaW5nLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUKKyUgdGFibGUgb2YgY29udGVudHMgY2hhcHRlciBvcGVuaW5ncyB0aGVtc2VsdmVzLgorJQorXG5ld2lmXGlmdG9jZmlsZW9wZW5lZAorXGRlZlxvbWl0a2V5d29yZHtvbWl0fSUKKyUKK1xkZWZcd3JpdGV0b2NlbnRyeSMxIzIjM3slCisgIFxlZGVmXHdyaXRldG9jdHlwZXsjMX0lCisgIFxpZnhcd3JpdGV0b2N0eXBlXG9taXRrZXl3b3JkIFxlbHNlCisgICAgXGlmdG9jZmlsZW9wZW5lZFxlbHNlCisgICAgICBcaW1tZWRpYXRlXG9wZW5vdXRcdG9jZmlsZSA9IFxqb2JuYW1lLnRvYworICAgICAgXGdsb2JhbFx0b2NmaWxlb3BlbmVkdHJ1ZQorICAgIFxmaQorICAgICUKKyAgICBcaWZsaW5rcworICAgICAge1xhdGR1bW1pZXMKKyAgICAgICBcZWRlZlx0ZW1weyUKKyAgICAgICAgIFx3cml0ZVx0b2NmaWxle0AjMWVudHJ5eyMyfXsjM317XGxhc3Rub2RlfXtcbm9leHBhbmRcZm9saW99fX0lCisgICAgICAgXHRlbXAKKyAgICAgIH0lCisgICAgXGZpCisgIFxmaQorICAlCisgICUgVGVsbCBcc2hpcG91dCB0byBjcmVhdGUgYSBwZGYgZGVzdGluYXRpb24gb24gZWFjaCBwYWdlLCBpZiB3ZSdyZQorICAlIHdyaXRpbmcgcGRmLiAgVGhlc2UgYXJlIHVzZWQgaW4gdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgV2UgY2FuJ3QKKyAgJSBqdXN0IHdyaXRlIG9uZSBvbiBldmVyeSBwYWdlIGJlY2F1c2UgdGhlIHRpdGxlIHBhZ2VzIGFyZSBudW1iZXJlZAorICAlIDEgYW5kIDIgKHRoZSBwYWdlIG51bWJlcnMgYXJlbid0IHByaW50ZWQpLCBhbmQgc28gYXJlIHRoZSBmaXJzdAorICAlIHR3byBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuICBUaHVzLCB3ZSdkIGhhdmUgdHdvIGRlc3RpbmF0aW9ucyBuYW1lZAorICAlIGAxJywgYW5kIHR3byBuYW1lZCBgMicuCisgIFxpZnBkZiBcZ2xvYmFsXHBkZm1ha2VwYWdlZGVzdHRydWUgXGZpCit9CisKKworJSBUaGVzZSBjaGFyYWN0ZXJzIGRvIG5vdCBwcmludCBwcm9wZXJseSBpbiB0aGUgQ29tcHV0ZXIgTW9kZXJuIHJvbWFuCislIGZvbnRzLCBzbyB3ZSBtdXN0IHRha2Ugc3BlY2lhbCBjYXJlLiAgVGhpcyBpcyBtb3JlIG9yIGxlc3MgcmVkdW5kYW50CislIHdpdGggdGhlIFRleGluZm8gaW5wdXQgZm9ybWF0IHNldHVwIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorJSAKK1xkZWZcYWN0aXZlY2F0Y29kZXN7JQorICBcY2F0Y29kZWBcIj1cYWN0aXZlCisgIFxjYXRjb2RlYFwkPVxhY3RpdmUKKyAgXGNhdGNvZGVgXDw9XGFjdGl2ZQorICBcY2F0Y29kZWBcPj1cYWN0aXZlCisgIFxjYXRjb2RlYFxcPVxhY3RpdmUKKyAgXGNhdGNvZGVgXF49XGFjdGl2ZQorICBcY2F0Y29kZWBcXz1cYWN0aXZlCisgIFxjYXRjb2RlYFx8PVxhY3RpdmUKKyAgXGNhdGNvZGVgXH49XGFjdGl2ZQorfQorCisKKyUgUmVhZCB0aGUgdG9jIGZpbGUsIHdoaWNoIGlzIGVzc2VudGlhbGx5IFRleGluZm8gaW5wdXQuCitcZGVmXHJlYWR0b2NmaWxleyUKKyAgXHNldHVwZGF0YWZpbGUKKyAgXGFjdGl2ZWNhdGNvZGVzCisgIFxpbnB1dCBcam9ibmFtZS50b2MKK30KKworXG5ld3NraXBcY29udGVudHNyaWdodG1hcmdpbiBcY29udGVudHNyaWdodG1hcmdpbj0xaW4KK1xuZXdjb3VudFxzYXZlcGFnZW5vCitcbmV3Y291bnRcbGFzdG5lZ2F0aXZlcGFnZW5vIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSAtMQorCislIFByZXBhcmUgdG8gcmVhZCB3aGF0IHdlJ3ZlIHdyaXR0ZW4gdG8gXHRvY2ZpbGUuCislCitcZGVmXHN0YXJ0Y29udGVudHMjMXslCisgICUgSWYgQHNldGNoYXB0ZXJuZXdwYWdlIG9uLCBhbmQgQGhlYWRpbmdzIGRvdWJsZSwgdGhlIGNvbnRlbnRzIHNob3VsZAorICAlIHN0YXJ0IG9uIGFuIG9kZCBwYWdlLCB1bmxpa2UgY2hhcHRlcnMuICBUaHVzLCB3ZSBtYWludGFpbgorICAlIFxjb250ZW50c2FsaWdubWFjcm8gaW4gcGFyYWxsZWwgd2l0aCBccGFnZWFsaWdubWFjcm8uCisgICUgRnJvbTogVG9yYmpvcm4gR3Jhbmx1bmQgPHRlZ2VAbWF0ZW1hdGlrLnN1LnNlPgorICBcY29udGVudHNhbGlnbm1hY3JvCisgIFxpbW1lZGlhdGVcY2xvc2VvdXRcdG9jZmlsZQorICAlCisgICUgRG9uJ3QgbmVlZCB0byBwdXQgYENvbnRlbnRzJyBvciBgU2hvcnQgQ29udGVudHMnIGluIHRoZSBoZWFkbGluZS4KKyAgJSBJdCBpcyBhYnVuZGFudGx5IGNsZWFyIHdoYXQgdGhleSBhcmUuCisgIFxkZWZcdGhpc2NoYXB0ZXJ7fSUKKyAgXGNoYXBtYWNyb3sjMX17WW9taXRmcm9tdG9jfXt9JQorICAlCisgIFxzYXZlcGFnZW5vID0gXHBhZ2VubworICBcYmVnaW5ncm91cCAgICAgICAgICAgICAgICAgICUgU2V0IHVwIHRvIGhhbmRsZSBjb250ZW50cyBmaWxlcyBwcm9wZXJseS4KKyAgICBccmFnZ2VkYm90dG9tICAgICAgICAgICAgICAlIFdvcnJ5IG1vcmUgYWJvdXQgYnJlYWtwb2ludHMgdGhhbiB0aGUgYm90dG9tLgorICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1cY29udGVudHNyaWdodG1hcmdpbiAlIERvbid0IHVzZSB0aGUgZnVsbCBsaW5lIGxlbmd0aC4KKyAgICAlCisgICAgJSBSb21hbiBudW1lcmFscyBmb3IgcGFnZSBudW1iZXJzLgorICAgIFxpZm51bSBccGFnZW5vPjAgXGdsb2JhbFxwYWdlbm8gPSBcbGFzdG5lZ2F0aXZlcGFnZW5vIFxmaQorfQorCisKKyUgTm9ybWFsIChsb25nKSB0b2MuCitcZGVmXGNvbnRlbnRzeyUKKyAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRUT0N9JQorICAgIFxvcGVuaW4gMSBcam9ibmFtZS50b2MKKyAgICBcaWZlb2YgMSBcZWxzZQorICAgICAgXHJlYWR0b2NmaWxlCisgICAgXGZpCisgICAgXHZmaWxsIFxlamVjdAorICAgIFxjb250ZW50c2FsaWdubWFjcm8gJSBpbiBjYXNlIEBzZXRjaGFwdGVybmV3cGFnZSBvZGQgaXMgaW4gZWZmZWN0CisgICAgXGlmZW9mIDEgXGVsc2UKKyAgICAgIFxwZGZtYWtlb3V0bGluZXMKKyAgICBcZmkKKyAgICBcY2xvc2VpbiAxCisgIFxlbmRncm91cAorICBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gXHBhZ2VubworICBcZ2xvYmFsXHBhZ2VubyA9IFxzYXZlcGFnZW5vCit9CisKKyUgQW5kIGp1c3QgdGhlIGNoYXB0ZXJzLgorXGRlZlxzdW1tYXJ5Y29udGVudHN7JQorICBcc3RhcnRjb250ZW50c3tccHV0d29yZFNob3J0VE9DfSUKKyAgICAlCisgICAgXGxldFxudW1jaGFwZW50cnkgPSBcc2hvcnRjaGFwZW50cnkKKyAgICBcbGV0XGFwcGVudHJ5ID0gXHNob3J0Y2hhcGVudHJ5CisgICAgXGxldFx1bm5jaGFwZW50cnkgPSBcc2hvcnR1bm5jaGFwZW50cnkKKyAgICAlIFdlIHdhbnQgYSB0cnVlIHJvbWFuIGhlcmUgZm9yIHRoZSBwYWdlIG51bWJlcnMuCisgICAgXHNlY2ZvbnRzCisgICAgXGxldFxybT1cc2hvcnRjb250cm0gXGxldFxiZj1cc2hvcnRjb250YmYKKyAgICBcbGV0XHNsPVxzaG9ydGNvbnRzbCBcbGV0XHR0PVxzaG9ydGNvbnR0dAorICAgIFxybQorICAgIFxoeXBoZW5wZW5hbHR5ID0gMTAwMDAKKyAgICBcYWR2YW5jZVxiYXNlbGluZXNraXAgYnkgMXB0ICUgT3BlbiBpdCB1cCBhIGxpdHRsZS4KKyAgICBcZGVmXG51bXNlY2VudHJ5IyMxIyMyIyMzIyM0e30KKyAgICBcbGV0XGFwcHNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFx1bm5zZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcbnVtc3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XGFwcHN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFx1bm5zdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcbnVtc3Vic3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XGFwcHN1YnN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFx1bm5zdWJzdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxvcGVuaW4gMSBcam9ibmFtZS50b2MKKyAgICBcaWZlb2YgMSBcZWxzZQorICAgICAgXHJlYWR0b2NmaWxlCisgICAgXGZpCisgICAgXGNsb3NlaW4gMQorICAgIFx2ZmlsbCBcZWplY3QKKyAgICBcY29udGVudHNhbGlnbm1hY3JvICUgaW4gY2FzZSBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkIGlzIGluIGVmZmVjdAorICBcZW5kZ3JvdXAKKyAgXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IFxwYWdlbm8KKyAgXGdsb2JhbFxwYWdlbm8gPSBcc2F2ZXBhZ2VubworfQorXGxldFxzaG9ydGNvbnRlbnRzID0gXHN1bW1hcnljb250ZW50cworCislIFR5cGVzZXQgdGhlIGxhYmVsIGZvciBhIGNoYXB0ZXIgb3IgYXBwZW5kaXggZm9yIHRoZSBzaG9ydCBjb250ZW50cy4KKyUgVGhlIGFyZyBpcywgZS5nLiwgYEEnIGZvciBhbiBhcHBlbmRpeCwgb3IgYDMnIGZvciBhIGNoYXB0ZXIuCislCitcZGVmXHNob3J0Y2hhcGxhYmVsIzF7JQorICAlIFRoaXMgc3BhY2Ugc2hvdWxkIGJlIGVub3VnaCwgc2luY2UgYSBzaW5nbGUgbnVtYmVyIGlzIC41ZW0sIGFuZCB0aGUKKyAgJSB3aWRlc3QgbGV0dGVyIChNKSBpcyAxZW0sIGF0IGxlYXN0IGluIHRoZSBDb21wdXRlciBNb2Rlcm4gZm9udHMuCisgICUgQnV0IHVzZSBcaHNzIGp1c3QgaW4gY2FzZS4KKyAgJSAoVGhpcyBzcGFjZSBkb2Vzbid0IGluY2x1ZGUgdGhlIGV4dHJhIHNwYWNlIHRoYXQgZ2V0cyBhZGRlZCBhZnRlcgorICAlIHRoZSBsYWJlbDsgdGhhdCBnZXRzIHB1dCBpbiBieSBcc2hvcnRjaGFwZW50cnkgYWJvdmUuKQorICAlCisgICUgV2UnZCBsaWtlIHRvIHJpZ2h0LWp1c3RpZnkgY2hhcHRlciBudW1iZXJzLCBidXQgdGhhdCBsb29rcyBzdHJhbmdlCisgICUgd2l0aCBhcHBlbmRpeCBsZXR0ZXJzLiAgQW5kIHJpZ2h0LWp1c3RpZnlpbmcgbnVtYmVycyBhbmQKKyAgJSBsZWZ0LWp1c3RpZnlpbmcgbGV0dGVycyBsb29rcyBzdHJhbmdlIHdoZW4gdGhlcmUgaXMgbGVzcyB0aGFuIDEwCisgICUgY2hhcHRlcnMuICBIYXZlIHRvIHJlYWQgdGhlIHdob2xlIHRvYyBvbmNlIHRvIGtub3cgaG93IG1hbnkgY2hhcHRlcnMKKyAgJSB0aGVyZSBhcmUgYmVmb3JlIGRlY2lkaW5nIC4uLgorICBcaGJveCB0byAxZW17IzFcaHNzfSUKK30KKworJSBUaGVzZSBtYWNyb3MgZ2VuZXJhdGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBjb250ZW50cy4KKyUgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjaGFwdGVyIG9yIHNlY3Rpb24gbmFtZS4KKyUgVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHBhZ2UgbnVtYmVyLgorJSBUaGUgYXJndW1lbnRzIGluIGJldHdlZW4gYXJlIHRoZSBjaGFwdGVyIG51bWJlciwgc2VjdGlvbiBudW1iZXIsIC4uLgorCislIENoYXB0ZXJzLCBpbiB0aGUgbWFpbiBjb250ZW50cy4KK1xkZWZcbnVtY2hhcGVudHJ5IzEjMiMzIzR7XGRvY2hhcGVudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzR9fQorJQorJSBDaGFwdGVycywgaW4gdGhlIHNob3J0IHRvYy4KKyUgU2VlIGNvbW1lbnRzIGluIFxkb2NoYXBlbnRyeSByZSB2Ym94IGFuZCByZWxhdGVkIHNldHRpbmdzLgorXGRlZlxzaG9ydGNoYXBlbnRyeSMxIzIjMyM0eyUKKyAgXHRvY2VudHJ5e1xzaG9ydGNoYXBsYWJlbHsjMn1cbGFiZWxzcGFjZSAjMX17XGRvc2hvcnRwYWdlbm9cYmdyb3VwIzRcZWdyb3VwfSUKK30KKworJSBBcHBlbmRpY2VzLCBpbiB0aGUgbWFpbiBjb250ZW50cy4KKyUgTmVlZCB0aGUgd29yZCBBcHBlbmRpeCwgYW5kIGEgZml4ZWQtc2l6ZSBib3guCislCitcZGVmXGFwcGVuZGl4Ym94IzF7JQorICAlIFdlIHVzZSBNIHNpbmNlIGl0J3MgcHJvYmFibHkgdGhlIHdpZGVzdCBsZXR0ZXIuCisgIFxzZXRib3gwID0gXGhib3h7XHB1dHdvcmRBcHBlbmRpeHt9IE19JQorICBcaGJveCB0byBcd2Qwe1xwdXR3b3JkQXBwZW5kaXh7fSAjMVxoc3N9fQorJQorXGRlZlxhcHBlbnRyeSMxIzIjMyM0e1xkb2NoYXBlbnRyeXtcYXBwZW5kaXhib3h7IzJ9XGxhYmVsc3BhY2UjMX17IzR9fQorCislIFVubnVtYmVyZWQgY2hhcHRlcnMuCitcZGVmXHVubmNoYXBlbnRyeSMxIzIjMyM0e1xkb2NoYXBlbnRyeXsjMX17IzR9fQorXGRlZlxzaG9ydHVubmNoYXBlbnRyeSMxIzIjMyM0e1x0b2NlbnRyeXsjMX17XGRvc2hvcnRwYWdlbm9cYmdyb3VwIzRcZWdyb3VwfX0KKworJSBTZWN0aW9ucy4KK1xkZWZcbnVtc2VjZW50cnkjMSMyIzMjNHtcZG9zZWNlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyM0fX0KK1xsZXRcYXBwc2VjZW50cnk9XG51bXNlY2VudHJ5CitcZGVmXHVubnNlY2VudHJ5IzEjMiMzIzR7XGRvc2VjZW50cnl7IzF9eyM0fX0KKworJSBTdWJzZWN0aW9ucy4KK1xkZWZcbnVtc3Vic2VjZW50cnkjMSMyIzMjNHtcZG9zdWJzZWNlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyM0fX0KK1xsZXRcYXBwc3Vic2VjZW50cnk9XG51bXN1YnNlY2VudHJ5CitcZGVmXHVubnN1YnNlY2VudHJ5IzEjMiMzIzR7XGRvc3Vic2VjZW50cnl7IzF9eyM0fX0KKworJSBBbmQgc3Vic3Vic2VjdGlvbnMuCitcZGVmXG51bXN1YnN1YnNlY2VudHJ5IzEjMiMzIzR7XGRvc3Vic3Vic2VjZW50cnl7IzJcbGFiZWxzcGFjZSMxfXsjNH19CitcbGV0XGFwcHN1YnN1YnNlY2VudHJ5PVxudW1zdWJzdWJzZWNlbnRyeQorXGRlZlx1bm5zdWJzdWJzZWNlbnRyeSMxIzIjMyM0e1xkb3N1YnN1YnNlY2VudHJ5eyMxfXsjNH19CisKKyUgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSB2YXJpb3VzIGxldmVscy4KKyUgU2FtZSBhcyBcZGVmYXVsdHBhcmluZGVudC4KK1xuZXdkaW1lblx0b2NpbmRlbnQgXHRvY2luZGVudCA9IDE1cHQKKworJSBOb3cgZm9yIHRoZSBhY3R1YWwgdHlwZXNldHRpbmcuIEluIGFsbCB0aGVzZSwgIzEgaXMgdGhlIHRleHQgYW5kICMyIGlzIHRoZQorJSBwYWdlIG51bWJlci4KKyUKKyUgSWYgdGhlIHRvYyBoYXMgdG8gYmUgYnJva2VuIG92ZXIgcGFnZXMsIHdlIHdhbnQgaXQgdG8gYmUgYXQgY2hhcHRlcnMKKyUgaWYgYXQgYWxsIHBvc3NpYmxlOyBoZW5jZSB0aGUgXHBlbmFsdHkuCitcZGVmXGRvY2hhcGVudHJ5IzEjMnslCisgICBccGVuYWx0eS0zMDAgXHZza2lwMVxiYXNlbGluZXNraXAgcGx1cy4zM1xiYXNlbGluZXNraXAgbWludXMuMjVcYmFzZWxpbmVza2lwCisgICBcYmVnaW5ncm91cAorICAgICBcY2hhcGVudHJ5Zm9udHMKKyAgICAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKKyAgIFxlbmRncm91cAorICAgXG5vYnJlYWtcdnNraXAgLjI1XGJhc2VsaW5lc2tpcCBwbHVzLjFcYmFzZWxpbmVza2lwCit9CisKK1xkZWZcZG9zZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKKyAgXHNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPVx0b2NpbmRlbnQKKyAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKK1xlbmRncm91cH0KKworXGRlZlxkb3N1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAorICBcc3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9Mlx0b2NpbmRlbnQKKyAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKK1xlbmRncm91cH0KKworXGRlZlxkb3N1YnN1YnNlY2VudHJ5IzEjMntcYmVnaW5ncm91cAorICBcc3Vic3Vic2VjZW50cnlmb250cyBcbGVmdHNraXA9M1x0b2NpbmRlbnQKKyAgXHRvY2VudHJ5eyMxfXtcZG9wYWdlbm9cYmdyb3VwIzJcZWdyb3VwfSUKK1xlbmRncm91cH0KKworJSBXZSB1c2UgdGhlIHNhbWUgXGVudHJ5IG1hY3JvIGFzIGZvciB0aGUgaW5kZXggZW50cmllcy4KK1xsZXRcdG9jZW50cnkgPSBcZW50cnkKKworJSBTcGFjZSBiZXR3ZWVuIGNoYXB0ZXIgKG9yIHdoYXRldmVyKSBudW1iZXIgYW5kIHRoZSB0aXRsZS4KK1xkZWZcbGFiZWxzcGFjZXtcaHNraXAxZW0gXHJlbGF4fQorCitcZGVmXGRvcGFnZW5vIzF7e1xybSAjMX19CitcZGVmXGRvc2hvcnRwYWdlbm8jMXt7XHJtICMxfX0KKworXGRlZlxjaGFwZW50cnlmb250c3tcc2VjZm9udHMgXHJtfQorXGRlZlxzZWNlbnRyeWZvbnRze1x0ZXh0Zm9udHN9CitcZGVmXHN1YnNlY2VudHJ5Zm9udHN7XHRleHRmb250c30KK1xkZWZcc3Vic3Vic2VjZW50cnlmb250c3tcdGV4dGZvbnRzfQorCisKK1xtZXNzYWdle2Vudmlyb25tZW50cyx9CislIEBmb28gLi4uIEBlbmQgZm9vLgorCislIEBwb2ludHt9LCBAcmVzdWx0e30sIEBleHBhbnNpb257fSwgQHByaW50e30sIEBlcXVpdnt9LgorJQorJSBTaW5jZSB0aGVzZSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIGV4YW1wbGVzLCBpdCBzaG91bGQgYmUgYW4gZXZlbiBudW1iZXIgb2YKKyUgXHR0IHdpZHRocy4gRWFjaCBcdHQgY2hhcmFjdGVyIGlzIDFlbiwgc28gdHdvIG1ha2VzIGl0IDFlbS4KKyUKK1xkZWZccG9pbnR7JFxzdGFyJH0KK1xkZWZccmVzdWx0e1xsZWF2ZXZtb2RlXHJhaXNlLjE1ZXhcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9fQorXGRlZlxleHBhbnNpb257XGxlYXZldm1vZGVccmFpc2UuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxtYXBzdG8kXGhmaWx9fQorXGRlZlxwcmludHtcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXGRhc2h2JFxoZmlsfX0KK1xkZWZcZXF1aXZ7XGxlYXZldm1vZGVcbG93ZXIuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxwdGV4ZXF1aXYkXGhmaWx9fQorCislIFRoZSBAZXJyb3J7fSBjb21tYW5kLgorJSBBZGFwdGVkIGZyb20gdGhlIFRlWGJvb2sncyBcYm94aXQuCislCitcbmV3Ym94XGVycm9yYm94CislCit7XHRlbnR0IFxnbG9iYWxcZGltZW4wID0gM2VtfSUgV2lkdGggb2YgdGhlIGJveC4KK1xkaW1lbjIgPSAuNTVwdCAlIFRoaWNrbmVzcyBvZiBydWxlcworJSBUaGUgdGV4dC4gKGByJyBpcyBvcGVuIG9uIHRoZSByaWdodCwgYGUnIHNvbWV3aGF0IGxlc3Mgc28gb24gdGhlIGxlZnQuKQorXHNldGJveDAgPSBcaGJveHtca2Vybi0uNzVwdCBcdGVuc2YgZXJyb3Jca2Vybi0xLjVwdH0KKyUKK1xzZXRib3hcZXJyb3Jib3g9XGhib3ggdG8gXGRpbWVuMHtcaGZpbAorICAgXGhzaXplID0gXGRpbWVuMCBcYWR2YW5jZVxoc2l6ZSBieSAtNS44cHQgJSBTcGFjZSB0byBsZWZ0K3JpZ2h0LgorICAgXGFkdmFuY2VcaHNpemUgYnkgLTJcZGltZW4yICUgUnVsZXMuCisgICBcdmJveHslCisgICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMgorICAgICAgXGhib3h7XHZydWxlIHdpZHRoXGRpbWVuMiBca2VybjNwdCAgICAgICAgICAlIFNwYWNlIHRvIGxlZnQgb2YgdGV4dC4KKyAgICAgICAgIFx2dG9we1xrZXJuMi40cHQgXGJveDAgXGtlcm4yLjRwdH0lIFNwYWNlIGFib3ZlL2JlbG93LgorICAgICAgICAgXGtlcm4zcHRcdnJ1bGUgd2lkdGhcZGltZW4yfSUgU3BhY2UgdG8gcmlnaHQuCisgICAgICBcaHJ1bGUgaGVpZ2h0XGRpbWVuMn0KKyAgICBcaGZpbH0KKyUKK1xkZWZcZXJyb3J7XGxlYXZldm1vZGVcbG93ZXIuN2V4XGNvcHlcZXJyb3Jib3h9CisKKyUgQHRleCAuLi4gQGVuZCB0ZXggICAgZXNjYXBlcyBpbnRvIHJhdyBUZXggdGVtcG9yYXJpbHkuCislIE9uZSBleGNlcHRpb246IEAgaXMgc3RpbGwgYW4gZXNjYXBlIGNoYXJhY3Rlciwgc28gdGhhdCBAZW5kIHRleCB3b3Jrcy4KKyUgQnV0IFxAIG9yIEBAIHdpbGwgZ2V0IGEgcGxhaW4gdGV4IEAgY2hhcmFjdGVyLgorCitcZW52ZGVmXHRleHslCisgIFxjYXRjb2RlIGBcXD0wIFxjYXRjb2RlIGBcez0xIFxjYXRjb2RlIGBcfT0yCisgIFxjYXRjb2RlIGBcJD0zIFxjYXRjb2RlIGBcJj00IFxjYXRjb2RlIGBcIz02CisgIFxjYXRjb2RlIGBcXj03IFxjYXRjb2RlIGBcXz04IFxjYXRjb2RlIGBcfj1cYWN0aXZlIFxsZXR+PVx0aWUKKyAgXGNhdGNvZGUgYFwlPTE0CisgIFxjYXRjb2RlIGBcKz1cb3RoZXIKKyAgXGNhdGNvZGUgYFwiPVxvdGhlcgorICBcY2F0Y29kZSBgXHw9XG90aGVyCisgIFxjYXRjb2RlIGBcPD1cb3RoZXIKKyAgXGNhdGNvZGUgYFw+PVxvdGhlcgorICBcZXNjYXBlY2hhcj1gXFwKKyAgJQorICBcbGV0XGI9XHB0ZXhiCisgIFxsZXRcYnVsbGV0PVxwdGV4YnVsbGV0CisgIFxsZXRcYz1ccHRleGMKKyAgXGxldFwsPVxwdGV4Y29tbWEKKyAgXGxldFwuPVxwdGV4ZG90CisgIFxsZXRcZG90cz1ccHRleGRvdHMKKyAgXGxldFxlcXVpdj1ccHRleGVxdWl2CisgIFxsZXRcIT1ccHRleGV4Y2xhbQorICBcbGV0XGk9XHB0ZXhpCisgIFxsZXRcaW5kZW50PVxwdGV4aW5kZW50CisgIFxsZXRcbm9pbmRlbnQ9XHB0ZXhub2luZGVudAorICBcbGV0XHs9XHB0ZXhsYnJhY2UKKyAgXGxldFwrPVx0YWJhbGlnbgorICBcbGV0XH09XHB0ZXhyYnJhY2UKKyAgXGxldFwvPVxwdGV4c2xhc2gKKyAgXGxldFwqPVxwdGV4c3RhcgorICBcbGV0XHQ9XHB0ZXh0CisgIFxsZXRcZnJlbmNoc3BhY2luZz1ccGxhaW5mcmVuY2hzcGFjaW5nCisgICUKKyAgXGRlZlxlbmRsZG90c3tcbWF0aGlubmVye1xsZG90c1xsZG90c1xsZG90c1xsZG90c319JQorICBcZGVmXGVuZGRvdHN7XHJlbGF4XGlmbW1vZGVcZW5kbGRvdHNcZWxzZSRcbWF0aHN1cnJvdW5kPTBwdCBcZW5kbGRvdHNcLCRcZml9JQorICBcZGVmXEB7QH0lCit9CislIFRoZXJlIGlzIG5vIG5lZWQgdG8gZGVmaW5lIFxFdGV4LgorCislIERlZmluZSBAbGlzcCAuLi4gQGVuZCBsaXNwLgorJSBAbGlzcCBlbnZpcm9ubWVudCBmb3JtcyBhIGdyb3VwIHNvIGl0IGNhbiByZWJpbmQgdGhpbmdzLAorJSBpbmNsdWRpbmcgdGhlIGRlZmluaXRpb24gb2YgQGVuZCBsaXNwICh3aGljaCBub3JtYWxseSBpcyBlcnJvbmVvdXMpLgorCislIEFtb3VudCB0byBuYXJyb3cgdGhlIG1hcmdpbnMgYnkgZm9yIEBsaXNwLgorXG5ld3NraXBcbGlzcG5hcnJvd2luZyBcbGlzcG5hcnJvd2luZz0wLjRpbgorCislIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gdGhhdCBeXk0gZ2V0cyBpbnNpZGUgQGxpc3AsIEBleGFtcGxlLCBhbmQgb3RoZXIKKyUgc3VjaCBlbnZpcm9ubWVudHMuICBcbnVsbCBpcyBiZXR0ZXIgdGhhbiBhIHNwYWNlLCBzaW5jZSBpdCBkb2Vzbid0CislIGhhdmUgYW55IHdpZHRoLgorXGRlZlxsaXNwcGFye1xudWxsXGVuZGdyYWZ9CisKKyUgVGhpcyBzcGFjZSBpcyBhbHdheXMgcHJlc2VudCBhYm92ZSBhbmQgYmVsb3cgZW52aXJvbm1lbnRzLgorXG5ld3NraXBcZW52c2tpcGFtb3VudCBcZW52c2tpcGFtb3VudCA9IDBwdAorCislIE1ha2Ugc3BhY2luZyBhbmQgYmVsb3cgZW52aXJvbm1lbnQgc3ltbWV0cmljYWwuICBXZSB1c2UgXHBhcnNraXAgaGVyZQorJSB0byBoZWxwIGluIGRvaW5nIHRoYXQsIHNpbmNlIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzIFxwYXJza2lwCislIGlzIHJlc2V0IHRvIHplcm87IHRodXMgdGhlIFxhZnRlcmVudmJyZWFrIGluc2VydHMgbm8gc3BhY2UgLS0gYnV0IHRoZQorJSBzdGFydCBvZiB0aGUgbmV4dCBwYXJhZ3JhcGggd2lsbCBpbnNlcnQgXHBhcnNraXAuCislCitcZGVmXGFib3ZlZW52YnJlYWt7eyUKKyAgJSA9MTAwMDAgaW5zdGVhZCBvZiA8MTAwMDAgYmVjYXVzZSBvZiBhIHNwZWNpYWwgY2FzZSBpbiBcaXRlbXp6eiBhbmQKKyAgJSBcc2VjdGlvbmhlYWRpbmcsIHEudi4KKyAgXGlmbnVtIFxsYXN0cGVuYWx0eT0xMDAwMCBcZWxzZQorICAgIFxhZHZhbmNlXGVudnNraXBhbW91bnQgYnkgXHBhcnNraXAKKyAgICBcZW5kZ3JhZgorICAgIFxpZmRpbVxsYXN0c2tpcDxcZW52c2tpcGFtb3VudAorICAgICAgXHJlbW92ZWxhc3Rza2lwCisgICAgICAlIGl0J3Mgbm90IGEgZ29vZCBwbGFjZSB0byBicmVhayBpZiB0aGUgbGFzdCBwZW5hbHR5IHdhcyBcbm9icmVhaworICAgICAgJSBvciBiZXR0ZXIgLi4uCisgICAgICBcaWZudW1cbGFzdHBlbmFsdHk8MTAwMDAgXHBlbmFsdHktNTAgXGZpCisgICAgICBcdnNraXBcZW52c2tpcGFtb3VudAorICAgIFxmaQorICBcZmkKK319CisKK1xsZXRcYWZ0ZXJlbnZicmVhayA9IFxhYm92ZWVudmJyZWFrCisKKyUgXG5vbmFycm93aW5nIGlzIGEgZmxhZy4gIElmICJzZXQiLCBAbGlzcCBldGMgZG9uJ3QgbmFycm93IG1hcmdpbnM7IGl0IHdpbGwKKyUgYWxzbyBjbGVhciBpdCwgc28gdGhhdCBpdHMgZW1iZWRkZWQgZW52aXJvbm1lbnRzIGRvIHRoZSBuYXJyb3dpbmcgYWdhaW4uCitcbGV0XG5vbmFycm93aW5nPVxyZWxheAorCislIEBjYXJ0b3VjaGUgLi4uIEBlbmQgY2FydG91Y2hlOiBkcmF3IHJlY3RhbmdsZSB3L3JvdW5kZWQgY29ybmVycyBhcm91bmQKKyUgZW52aXJvbm1lbnQgY29udGVudHMuCitcZm9udFxjaXJjbGU9bGNpcmNsZTEwCitcbmV3ZGltZW5cY2lyY3RoaWNrCitcbmV3ZGltZW5cY2FydG91dGVyXG5ld2RpbWVuXGNhcnRpbm5lcgorXG5ld3NraXBcbm9ybWJza2lwXG5ld3NraXBcbm9ybXBza2lwXG5ld3NraXBcbm9ybWxza2lwCitcY2lyY3RoaWNrPVxmb250ZGltZW44XGNpcmNsZQorJQorXGRlZlxjdGx7e1xjaXJjbGVcY2hhcicwMTNcaHNraXAgLTZwdH19JSA2cHQgZnJvbSBwbCBmaWxlOiAxLzJjaGFyd2lkdGgKK1xkZWZcY3Rye3tcaHNraXAgNnB0XGNpcmNsZVxjaGFyJzAxMH19CitcZGVmXGNibHt7XGNpcmNsZVxjaGFyJzAxMlxoc2tpcCAtNnB0fX0KK1xkZWZcY2Jye3tcaHNraXAgNnB0XGNpcmNsZVxjaGFyJzAxMX19CitcZGVmXGNhcnR0b3B7XGhib3ggdG8gXGNhcnRvdXRlcntcaHNraXBcbHNraXAKKyAgICAgICAgXGN0bFxsZWFkZXJzXGhydWxlIGhlaWdodFxjaXJjdGhpY2tcaGZpbFxjdHIKKyAgICAgICAgXGhza2lwXHJza2lwfX0KK1xkZWZcY2FydGJvdHtcaGJveCB0byBcY2FydG91dGVye1xoc2tpcFxsc2tpcAorICAgICAgICBcY2JsXGxlYWRlcnNcaHJ1bGUgaGVpZ2h0XGNpcmN0aGlja1xoZmlsXGNicgorICAgICAgICBcaHNraXBccnNraXB9fQorJQorXG5ld3NraXBcbHNraXBcbmV3c2tpcFxyc2tpcAorCitcZW52ZGVmXGNhcnRvdWNoZXslCisgIFxpZmhtb2RlXHBhclxmaSAgJSBjYW4ndCBiZSBpbiB0aGUgbWlkc3Qgb2YgYSBwYXJhZ3JhcGguCisgIFxzdGFydHNhdmluZ2luc2VydHMKKyAgXGxza2lwPVxsZWZ0c2tpcCBccnNraXA9XHJpZ2h0c2tpcAorICBcbGVmdHNraXA9MHB0XHJpZ2h0c2tpcD0wcHQgJSB3ZSB3YW50IHRoZXNlICpvdXRzaWRlKi4KKyAgXGNhcnRpbm5lcj1caHNpemUgXGFkdmFuY2VcY2FydGlubmVyIGJ5LVxsc2tpcAorICBcYWR2YW5jZVxjYXJ0aW5uZXIgYnktXHJza2lwCisgIFxjYXJ0b3V0ZXI9XGhzaXplCisgIFxhZHZhbmNlXGNhcnRvdXRlciBieSAxOC40cHQJJSBhbGxvdyBmb3IgM3B0IGtlcm5zIG9uIGVpdGhlcgorCQkJCSUgc2lkZSwgYW5kIGZvciA2cHQgd2FzdGUgZnJvbQorCQkJCSUgZWFjaCBjb3JuZXIgY2hhciwgYW5kIHJ1bGUgdGhpY2tuZXNzCisgIFxub3JtYnNraXA9XGJhc2VsaW5lc2tpcCBcbm9ybXBza2lwPVxwYXJza2lwIFxub3JtbHNraXA9XGxpbmVza2lwCisgICUgRmxhZyB0byB0ZWxsIEBsaXNwLCBldGMuLCBub3QgdG8gbmFycm93IG1hcmdpbi4KKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFx2Ym94XGJncm91cAorICAgICAgXGJhc2VsaW5lc2tpcD0wcHRccGFyc2tpcD0wcHRcbGluZXNraXA9MHB0CisgICAgICBcY2FydHRvcAorICAgICAgXGhib3hcYmdyb3VwCisJICBcaHNraXBcbHNraXAKKwkgIFx2cnVsZVxrZXJuM3B0CisJICBcdmJveFxiZ3JvdXAKKwkgICAgICBca2VybjNwdAorCSAgICAgIFxoc2l6ZT1cY2FydGlubmVyCisJICAgICAgXGJhc2VsaW5lc2tpcD1cbm9ybWJza2lwCisJICAgICAgXGxpbmVza2lwPVxub3JtbHNraXAKKwkgICAgICBccGFyc2tpcD1cbm9ybXBza2lwCisJICAgICAgXHZza2lwIC1ccGFyc2tpcAorCSAgICAgIFxjb21tZW50ICUgRm9yIGV4cGxhbmF0aW9uLCBzZWUgdGhlIGVuZCBvZiBcZGVmXGdyb3VwLgorfQorXGRlZlxFY2FydG91Y2hleyUKKyAgICAgICAgICAgICAgXGlmaG1vZGVccGFyXGZpCisJICAgICAgXGtlcm4zcHQKKwkgIFxlZ3JvdXAKKwkgIFxrZXJuM3B0XHZydWxlCisJICBcaHNraXBccnNraXAKKyAgICAgIFxlZ3JvdXAKKyAgICAgIFxjYXJ0Ym90CisgIFxlZ3JvdXAKKyAgXGNoZWNraW5zZXJ0cworfQorCisKKyUgVGhpcyBtYWNybyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbGwgdGhlIEBleGFtcGxlIHZhcmlhbnRzLAorJSBpbnNpZGUgYSBncm91cC4KK1xkZWZcbm9uZmlsbHN0YXJ0eyUKKyAgXGFib3ZlZW52YnJlYWsKKyAgXGhmdXp6ID0gMTJwdCAlIERvbid0IGJlIGZ1c3N5CisgIFxzZXBzcGFjZXMgJSBNYWtlIHNwYWNlcyBiZSB3b3JkLXNlcGFyYXRvcnMgcmF0aGVyIHRoYW4gc3BhY2UgdG9rZW5zLgorICBcbGV0XHBhciA9IFxsaXNwcGFyICUgZG9uJ3QgaWdub3JlIGJsYW5rIGxpbmVzCisgIFxvYmV5bGluZXMgJSBlYWNoIGxpbmUgb2YgaW5wdXQgaXMgYSBsaW5lIG9mIG91dHB1dAorICBccGFyc2tpcCA9IDBwdAorICBccGFyaW5kZW50ID0gMHB0CisgIFxlbWVyZ2VuY3lzdHJldGNoID0gMHB0ICUgZG9uJ3QgdHJ5IHRvIGF2b2lkIG92ZXJmdWxsIGJveGVzCisgIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKKyAgICBcYWR2YW5jZSBcbGVmdHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKKyAgICBcZXhkZW50YW1vdW50PVxsaXNwbmFycm93aW5nCisgIFxlbHNlCisgICAgXGxldFxub25hcnJvd2luZyA9IFxyZWxheAorICBcZmkKKyAgXGxldFxleGRlbnQ9XG5vZmlsbGV4ZGVudAorfQorCislIElmIHlvdSB3YW50IGFsbCBleGFtcGxlcyBldGMuIHNtYWxsOiBAc2V0IGRpc3BlbnZzaXplIHNtYWxsLgorJSBJZiB5b3Ugd2FudCBldmVuIHNtYWxsIGV4YW1wbGVzIHRoZSBmdWxsIHNpemU6IEBzZXQgZGlzcGVudnNpemUgbm9zbWFsbC4KKyUgVGhpcyBhZmZlY3RzIHRoZSBmb2xsb3dpbmcgZGlzcGxheWVkIGVudmlyb25tZW50czoKKyUgICAgQGV4YW1wbGUsIEBkaXNwbGF5LCBAZm9ybWF0LCBAbGlzcAorJQorXGRlZlxzbWFsbHdvcmR7c21hbGx9CitcZGVmXG5vc21hbGx3b3Jke25vc21hbGx9CitcbGV0XFNFVGRpc3BlbnZzaXplXHJlbGF4CitcZGVmXHNldG5vcm1hbGRpc3BlbnZ7JQorICBcaWZ4XFNFVGRpc3BlbnZzaXplXHNtYWxsd29yZAorICAgIFxzbWFsbGV4YW1wbGVmb250cyBccm0KKyAgXGZpCit9CitcZGVmXHNldHNtYWxsZGlzcGVudnslCisgIFxpZnhcU0VUZGlzcGVudnNpemVcbm9zbWFsbHdvcmQKKyAgXGVsc2UKKyAgICBcc21hbGxleGFtcGxlZm9udHMgXHJtCisgIFxmaQorfQorCislIFdlIG9mdGVuIGRlZmluZSB0d28gZW52aXJvbm1lbnRzLCBAZm9vIGFuZCBAc21hbGxmb28uCislIExldCdzIGRvIGl0IGJ5IG9uZSBjb21tYW5kOgorXGRlZlxtYWtlZGlzcGVudiAjMSMyeworICBcZXhwYW5kYWZ0ZXJcZW52ZGVmXGNzbmFtZSMxXGVuZGNzbmFtZSB7XHNldG5vcm1hbGRpc3BlbnYgIzJ9CisgIFxleHBhbmRhZnRlclxlbnZkZWZcY3NuYW1lIHNtYWxsIzFcZW5kY3NuYW1lIHtcc2V0c21hbGxkaXNwZW52ICMyfQorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBFIzFcZW5kY3NuYW1lIFxhZnRlcmVudmJyZWFrCisgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIEVzbWFsbCMxXGVuZGNzbmFtZSBcYWZ0ZXJlbnZicmVhaworfQorCislIERlZmluZSB0d28gc3lub255bXM6CitcZGVmXG1ha2V0d29kaXNwZW52cyAjMSMyIzN7CisgIFxtYWtlZGlzcGVudnsjMX17IzN9CisgIFxtYWtlZGlzcGVudnsjMn17IzN9Cit9CisKKyUgQGxpc3A6IGluZGVudGVkLCBuYXJyb3dlZCwgdHlwZXdyaXRlciBmb250OyBAZXhhbXBsZTogc2FtZSBhcyBAbGlzcC4KKyUKKyUgQHNtYWxsZXhhbXBsZSBhbmQgQHNtYWxsbGlzcDogdXNlIHNtYWxsZXIgZm9udHMuCislIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgUGF2ZWxAeGVyb3guCislCitcbWFrZXR3b2Rpc3BlbnZzIHtsaXNwfXtleGFtcGxlfXslCisgIFxub25maWxsc3RhcnQKKyAgXHR0CisgIFxsZXRca2JkZm9udCA9IFxrYmRleGFtcGxlZm9udCAlIEFsbG93IEBrYmQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwuCisgIFxnb2JibGUgICAgICAgJSBlYXQgcmV0dXJuCit9CisKKyUgQGRpc3BsYXkvQHNtYWxsZGlzcGxheTogc2FtZSBhcyBAbGlzcCBleGNlcHQga2VlcCBjdXJyZW50IGZvbnQuCislCitcbWFrZWRpc3BlbnYge2Rpc3BsYXl9eyUKKyAgXG5vbmZpbGxzdGFydAorICBcZ29iYmxlCit9CisKKyUgQGZvcm1hdC9Ac21hbGxmb3JtYXQ6IHNhbWUgYXMgQGRpc3BsYXkgZXhjZXB0IGRvbid0IG5hcnJvdyBtYXJnaW5zLgorJQorXG1ha2VkaXNwZW52e2Zvcm1hdH17JQorICBcbGV0XG5vbmFycm93aW5nID0gdCUKKyAgXG5vbmZpbGxzdGFydAorICBcZ29iYmxlCit9CisKKyUgQGZsdXNobGVmdDogc2FtZSBhcyBAZm9ybWF0LCBidXQgZG9lc24ndCBvYmV5IFxTRVRkaXNwZW52c2l6ZS4KK1xlbnZkZWZcZmx1c2hsZWZ0eyUKKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFxub25maWxsc3RhcnQKKyAgXGdvYmJsZQorfQorXGxldFxFZmx1c2hsZWZ0ID0gXGFmdGVyZW52YnJlYWsKKworJSBAZmx1c2hyaWdodC4KKyUKK1xlbnZkZWZcZmx1c2hyaWdodHslCisgIFxsZXRcbm9uYXJyb3dpbmcgPSB0JQorICBcbm9uZmlsbHN0YXJ0CisgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IDBwdCBwbHVzIDFmaWxsCisgIFxnb2JibGUKK30KK1xsZXRcRWZsdXNocmlnaHQgPSBcYWZ0ZXJlbnZicmVhaworCisKKyUgQHF1b3RhdGlvbiBkb2VzIG5vcm1hbCBsaW5lYnJlYWtpbmcgKGhlbmNlIHdlIGNhbid0IHVzZSBcbm9uZmlsbHN0YXJ0KQorJSBhbmQgbmFycm93cyB0aGUgbWFyZ2lucy4gIFdlIGtlZXAgXHBhcnNraXAgbm9uemVybyBpbiBnZW5lcmFsLCBzaW5jZQorJSB3ZSdyZSBkb2luZyBub3JtYWwgZmlsbGluZy4gIFNvLCB3aGVuIHVzaW5nIFxhYm92ZWVudmJyZWFrIGFuZAorJSBcYWZ0ZXJlbnZicmVhaywgdGVtcG9yYXJpbHkgbWFrZSBccGFyc2tpcCAwLgorJQorXGVudmRlZlxxdW90YXRpb257JQorICB7XHBhcnNraXA9MHB0IFxhYm92ZWVudmJyZWFrfSUgYmVjYXVzZSBcYWJvdmVlbnZicmVhayBpbnNlcnRzIFxwYXJza2lwCisgIFxwYXJpbmRlbnQ9MHB0CisgICUKKyAgJSBAY2FydG91Y2hlIGRlZmluZXMgXG5vbmFycm93aW5nIHRvIGluaGliaXQgbmFycm93aW5nIGF0IG5leHQgbGV2ZWwgZG93bi4KKyAgXGlmeFxub25hcnJvd2luZ1xyZWxheAorICAgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCisgICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5IFxsaXNwbmFycm93aW5nCisgICAgXGV4ZGVudGFtb3VudCA9IFxsaXNwbmFycm93aW5nCisgIFxlbHNlCisgICAgXGxldFxub25hcnJvd2luZyA9IFxyZWxheAorICBcZmkKKyAgXHBhcnNlYXJnXHF1b3RhdGlvbmxhYmVsCit9CisKKyUgV2UgaGF2ZSByZXRhaW5lZCBhIG5vbnplcm8gcGFyc2tpcCBmb3IgdGhlIGVudmlyb25tZW50LCBzaW5jZSB3ZSdyZQorJSBkb2luZyBub3JtYWwgZmlsbGluZy4KKyUKK1xkZWZcRXF1b3RhdGlvbnslCisgIFxwYXIKKyAgXGlmeFxxdW90YXRpb25hdXRob3JcdW5kZWZpbmVkXGVsc2UKKyAgICAlIGluZGVudCBhIGJpdC4KKyAgICBcbGVmdGxpbmV7XGtlcm4gMlxsZWZ0c2tpcCBcc2wgLS0tXHF1b3RhdGlvbmF1dGhvcn0lCisgIFxmaQorICB7XHBhcnNraXA9MHB0IFxhZnRlcmVudmJyZWFrfSUKK30KKworJSBJZiB3ZSdyZSBnaXZlbiBhbiBhcmd1bWVudCwgdHlwZXNldCBpdCBpbiBib2xkIHdpdGggYSBjb2xvbiBhZnRlci4KK1xkZWZccXVvdGF0aW9ubGFiZWwjMXslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxlbXB0eSBcZWxzZQorICAgIHtcYmYgIzE6IH0lCisgIFxmaQorfQorCisKKyUgTGFUZVgtbGlrZSBAdmVyYmF0aW0uLi5AZW5kIHZlcmJhdGltIGFuZCBAdmVyYns8Y2hhcj4uLi48Y2hhcj59CislIElmIHdlIHdhbnQgdG8gYWxsb3cgYW55IDxjaGFyPiBhcyBkZWxpbWl0ZXIsCislIHdlIG5lZWQgdGhlIGN1cmx5IGJyYWNlcyBzbyB0aGF0IG1ha2VpbmZvIHNlZXMgdGhlIEB2ZXJiIGNvbW1hbmQsIGVnOgorJSBgQHZlcmJ4Li4ueCcgd291bGQgbG9vayBsaWtlIHRoZSAnQHZlcmJ4JyBjb21tYW5kLiAgLS1qYW5uZWtlQGdudS5vcmcKKyUKKyUgW0tudXRoXTogRG9uYWxkIEVydmluIEtudXRoLCAxOTk2LiAgVGhlIFRlWGJvb2suCislCislIFtLbnV0aF0gcC4zNDQ7IG9ubHkgd2UgbmVlZCB0byBkbyB0aGUgb3RoZXIgY2hhcmFjdGVycyBUZXhpbmZvIHNldHMKKyUgYWN0aXZlIHRvby4gIE90aGVyd2lzZSwgdGhleSBnZXQgbG9zdCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9uIGEKKyUgdmVyYmF0aW0gbGluZS4KK1xkZWZcZG9zcGVjaWFsc3slCisgIFxkb1wgXGRvXFxcZG9ce1xkb1x9XGRvXCRcZG9cJiUKKyAgXGRvXCNcZG9cXlxkb1xeXktcZG9cX1xkb1xeXkFcZG9cJVxkb1x+JQorICBcZG9cPFxkb1w+XGRvXHxcZG9cQFxkbytcZG9cIiUKK30KKyUKKyUgW0tudXRoXSBwLiAzODAKK1xkZWZcdW5jYXRjb2Rlc3BlY2lhbHN7JQorICBcZGVmXGRvIyMxe1xjYXRjb2RlYCMjMT1cb3RoZXJ9XGRvc3BlY2lhbHN9CislCislIFtLbnV0aF0gcHAuIDM4MCwzODEsMzkxCislIERpc2FibGUgU3BhbmlzaCBsaWdhdHVyZXMgP2AgYW5kICFgIG9mIFx0dCBmb250CitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcYD1cYWN0aXZlXGdkZWZge1xyZWxheFxscX0KK1xlbmRncm91cAorJQorJSBTZXR1cCBmb3IgdGhlIEB2ZXJiIGNvbW1hbmQuCislCislIEVpZ2h0IHNwYWNlcyBmb3IgYSB0YWIKK1xiZWdpbmdyb3VwCisgIFxjYXRjb2RlYFxeXkk9XGFjdGl2ZQorICBcZ2RlZlx0YWJlaWdodHNwYWNlc3tcY2F0Y29kZWBcXl5JPVxhY3RpdmVcZGVmXl5Je1wgXCBcIFwgXCBcIFwgXCB9fQorXGVuZGdyb3VwCislCitcZGVmXHNldHVwdmVyYnslCisgIFx0dCAgJSBlYXNpZXN0IChhbmQgY29udmVudGlvbmFsbHkgdXNlZCkgZm9udCBmb3IgdmVyYmF0aW0KKyAgXGRlZlxwYXJ7XGxlYXZldm1vZGVcZW5kZ3JhZn0lCisgIFxjYXRjb2RlYFxgPVxhY3RpdmUKKyAgXHRhYmVpZ2h0c3BhY2VzCisgICUgUmVzcGVjdCBsaW5lIGJyZWFrcywKKyAgJSBwcmludCBzcGVjaWFsIHN5bWJvbHMgYXMgdGhlbXNlbHZlcywgYW5kCisgICUgbWFrZSBlYWNoIHNwYWNlIGNvdW50CisgICUgbXVzdCBkbyBpbiB0aGlzIG9yZGVyOgorICBcb2JleWxpbmVzIFx1bmNhdGNvZGVzcGVjaWFscyBcc2Vwc3BhY2VzCit9CisKKyUgU2V0dXAgZm9yIHRoZSBAdmVyYmF0aW0gZW52aXJvbm1lbnQKKyUKKyUgUmVhbCB0YWIgZXhwYW5zaW9uCitcbmV3ZGltZW5cdGFidyBcc2V0Ym94MD1caGJveHtcdHRcc3BhY2V9IFx0YWJ3PThcd2QwICUgdGFiIGFtb3VudAorJQorXGRlZlxzdGFydHRhYmJveHtcc2V0Ym94MD1caGJveFxiZ3JvdXB9CitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcXl5JPVxhY3RpdmUKKyAgXGdkZWZcdGFiZXhwYW5keyUKKyAgICBcY2F0Y29kZWBcXl5JPVxhY3RpdmUKKyAgICBcZGVmXl5Je1xsZWF2ZXZtb2RlXGVncm91cAorICAgICAgXGRpbWVuMD1cd2QwICUgdGhlIHdpZHRoIHNvIGZhciwgb3Igc2luY2UgdGhlIHByZXZpb3VzIHRhYgorICAgICAgXGRpdmlkZVxkaW1lbjAgYnlcdGFidworICAgICAgXG11bHRpcGx5XGRpbWVuMCBieVx0YWJ3ICUgY29tcHV0ZSBwcmV2aW91cyBtdWx0aXBsZSBvZiBcdGFidworICAgICAgXGFkdmFuY2VcZGltZW4wIGJ5XHRhYncgICUgYWR2YW5jZSB0byBuZXh0IG11bHRpcGxlIG9mIFx0YWJ3CisgICAgICBcd2QwPVxkaW1lbjAgXGJveDAgXHN0YXJ0dGFiYm94CisgICAgfSUKKyAgfQorXGVuZGdyb3VwCitcZGVmXHNldHVwdmVyYmF0aW17JQorICBcbGV0XG5vbmFycm93aW5nID0gdCUKKyAgXG5vbmZpbGxzdGFydAorICAlIEVhc2llc3QgKGFuZCBjb252ZW50aW9uYWxseSB1c2VkKSBmb250IGZvciB2ZXJiYXRpbQorICBcdHQKKyAgXGRlZlxwYXJ7XGxlYXZldm1vZGVcZWdyb3VwXGJveDBcZW5kZ3JhZn0lCisgIFxjYXRjb2RlYFxgPVxhY3RpdmUKKyAgXHRhYmV4cGFuZAorICAlIFJlc3BlY3QgbGluZSBicmVha3MsCisgICUgcHJpbnQgc3BlY2lhbCBzeW1ib2xzIGFzIHRoZW1zZWx2ZXMsIGFuZAorICAlIG1ha2UgZWFjaCBzcGFjZSBjb3VudAorICAlIG11c3QgZG8gaW4gdGhpcyBvcmRlcjoKKyAgXG9iZXlsaW5lcyBcdW5jYXRjb2Rlc3BlY2lhbHMgXHNlcHNwYWNlcworICBcZXZlcnlwYXJ7XHN0YXJ0dGFiYm94fSUKK30KKworJSBEbyB0aGUgQHZlcmIgbWFnaWM6IHZlcmJhdGltIHRleHQgaXMgcXVvdGVkIGJ5IHVuaXF1ZQorJSBkZWxpbWl0ZXIgY2hhcmFjdGVycy4gIEJlZm9yZSBmaXJzdCBkZWxpbWl0ZXIgZXhwZWN0IGEKKyUgcmlnaHQgYnJhY2UsIGFmdGVyIGxhc3QgZGVsaW1pdGVyIGV4cGVjdCBjbG9zaW5nIGJyYWNlOgorJQorJSAgICBcZGVmXGRvdmVyYid7JzxjaGFyPiMxPGNoYXI+J30neyMxfQorJQorJSBbS251dGhdIHAuIDM4Mjsgb25seSBlYXQgb3V0ZXIge30KK1xiZWdpbmdyb3VwCisgIFxjYXRjb2RlYFs9MVxjYXRjb2RlYF09MlxjYXRjb2RlYFx7PVxvdGhlclxjYXRjb2RlYFx9PVxvdGhlcgorICBcZ2RlZlxkb3ZlcmJ7IzFbXGRlZlxuZXh0IyMxIzF9WyMjMVxlbmRncm91cF1cbmV4dF0KK1xlbmRncm91cAorJQorXGRlZlx2ZXJie1xiZWdpbmdyb3VwXHNldHVwdmVyYlxkb3ZlcmJ9CislCislCislIERvIHRoZSBAdmVyYmF0aW0gbWFnaWM6IGRlZmluZSB0aGUgbWFjcm8gXGRvdmVyYmF0aW0gc28gdGhhdAorJSB0aGUgKGZpcnN0KSBhcmd1bWVudCBlbmRzIHdoZW4gJ0BlbmQgdmVyYmF0aW0nIGlzIHJlYWNoZWQsIGllOgorJQorJSAgICAgXGRlZlxkb3ZlcmJhdGltIzFAZW5kIHZlcmJhdGlteyMxfQorJQorJSBGb3IgVGV4aW5mbyBpdCdzIGEgbG90IGVhc2llciB0aGFuIGZvciBMYVRlWCwKKyUgYmVjYXVzZSB0ZXhpbmZvJ3MgXHZlcmJhdGltIGRvZXNuJ3Qgc3RvcCBhdCAnXGVuZHt2ZXJiYXRpbX0nOgorJSB3ZSBuZWVkIG5vdCByZWRlZmluZSAnXCcsICd7JyBhbmQgJ30nLgorJQorJSBJbnNwaXJlZCBieSBMYVRlWCdzIHZlcmJhdGltIGNvbW1hbmQgc2V0IFtsYXRleC5sdHhdCislCitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcID1cYWN0aXZlCisgIFxvYmV5bGluZXMgJQorICAlIGlnbm9yZSBldmVyeXRoaW5nIHVwIHRvIHRoZSBmaXJzdCBeXk0sIHRoYXQncyB0aGUgbmV3bGluZSBhdCB0aGUgZW5kCisgICUgb2YgdGhlIEB2ZXJiYXRpbSBpbnB1dCBsaW5lIGl0c2VsZi4gIE90aGVyd2lzZSB3ZSBnZXQgYW4gZXh0cmEgYmxhbmsKKyAgJSBsaW5lIGluIHRoZSBvdXRwdXQuCisgIFx4ZGVmXGRvdmVyYmF0aW0jMV5eTSMyQGVuZCB2ZXJiYXRpbXsjMlxub2V4cGFuZFxlbmRcZ29iYmxlIHZlcmJhdGltfSUKKyAgJSBXZSByZWFsbHkgd2FudCB7Li4uXGVuZCB2ZXJiYXRpbX0gaW4gdGhlIGJvZHkgb2YgdGhlIG1hY3JvLCBidXQKKyAgJSB3aXRob3V0IHRoZSBhY3RpdmUgc3BhY2U7IHRodXMgd2UgaGF2ZSB0byB1c2UgXHhkZWYgYW5kIFxnb2JibGUuCitcZW5kZ3JvdXAKKyUKK1xlbnZkZWZcdmVyYmF0aW17JQorICAgIFxzZXR1cHZlcmJhdGltXGRvdmVyYmF0aW0KK30KK1xsZXRcRXZlcmJhdGltID0gXGFmdGVyZW52YnJlYWsKKworCislIEB2ZXJiYXRpbWluY2x1ZGUgRklMRSAtIGluc2VydCB0ZXh0IG9mIGZpbGUgaW4gdmVyYmF0aW0gZW52aXJvbm1lbnQuCislCitcZGVmXHZlcmJhdGltaW5jbHVkZXtccGFyc2Vhcmd1c2luZ1xmaWxlbmFtZWNhdGNvZGVzXGRvdmVyYmF0aW1pbmNsdWRlfQorJQorXGRlZlxkb3ZlcmJhdGltaW5jbHVkZSMxeyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxzZXR1cHZlcmJhdGltCisgICAgXGlucHV0ICMxCisgICAgXGFmdGVyZW52YnJlYWsKKyAgfSUKK30KKworJSBAY29weWluZyAuLi4gQGVuZCBjb3B5aW5nLgorJSBTYXZlIHRoZSB0ZXh0IGF3YXkgZm9yIEBpbnNlcnRjb3B5aW5nIGxhdGVyLgorJQorJSBXZSBzYXZlIHRoZSB1bmludGVycHJldGVkIHRva2VucywgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBib3guCislIFNhdmluZyB0aGUgdGV4dCBpbiBhIGJveCB3b3VsZCBiZSBtdWNoIGVhc2llciwgYnV0IHRoZW4gYWxsIHRoZQorJSB0eXBlc2V0dGluZyBjb21tYW5kcyAoQHNtYWxsYm9vaywgZm9udCBjaGFuZ2VzLCBldGMuKSBoYXZlIHRvIGJlIGRvbmUKKyUgYmVmb3JlaGFuZCAtLSBhbmQgYSkgd2Ugd2FudCBAY29weWluZyB0byBiZSBkb25lIGZpcnN0IGluIHRoZSBzb3VyY2UKKyUgZmlsZTsgYikgbGV0dGluZyB1c2VycyBkZWZpbmUgdGhlIGZyb250bWF0dGVyIGluIGFzIGZsZXhpYmxlIG9yZGVyIGFzCislIHBvc3NpYmxlIGlzIHZlcnkgZGVzaXJhYmxlLgorJQorXGRlZlxjb3B5aW5ne1xjaGVja2Vudnt9XGJlZ2luZ3JvdXBcc2NhbmFyZ2N0eHRcZG9jb3B5aW5nfQorXGRlZlxkb2NvcHlpbmcjMUBlbmQgY29weWluZ3tcZW5kZ3JvdXBcZGVmXGNvcHlpbmd0ZXh0eyMxfX0KKyUKK1xkZWZcaW5zZXJ0Y29weWluZ3slCisgIFxiZWdpbmdyb3VwCisgICAgXHBhcmluZGVudCA9IDBwdCAgJSBwYXJhZ3JhcGggaW5kZW50YXRpb24gbG9va3Mgd3Jvbmcgb24gdGl0bGUgcGFnZQorICAgIFxzY2FuZXhwXGNvcHlpbmd0ZXh0CisgIFxlbmRncm91cAorfQorCitcbWVzc2FnZXtkZWZ1bnMsfQorJSBAZGVmdW4gZXRjLgorCitcbmV3c2tpcFxkZWZib2R5aW5kZW50IFxkZWZib2R5aW5kZW50PS40aW4KK1xuZXdza2lwXGRlZmFyZ3NpbmRlbnQgXGRlZmFyZ3NpbmRlbnQ9NTBwdAorXG5ld3NraXBcZGVmbGFzdGFyZ21hcmdpbiBcZGVmbGFzdGFyZ21hcmdpbj0xOHB0CisKKyUgU3RhcnQgdGhlIHByb2Nlc3Npbmcgb2YgQGRlZmZuOgorXGRlZlxzdGFydGRlZnVueyUKKyAgXGlmbnVtXGxhc3RwZW5hbHR5PDEwMDAwCisgICAgXG1lZGJyZWFrCisgIFxlbHNlCisgICAgJSBJZiB0aGVyZSBhcmUgdHdvIEBkZWYgY29tbWFuZHMgaW4gYSByb3csIHdlJ2xsIGhhdmUgYSBcbm9icmVhaywKKyAgICAlIHdoaWNoIGlzIHRoZXJlIHRvIGtlZXAgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIHRvZ2V0aGVyIHdpdGggaXRzCisgICAgJSBoZWFkZXIuICBCdXQgaWYgdGhlcmUncyBub3RoaW5nIGJ1dCBoZWFkZXJzLCB3ZSBuZWVkIHRvIGFsbG93IGEKKyAgICAlIGJyZWFrIHNvbWV3aGVyZS4gIENoZWNrIHNwZWNpZmljYWxseSBmb3IgcGVuYWx0eSAxMDAwMiwgaW5zZXJ0ZWQKKyAgICAlIGJ5IFxkZWZhcmdzY29tbW9uZW5kaW5nLCBpbnN0ZWFkIG9mIDEwMDAwLCBzaW5jZSB0aGUgc2VjdGlvbmluZworICAgICUgY29tbWFuZHMgYWxzbyBpbnNlcnQgYSBub2JyZWFrIHBlbmFsdHksIGFuZCB3ZSBkb24ndCB3YW50IHRvIGFsbG93CisgICAgJSBhIGJyZWFrIGJldHdlZW4gYSBzZWN0aW9uIGhlYWRpbmcgYW5kIGEgZGVmdW4uCisgICAgJSAKKyAgICBcaWZudW1cbGFzdHBlbmFsdHk9MTAwMDIgXHBlbmFsdHkyMDAwIFxmaQorICAgICUKKyAgICAlIFNpbWlsYXJseSwgYWZ0ZXIgYSBzZWN0aW9uIGhlYWRpbmcsIGRvIG5vdCBhbGxvdyBhIGJyZWFrLgorICAgICUgQnV0IGRvIGluc2VydCB0aGUgZ2x1ZS4KKyAgICBcbWVkc2tpcCAgJSBwcmVjZWRlZCBieSBkaXNjYXJkYWJsZSBwZW5hbHR5LCBzbyBub3QgYSBicmVha3BvaW50CisgIFxmaQorICAlCisgIFxwYXJpbmRlbnQ9MGluCisgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50CisgIFxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKK30KKworXGRlZlxkb2RlZnVueCMxeyUKKyAgJSBGaXJzdCwgY2hlY2sgd2hldGhlciB3ZSBhcmUgaW4gdGhlIHJpZ2h0IGVudmlyb25tZW50OgorICBcY2hlY2tlbnYjMSUKKyAgJQorICAlIEFzIGFib3ZlLCBhbGxvdyBsaW5lIGJyZWFrIGlmIHdlIGhhdmUgbXVsdGlwbGUgeCBoZWFkZXJzIGluIGEgcm93LgorICAlIEl0J3Mgbm90IGEgZ3JlYXQgcGxhY2UsIHRob3VnaC4KKyAgXGlmbnVtXGxhc3RwZW5hbHR5PTEwMDAyIFxwZW5hbHR5MzAwMCBcZmkKKyAgJQorICAlIEFuZCBub3csIGl0J3MgdGltZSB0byByZXVzZSB0aGUgYm9keSBvZiB0aGUgb3JpZ2luYWwgZGVmdW46CisgIFxleHBhbmRhZnRlclxnb2JibGVkZWZ1biMxJQorfQorXGRlZlxnb2JibGVkZWZ1biMxXHN0YXJ0ZGVmdW57fQorCislIFxwcmludGRlZnVubGluZSBcZGVmZm5oZWFkZXJ7dGV4dH0KKyUKK1xkZWZccHJpbnRkZWZ1bmxpbmUjMSMyeyUKKyAgXGJlZ2luZ3JvdXAKKyAgICAlIGNhbGwgXGRlZmZuaGVhZGVyOgorICAgICMxIzIgXGVuZGhlYWRlcgorICAgICUgY29tbW9uIGVuZGluZzoKKyAgICBcaW50ZXJsaW5lcGVuYWx0eSA9IDEwMDAwCisgICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5IDBwdCBwbHVzIDFmaWwKKyAgICBcZW5kZ3JhZgorICAgIFxub2JyZWFrXHZza2lwIC1ccGFyc2tpcAorICAgIFxwZW5hbHR5IDEwMDAyICAlIHNpZ25hbCB0byBcc3RhcnRkZWZ1biBhbmQgXGRvZGVmdW54CisgICAgJSBTb21lIG9mIHRoZSBAZGVmdW4tdHlwZSB0YWdzIGRvIG5vdCBlbmFibGUgbWFnaWMgcGFyZW50aGVzZXMsCisgICAgJSByZW5kZXJpbmcgdGhlIGZvbGxvd2luZyBjaGVjayByZWR1bmRhbnQuICBCdXQgd2UgZG9uJ3Qgb3B0aW1pemUuCisgICAgXGNoZWNrcGFyZW5jb3VudHMKKyAgXGVuZGdyb3VwCit9CisKK1xkZWZcRWRlZnVue1xlbmRncmFmXG1lZGJyZWFrfQorCislIFxtYWtlZGVmdW57ZGVmZm59IGNyZWF0ZXMgXGRlZmZuLCBcZGVmZm54IGFuZCBcRWRlZmZuOworJSB0aGUgb25seSB0aGluZyByZW1haW5uaWcgaXMgdG8gZGVmaW5lIFxkZWZmbmhlYWRlci4KKyUKK1xkZWZcbWFrZWRlZnVuIzF7JQorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBFIzFcZW5kY3NuYW1lID0gXEVkZWZ1bgorICBcZWRlZlx0ZW1we1xub2V4cGFuZFxkb21ha2VkZWZ1bgorICAgIFxtYWtlY3NuYW1leyMxfVxtYWtlY3NuYW1leyMxeH1cbWFrZWNzbmFtZXsjMWhlYWRlcn19JQorICBcdGVtcAorfQorCislIFxkb21ha2VkZWZ1biBcZGVmZm4gXGRlZmZueCBcZGVmZm5oZWFkZXIKKyUKKyUgRGVmaW5lIFxkZWZmbiBhbmQgXGRlZmZueCwgd2l0aG91dCBwYXJhbWV0ZXJzLgorJSBcZGVmZm5oZWFkZXIgaGFzIHRvIGJlIGRlZmluZWQgZXhwbGljaXRseS4KKyUKK1xkZWZcZG9tYWtlZGVmdW4jMSMyIzN7JQorICBcZW52ZGVmIzF7JQorICAgIFxzdGFydGRlZnVuCisgICAgXHBhcnNlYXJndXNpbmdcYWN0aXZlcGFyZW5ze1xwcmludGRlZnVubGluZSMzfSUKKyAgfSUKKyAgXGRlZiMye1xkb2RlZnVueCMxfSUKKyAgXGRlZiMzJQorfQorCislJSUgVW50eXBlZCBmdW5jdGlvbnM6CisKKyUgQGRlZmZuIGNhdGVnb3J5IG5hbWUgYXJncworXG1ha2VkZWZ1bntkZWZmbn17XGRlZmZuZ2VuZXJhbHt9fQorCislIEBkZWZmbiBjYXRlZ29yeSBjbGFzcyBuYW1lIGFyZ3MKK1xtYWtlZGVmdW57ZGVmb3B9IzEge1xkZWZvcG9ueyMxXCBccHV0d29yZG9ufX0KKworJSBcZGVmb3BvbiB7Y2F0ZWdvcnkgb259Y2xhc3MgbmFtZSBhcmdzCitcZGVmXGRlZm9wb24jMSMyIHtcZGVmZm5nZW5lcmFse1xwdXR3b3Jkb25cIFxjb2RleyMyfX17IzFcIFxjb2RleyMyfX0gfQorCislIFxkZWZmbmdlbmVyYWwge3N1YmluZH1jYXRlZ29yeSBuYW1lIGFyZ3MKKyUKK1xkZWZcZGVmZm5nZW5lcmFsIzEjMiAjMyAjNFxlbmRoZWFkZXJ7JQorICAlIFJlbWVtYmVyIHRoYXQgXGRvc3ViaW5ke2ZufXtmb299e30gaXMgZXF1aXZhbGVudCB0byBcZG9pbmR7Zm59e2Zvb30uCisgIFxkb3N1YmluZHtmbn17XGNvZGV7IzN9fXsjMX0lCisgIFxkZWZuYW1leyMyfXt9eyMzfVxtYWdpY2FtcFxkZWZ1bmFyZ3N7IzRcdW5za2lwfSUKK30KKworJSUlIFR5cGVkIGZ1bmN0aW9uczoKKworJSBAZGVmdHlwZWZuIGNhdGVnb3J5IHR5cGUgbmFtZSBhcmdzCitcbWFrZWRlZnVue2RlZnR5cGVmbn17XGRlZnR5cGVmbmdlbmVyYWx7fX0KKworJSBAZGVmdHlwZW9wIGNhdGVnb3J5IGNsYXNzIHR5cGUgbmFtZSBhcmdzCitcbWFrZWRlZnVue2RlZnR5cGVvcH0jMSB7XGRlZnR5cGVvcG9ueyMxXCBccHV0d29yZG9ufX0KKworJSBcZGVmdHlwZW9wb24ge2NhdGVnb3J5IG9ufWNsYXNzIHR5cGUgbmFtZSBhcmdzCitcZGVmXGRlZnR5cGVvcG9uIzEjMiB7XGRlZnR5cGVmbmdlbmVyYWx7XHB1dHdvcmRvblwgXGNvZGV7IzJ9fXsjMVwgXGNvZGV7IzJ9fSB9CisKKyUgXGRlZnR5cGVmbmdlbmVyYWwge3N1YmluZH1jYXRlZ29yeSB0eXBlIG5hbWUgYXJncworJQorXGRlZlxkZWZ0eXBlZm5nZW5lcmFsIzEjMiAjMyAjNCAjNVxlbmRoZWFkZXJ7JQorICBcZG9zdWJpbmR7Zm59e1xjb2RleyM0fX17IzF9JQorICBcZGVmbmFtZXsjMn17IzN9eyM0fVxkZWZ1bmFyZ3N7IzVcdW5za2lwfSUKK30KKworJSUlIFR5cGVkIHZhcmlhYmxlczoKKworJSBAZGVmdHlwZXZyIGNhdGVnb3J5IHR5cGUgdmFyIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdHlwZXZyfXtcZGVmdHlwZWN2Z2VuZXJhbHt9fQorCislIEBkZWZ0eXBlY3YgY2F0ZWdvcnkgY2xhc3MgdHlwZSB2YXIgYXJncworXG1ha2VkZWZ1bntkZWZ0eXBlY3Z9IzEge1xkZWZ0eXBlY3ZvZnsjMVwgXHB1dHdvcmRvZn19CisKKyUgXGRlZnR5cGVjdm9mIHtjYXRlZ29yeSBvZn1jbGFzcyB0eXBlIHZhciBhcmdzCitcZGVmXGRlZnR5cGVjdm9mIzEjMiB7XGRlZnR5cGVjdmdlbmVyYWx7XHB1dHdvcmRvZlwgXGNvZGV7IzJ9fXsjMVwgXGNvZGV7IzJ9fSB9CisKKyUgXGRlZnR5cGVjdmdlbmVyYWwge3N1YmluZH1jYXRlZ29yeSB0eXBlIHZhciBhcmdzCislCitcZGVmXGRlZnR5cGVjdmdlbmVyYWwjMSMyICMzICM0ICM1XGVuZGhlYWRlcnslCisgIFxkb3N1YmluZHt2cn17XGNvZGV7IzR9fXsjMX0lCisgIFxkZWZuYW1leyMyfXsjM317IzR9XGRlZnVuYXJnc3sjNVx1bnNraXB9JQorfQorCislJSUgVW50eXBlZCB2YXJpYWJsZXM6CisKKyUgQGRlZnZyIGNhdGVnb3J5IHZhciBhcmdzCitcbWFrZWRlZnVue2RlZnZyfSMxIHtcZGVmdHlwZXZyaGVhZGVyeyMxfSB7fSB9CisKKyUgQGRlZmN2IGNhdGVnb3J5IGNsYXNzIHZhciBhcmdzCitcbWFrZWRlZnVue2RlZmN2fSMxIHtcZGVmY3ZvZnsjMVwgXHB1dHdvcmRvZn19CisKKyUgXGRlZmN2b2Yge2NhdGVnb3J5IG9mfWNsYXNzIHZhciBhcmdzCitcZGVmXGRlZmN2b2YjMSMyIHtcZGVmdHlwZWN2b2Z7IzF9IzIge30gfQorCislJSUgVHlwZToKKyUgQGRlZnRwIGNhdGVnb3J5IG5hbWUgYXJncworXG1ha2VkZWZ1bntkZWZ0cH0jMSAjMiAjM1xlbmRoZWFkZXJ7JQorICBcZG9pbmR7dHB9e1xjb2RleyMyfX0lCisgIFxkZWZuYW1leyMxfXt9eyMyfVxkZWZ1bmFyZ3N7IzNcdW5za2lwfSUKK30KKworJSBSZW1haW5pbmcgQGRlZnVuLWxpa2Ugc2hvcnRjdXRzOgorXG1ha2VkZWZ1bntkZWZ1bn17XGRlZmZuaGVhZGVye1xwdXR3b3JkRGVmZnVuY30gfQorXG1ha2VkZWZ1bntkZWZtYWN9e1xkZWZmbmhlYWRlcntccHV0d29yZERlZm1hY30gfQorXG1ha2VkZWZ1bntkZWZzcGVjfXtcZGVmZm5oZWFkZXJ7XHB1dHdvcmREZWZzcGVjfSB9CitcbWFrZWRlZnVue2RlZnR5cGVmdW59e1xkZWZ0eXBlZm5oZWFkZXJ7XHB1dHdvcmREZWZmdW5jfSB9CitcbWFrZWRlZnVue2RlZnZhcn17XGRlZnZyaGVhZGVye1xwdXR3b3JkRGVmdmFyfSB9CitcbWFrZWRlZnVue2RlZm9wdH17XGRlZnZyaGVhZGVye1xwdXR3b3JkRGVmb3B0fSB9CitcbWFrZWRlZnVue2RlZnR5cGV2YXJ9e1xkZWZ0eXBldnJoZWFkZXJ7XHB1dHdvcmREZWZ2YXJ9IH0KK1xtYWtlZGVmdW57ZGVmbWV0aG9kfXtcZGVmb3BvblxwdXR3b3JkTWV0aG9kb259CitcbWFrZWRlZnVue2RlZnR5cGVtZXRob2R9e1xkZWZ0eXBlb3BvblxwdXR3b3JkTWV0aG9kb259CitcbWFrZWRlZnVue2RlZml2YXJ9e1xkZWZjdm9mXHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2Z9CitcbWFrZWRlZnVue2RlZnR5cGVpdmFyfXtcZGVmdHlwZWN2b2ZccHV0d29yZEluc3RhbmNlVmFyaWFibGVvZn0KKworJSBcZGVmbmFtZSwgd2hpY2ggZm9ybWF0cyB0aGUgbmFtZSBvZiB0aGUgQGRlZiAobm90IHRoZSBhcmdzKS4KKyUgIzEgaXMgdGhlIGNhdGVnb3J5LCBzdWNoIGFzICJGdW5jdGlvbiIuCislICMyIGlzIHRoZSByZXR1cm4gdHlwZSwgaWYgYW55LgorJSAjMyBpcyB0aGUgZnVuY3Rpb24gbmFtZS4KKyUKKyUgV2UgYXJlIGZvbGxvd2VkIGJ5IChidXQgbm90IHBhc3NlZCkgdGhlIGFyZ3VtZW50cywgaWYgYW55LgorJQorXGRlZlxkZWZuYW1lIzEjMiMzeyUKKyAgJSBHZXQgdGhlIHZhbHVlcyBvZiBcbGVmdHNraXAgYW5kIFxyaWdodHNraXAgYXMgdGhleSB3ZXJlIG91dHNpZGUgdGhlIEBkZWYuLi4KKyAgXGFkdmFuY2VcbGVmdHNraXAgYnkgLVxkZWZib2R5aW5kZW50CisgICUKKyAgJSBIb3cgd2UnbGwgZm9ybWF0IHRoZSB0eXBlIG5hbWUuICBQdXR0aW5nIGl0IGluIGJyYWNrZXRzIGhlbHBzCisgICUgZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aGUgYm9keSB0ZXh0IHRoYXQgbWF5IGVuZCB1cCBvbiB0aGUgbmV4dCBsaW5lCisgICUganVzdCBiZWxvdyBpdC4KKyAgXGRlZlx0ZW1weyMxfSUKKyAgXHNldGJveDA9XGhib3h7XGtlcm5cZGVmbGFzdGFyZ21hcmdpbiBcaWZ4XHRlbXBcZW1wdHlcZWxzZSBbXHJtXHRlbXBdXGZpfQorICAlCisgICUgRmlndXJlIG91dCBsaW5lIHNpemVzIGZvciB0aGUgcGFyYWdyYXBoIHNoYXBlLgorICAlIFRoZSBmaXJzdCBsaW5lIG5lZWRzIHNwYWNlIGZvciBcYm94MDsgYnV0IGlmIFxyaWdodHNraXAgaXMgbm9uemVybywKKyAgJSB3ZSBuZWVkIG9ubHkgc3BhY2UgZm9yIHRoZSBwYXJ0IG9mIFxib3gwIHdoaWNoIGV4Y2VlZHMgaXQ6CisgIFxkaW1lbjA9XGhzaXplICBcYWR2YW5jZVxkaW1lbjAgYnkgLVx3ZDAgIFxhZHZhbmNlXGRpbWVuMCBieSBccmlnaHRza2lwCisgICUgVGhlIGNvbnRpbnVhdGlvbnM6CisgIFxkaW1lbjI9XGhzaXplICBcYWR2YW5jZVxkaW1lbjIgYnkgLVxkZWZhcmdzaW5kZW50CisgICUgKHBsYWluLnRleCBzYXlzIHRoYXQgXGRpbWVuMSBzaG91bGQgYmUgdXNlZCBvbmx5IGFzIGdsb2JhbC4pCisgIFxwYXJzaGFwZSAyIDBpbiBcZGltZW4wIFxkZWZhcmdzaW5kZW50IFxkaW1lbjIKKyAgJQorICAlIFB1dCB0aGUgdHlwZSBuYW1lIHRvIHRoZSByaWdodCBtYXJnaW4uCisgIFxub2luZGVudAorICBcaGJveCB0byAwcHR7JQorICAgIFxoZmlsXGJveDAgXGtlcm4tXGhzaXplCisgICAgJSBcaHNpemUgaGFzIHRvIGJlIHNob3J0ZW5lZCB0aGlzIHdheToKKyAgICBca2VyblxsZWZ0c2tpcAorICAgICUgSW50ZW50aW9uYWxseSBkbyBub3QgcmVzcGVjdCBccmlnaHRza2lwLCBzaW5jZSB3ZSBuZWVkIHRoZSBzcGFjZS4KKyAgfSUKKyAgJQorICAlIEFsbG93IGFsbCBsaW5lcyB0byBiZSB1bmRlcmZ1bGwgd2l0aG91dCBjb21wbGFpbnQ6CisgIFx0b2xlcmFuY2U9MTAwMDAgXGhiYWRuZXNzPTEwMDAwCisgIFxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKKyAgeyUKKyAgICAlIGRlZnVuIGZvbnRzLiBXZSB1c2UgdHlwZXdyaXRlciBieSBkZWZhdWx0ICh1c2VkIHRvIGJlIGJvbGQpIGJlY2F1c2U6CisgICAgJSAuIHdlJ3JlIHByaW50aW5nIGlkZW50aWZpZXJzLCB0aGV5IHNob3VsZCBiZSBpbiB0dCBpbiBwcmluY2lwbGUuCisgICAgJSAuIGluIGxhbmd1YWdlcyB3aXRoIG1hbnkgYWNjZW50cywgc3VjaCBhcyBDemVjaCBvciBGcmVuY2gsIGl0J3MKKyAgICAlICAgY29tbW9uIHRvIGxlYXZlIGFjY2VudHMgb2ZmIGlkZW50aWZpZXJzLiAgVGhlIHJlc3VsdCBsb29rcyBvayBpbgorICAgICUgICB0dCwgYnV0IGV4Y2VlZGluZ2x5IHN0cmFuZ2UgaW4gcm0uCisgICAgJSAuIHdlIGRvbid0IHdhbnQgLS0gYW5kIC0tLSB0byBiZSB0cmVhdGVkIGFzIGxpZ2F0dXJlcy4KKyAgICAlIC4gdGhpcyBzdGlsbCBkb2VzIG5vdCBmaXggdGhlID9gIGFuZCAhYCBsaWdhdHVyZXMsIGJ1dCBzbyBmYXIgbm8KKyAgICAlICAgb25lIGhhcyBtYWRlIGlkZW50aWZpZXJzIHVzaW5nIHRoZW0gOikuCisgICAgXGRmIFx0dAorICAgIFxkZWZcdGVtcHsjMn0lIHJldHVybiB2YWx1ZSB0eXBlCisgICAgXGlmeFx0ZW1wXGVtcHR5XGVsc2UgXHRjbG9zZXtcdGVtcH0gXGZpCisgICAgIzMlIG91dHB1dCBmdW5jdGlvbiBuYW1lCisgIH0lCisgIHtccm1cZW5za2lwfSUgaHNraXAgMC41IGVtIG9mIFx0ZW5ybQorICAlCisgIFxib2xkYnJheAorICAlIGFyZ3VtZW50cyB3aWxsIGJlIG91dHB1dCBuZXh0LCBpZiBhbnkuCit9CisKKyUgUHJpbnQgYXJndW1lbnRzIGluIHNsYW50ZWQgcm9tYW4gKG5vdCB0dHNsKSwgaW5jb25zaXN0ZW50bHkgd2l0aCB1c2luZworJSB0dCBmb3IgdGhlIG5hbWUuICBUaGlzIGlzIGJlY2F1c2UgbGl0ZXJhbCB0ZXh0IGlzIHNvbWV0aW1lcyBuZWVkZWQgaW4KKyUgdGhlIGFyZ3VtZW50IGxpc3QgKGdyb2ZmIG1hbnVhbCksIGFuZCB0dHNsIGFuZCB0dCBhcmUgbm90IHZlcnkKKyUgZGlzdGluZ3Vpc2hhYmxlLiAgUHJldmVudCBoeXBoZW5hdGlvbiBhdCBgLScgY2hhcnMuCislCitcZGVmXGRlZnVuYXJncyMxeyUKKyAgJSB1c2Ugc2wgYnkgZGVmYXVsdCAobm90IHR0c2wpLAorICAlIHR0IGZvciB0aGUgbmFtZXMuCisgIFxkZiBcc2wgXGh5cGhlbmNoYXJcZm9udD0wCisgICUKKyAgJSBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgYW4gYXJndW1lbnQgaGFzIHR3byBkYXNoZXMgKGZvciBpbnN0YW5jZSksIHdlCisgICUgd2FudCBhIHdheSB0byBnZXQgdHRzbC4gIExldCdzIHRyeSBAdmFyIGZvciB0aGF0LgorICBcbGV0XHZhcj1cdHRzbGFudGVkCisgICMxJQorICBcc2xcaHlwaGVuY2hhclxmb250PTQ1Cit9CisKKyUgV2Ugd2FudCAoKSZbXSB0byBwcmludCBzcGVjaWFsbHkgb24gdGhlIGRlZnVuIGxpbmUuCislCitcZGVmXGFjdGl2ZXBhcmVuc3slCisgIFxjYXRjb2RlYFwoPVxhY3RpdmUgXGNhdGNvZGVgXCk9XGFjdGl2ZQorICBcY2F0Y29kZWBcWz1cYWN0aXZlIFxjYXRjb2RlYFxdPVxhY3RpdmUKKyAgXGNhdGNvZGVgXCY9XGFjdGl2ZQorfQorCislIE1ha2UgY29udHJvbCBzZXF1ZW5jZXMgd2hpY2ggYWN0IGxpa2Ugbm9ybWFsIHBhcmVudGhlc2lzIGNoYXJzLgorXGxldFxscGFyZW4gPSAoIFxsZXRccnBhcmVuID0gKQorCislIEJlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIGRlZmluaXRpb24gZm9yIGAoJywgZXRjLiAgRm9yIGV4YW1wbGUsCislIGlmIHRoZSBmbiBuYW1lIGhhcyBwYXJlbnMgaW4gaXQsIFxib2xkYnJheCB3aWxsIG5vdCBiZSBpbiBlZmZlY3QgeWV0LAorJSBzbyBUZVggd291bGQgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0IHVuZGVmaW5lZCBjb250cm9sIHNlcXVlbmNlLgoreworICBcYWN0aXZlcGFyZW5zCisgIFxnbG9iYWxcbGV0KD1cbHBhcmVuIFxnbG9iYWxcbGV0KT1ccnBhcmVuCisgIFxnbG9iYWxcbGV0Wz1cbGJyYWNrIFxnbG9iYWxcbGV0XT1ccmJyYWNrCisgIFxnbG9iYWxcbGV0JiA9IFwmCisKKyAgXGdkZWZcYm9sZGJyYXh7XGxldCg9XG9wbnJcbGV0KT1cY2xuclxsZXRbPVxsYnJiXGxldF09XHJicmJ9CisgIFxnZGVmXG1hZ2ljYW1we1xsZXQmPVxhbXBybX0KK30KKworXG5ld2NvdW50XHBhcmVuY291bnQKKworJSBJZiB3ZSBlbmNvdW50ZXIgJmZvbywgdGhlbiB0dXJuIG9uICgpLWhhY2tpbmcgYWZ0ZXJ3YXJkcworXG5ld2lmXGlmYW1wc2VlbgorXGRlZlxhbXBybSMxIHtcYW1wc2VlbnRydWV7XGJmXCYjMSB9fQorCitcZGVmXHBhcmVuZm9udHslCisgIFxpZmFtcHNlZW4KKyAgICAlIEF0IHRoZSBmaXJzdCBsZXZlbCwgcHJpbnQgcGFyZW5zIGluIHJvbWFuLAorICAgICUgb3RoZXJ3aXNlIHVzZSB0aGUgZGVmYXVsdCBmb250LgorICAgIFxpZm51bSBccGFyZW5jb3VudD0xIFxybSBcZmkKKyAgXGVsc2UKKyAgICAlIFRoZSBcc2YgcGFyZW5zIChpbiBcYm9sZGJyYXgpIGFjdHVhbGx5IGFyZSBhIGxpdHRsZSBib2xkZXIgdGhhbgorICAgICUgdGhlIGNvbnRhaW5lZCB0ZXh0LiAgVGhpcyBpcyBlc3BlY2lhbGx5IG5lZWRlZCBmb3IgWyBhbmQgXSAuCisgICAgXHNmCisgIFxmaQorfQorXGRlZlxpbmZpcnN0bGV2ZWwjMXslCisgIFxpZmFtcHNlZW4KKyAgICBcaWZudW1ccGFyZW5jb3VudD0xCisgICAgICAjMSUKKyAgICBcZmkKKyAgXGZpCit9CitcZGVmXGJmYWZ0ZXJ3b3JkIzEgeyMxIFxiZn0KKworXGRlZlxvcG5yeyUKKyAgXGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgMQorICB7XHBhcmVuZm9udCh9JQorICBcaW5maXJzdGxldmVsIFxiZmFmdGVyd29yZAorfQorXGRlZlxjbG5yeyUKKyAge1xwYXJlbmZvbnQpfSUKKyAgXGluZmlyc3RsZXZlbCBcc2wKKyAgXGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgLTEKK30KKworXG5ld2NvdW50XGJyYWNrY291bnQKK1xkZWZcbGJyYnslCisgIFxnbG9iYWxcYWR2YW5jZVxicmFja2NvdW50IGJ5IDEKKyAge1xiZlt9JQorfQorXGRlZlxyYnJieyUKKyAge1xiZl19JQorICBcZ2xvYmFsXGFkdmFuY2VcYnJhY2tjb3VudCBieSAtMQorfQorCitcZGVmXGNoZWNrcGFyZW5jb3VudHN7JQorICBcaWZudW1ccGFyZW5jb3VudD0wIFxlbHNlIFxiYWRwYXJlbmNvdW50IFxmaQorICBcaWZudW1cYnJhY2tjb3VudD0wIFxlbHNlIFxiYWRicmFja2NvdW50IFxmaQorfQorXGRlZlxiYWRwYXJlbmNvdW50eyUKKyAgXGVycm1lc3NhZ2V7VW5iYWxhbmNlZCBwYXJlbnRoZXNlcyBpbiBAZGVmfSUKKyAgXGdsb2JhbFxwYXJlbmNvdW50PTAKK30KK1xkZWZcYmFkYnJhY2tjb3VudHslCisgIFxlcnJtZXNzYWdle1VuYmFsYW5jZWQgc3F1YXJlIGJyYWNlcyBpbiBAZGVmfSUKKyAgXGdsb2JhbFxicmFja2NvdW50PTAKK30KKworCitcbWVzc2FnZXttYWNyb3MsfQorJSBAbWFjcm8uCisKKyUgVG8gZG8gdGhpcyByaWdodCB3ZSBuZWVkIGEgZmVhdHVyZSBvZiBlLVRlWCwgXHNjYW50b2tlbnMsCislIHdoaWNoIHdlIGFycmFuZ2UgdG8gZW11bGF0ZSB3aXRoIGEgdGVtcG9yYXJ5IGZpbGUgaW4gb3JkaW5hcnkgVGVYLgorXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWQKKyAgXG5ld3dyaXRlXG1hY3NjcmliYmxlCisgIFxkZWZcc2NhbnRva2VucyMxeyUKKyAgICBcdG9rczA9eyMxfSUKKyAgICBcaW1tZWRpYXRlXG9wZW5vdXRcbWFjc2NyaWJibGU9XGpvYm5hbWUudG1wCisgICAgXGltbWVkaWF0ZVx3cml0ZVxtYWNzY3JpYmJsZXtcdGhlXHRva3MwfSUKKyAgICBcaW1tZWRpYXRlXGNsb3Nlb3V0XG1hY3NjcmliYmxlCisgICAgXGlucHV0IFxqb2JuYW1lLnRtcAorICB9CitcZmkKKworXGRlZlxzY2FubWFjcm8jMXslCisgIFxiZWdpbmdyb3VwCisgICAgXG5ld2xpbmVjaGFyYFxeXk0KKyAgICBcbGV0XHhlYXRzcGFjZXNcZWF0c3BhY2VzCisgICAgJSBVbmRvIGNhdGNvZGUgY2hhbmdlcyBvZiBcc3RhcnRjb250ZW50cyBhbmQgXGRvcHJpbnRpbmRleAorICAgICUgV2hlbiBjYWxsZWQgZnJvbSBAaW5zZXJ0Y29weWluZyBvciAoc2hvcnQpY2FwdGlvbiwgd2UgbmVlZCBhY3RpdmUKKyAgICAlIGJhY2tzbGFzaCB0byBnZXQgaXQgcHJpbnRlZCBjb3JyZWN0bHkuICBQcmV2aW91c2x5LCB3ZSBoYWQKKyAgICAlIFxjYXRjb2RlYFxcPVxvdGhlciBpbnN0ZWFkLiAgV2UnbGwgc2VlIHdoZXRoZXIgYSBwcm9ibGVtIGFwcGVhcnMKKyAgICAlIHdpdGggbWFjcm8gZXhwYW5zaW9uLgkJCQktLWthc2FsLCAxOWF1ZzA0CisgICAgXGNhdGNvZGVgXEA9MCBcY2F0Y29kZWBcXD1cYWN0aXZlIFxlc2NhcGVjaGFyPWBcQAorICAgICUgLi4uIGFuZCBcZXhhbXBsZQorICAgIFxzcGFjZWlzc3BhY2UKKyAgICAlCisgICAgJSBBcHBlbmQgXGVuZGlucHV0IHRvIG1ha2Ugc3VyZSB0aGF0IFRlWCBkb2VzIG5vdCBzZWUgdGhlIGVuZGluZyBuZXdsaW5lLgorICAgICUKKyAgICAlIEkndmUgdmVyaWZpZWQgdGhhdCBpdCBpcyBuZWNlc3NhcnkgYm90aCBmb3IgZS1UZVggYW5kIGZvciBvcmRpbmFyeSBUZVgKKyAgICAlCQkJCQkJCS0ta2FzYWwsIDI5bm92MDMKKyAgICBcc2NhbnRva2Vuc3sjMVxlbmRpbnB1dH0lCisgIFxlbmRncm91cAorfQorCitcZGVmXHNjYW5leHAjMXslCisgIFxlZGVmXHRlbXB7XG5vZXhwYW5kXHNjYW5tYWNyb3sjMX19JQorICBcdGVtcAorfQorCitcbmV3Y291bnRccGFyYW1ubyAgICUgQ291bnQgb2YgcGFyYW1ldGVycworXG5ld3Rva3NcbWFjbmFtZSAgICAlIE1hY3JvIG5hbWUKK1xuZXdpZlxpZnJlY3Vyc2l2ZSAgJSBJcyBpdCByZWN1cnNpdmU/CisKKyUgTGlzdCBvZiBhbGwgZGVmaW5lZCBtYWNyb3MgaW4gdGhlIGZvcm0KKyUgICAgXGRlZmluZWR1bW15d29yZFxtYWNybzFcZGVmaW5lZHVtbXl3b3JkXG1hY3JvMi4uLgorJSBDdXJyZW50bHkgaXMgYWxzbyBjb250YWlucyBhbGwgQGFsaWFzZXM7IHRoZSBsaXN0IGNhbiBiZSBzcGxpdAorJSBpZiB0aGVyZSBpcyBhIG5lZWQuCitcZGVmXG1hY3JvbGlzdHt9CisKKyUgQWRkIHRoZSBtYWNybyB0byBcbWFjcm9saXN0CitcZGVmXGFkZHRvbWFjcm9saXN0IzF7XGV4cGFuZGFmdGVyIFxhZGR0b21hY3JvbGlzdHh4eCBcY3NuYW1lIzFcZW5kY3NuYW1lfQorXGRlZlxhZGR0b21hY3JvbGlzdHh4eCMxeyUKKyAgICAgXHRva3MwID0gXGV4cGFuZGFmdGVye1xtYWNyb2xpc3RcZGVmaW5lZHVtbXl3b3JkIzF9JQorICAgICBceGRlZlxtYWNyb2xpc3R7XHRoZVx0b2tzMH0lCit9CisKKyUgVXRpbGl0eSByb3V0aW5lcy4KKyUgVGhpcyBkb2VzIFxsZXQgIzEgPSAjMiwgd2l0aCBcY3NuYW1lczsgdGhhdCBpcywKKyUgICBcbGV0IFxjc25hbWUjMVxlbmRjc25hbWUgPSBcY3NuYW1lIzJcZW5kY3NuYW1lCislIChleGNlcHQgb2YgY291cnNlIHdlIGhhdmUgdG8gcGxheSBleHBhbnNpb24gZ2FtZXMpLgorJSAKK1xkZWZcY3NsZXQjMSMyeyUKKyAgXGV4cGFuZGFmdGVyXGxldAorICBcY3NuYW1lIzFcZXhwYW5kYWZ0ZXJcZW5kY3NuYW1lCisgIFxjc25hbWUjMlxlbmRjc25hbWUKK30KKworJSBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBvZmYgYSBzdHJpbmcuCislIENvbmNlcHRzIGZyb20gYXJvLWJlbmQgcHJvYmxlbSAxNSAoc2VlIENUQU4pLgore1xjYXRjb2RlYFxAPTExCitcZ2RlZlxlYXRzcGFjZXMgIzF7XGV4cGFuZGFmdGVyXHRyaW1AXGV4cGFuZGFmdGVyeyMxIH19CitcZ2RlZlx0cmltQCAjMXtcdHJpbUBAIEAjMSBAICMxIEAgQEB9CitcZ2RlZlx0cmltQEAgIzFAICMyQCAjM0BAe1x0cmltQEBAXGVtcHR5ICMyIEB9CitcZGVmXHVuYnJhY2UjMXsjMX0KK1x1bmJyYWNle1xnZGVmXHRyaW1AQEAgIzEgfSAjMkB7IzF9Cit9CisKKyUgVHJpbSBhIHNpbmdsZSB0cmFpbGluZyBeXk0gb2ZmIGEgc3RyaW5nLgore1xjYXRjb2RlYFxeXk09XG90aGVyIFxjYXRjb2RlYFxRPTMlCitcZ2RlZlxlYXRjciAjMXtcZWF0Y3JhICMxUV5eTVF9JQorXGdkZWZcZWF0Y3JhIzFeXk1Re1xlYXRjcmIjMVF9JQorXGdkZWZcZWF0Y3JiIzFRIzJReyMxfSUKK30KKworJSBNYWNybyBib2RpZXMgYXJlIGFic29yYmVkIGFzIGFuIGFyZ3VtZW50IGluIGEgY29udGV4dCB3aGVyZQorJSBhbGwgY2hhcmFjdGVycyBhcmUgY2F0Y29kZSAxMCwgMTEgb3IgMTIsIGV4Y2VwdCBcIHdoaWNoIGlzIGFjdGl2ZQorJSAoYXMgaW4gbm9ybWFsIHRleGluZm8pLiBJdCBpcyBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIFwuCisKKyUgSXQncyBuZWNlc3NhcnkgdG8gaGF2ZSBoYXJkIENScyB3aGVuIHRoZSBtYWNybyBpcyBleGVjdXRlZC4gVGhpcyBpcworJSBkb25lIGJ5ICBtYWtpbmcgXl5NIChcZW5kbGluZWNoYXIpIGNhdGNvZGUgMTIgd2hlbiByZWFkaW5nIHRoZSBtYWNybworJSBib2R5LCBhbmQgdGhlbiBtYWtpbmcgaXQgdGhlIFxuZXdsaW5lY2hhciBpbiBcc2Nhbm1hY3JvLgorCitcZGVmXHNjYW5jdHh0eyUKKyAgXGNhdGNvZGVgXCI9XG90aGVyCisgIFxjYXRjb2RlYFwrPVxvdGhlcgorICBcY2F0Y29kZWBcPD1cb3RoZXIKKyAgXGNhdGNvZGVgXD49XG90aGVyCisgIFxjYXRjb2RlYFxAPVxvdGhlcgorICBcY2F0Y29kZWBcXj1cb3RoZXIKKyAgXGNhdGNvZGVgXF89XG90aGVyCisgIFxjYXRjb2RlYFx8PVxvdGhlcgorICBcY2F0Y29kZWBcfj1cb3RoZXIKK30KKworXGRlZlxzY2FuYXJnY3R4dHslCisgIFxzY2FuY3R4dAorICBcY2F0Y29kZWBcXD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eTT1cb3RoZXIKK30KKworXGRlZlxtYWNyb2JvZHljdHh0eyUKKyAgXHNjYW5jdHh0CisgIFxjYXRjb2RlYFx7PVxvdGhlcgorICBcY2F0Y29kZWBcfT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eTT1cb3RoZXIKKyAgXHVzZW1ib2R5YmFja3NsYXNoCit9CisKK1xkZWZcbWFjcm9hcmdjdHh0eyUKKyAgXHNjYW5jdHh0CisgIFxjYXRjb2RlYFxcPVxvdGhlcgorfQorCislIFxtYm9keWJhY2tzbGFzaCBpcyB0aGUgZGVmaW5pdGlvbiBvZiBcIGluIEBtYWNybyBib2RpZXMuCislIEl0IG1hcHMgXGZvb1wgPT4gXGNzbmFtZSBtYWNhcmcuZm9vXGVuZGNzbmFtZSA9PiAjTgorJSB3aGVyZSBOIGlzIHRoZSBtYWNybyBwYXJhbWV0ZXIgbnVtYmVyLgorJSBXZSBkZWZpbmUgXGNzbmFtZSBtYWNhcmcuXGVuZGNzbmFtZSB0byBiZSBccmVhbGJhY2tzbGFzaCwgc28KKyUgXFwgaW4gbWFjcm8gcmVwbGFjZW1lbnQgdGV4dCBnZXRzIHlvdSBhIGJhY2tzbGFzaC4KKwore1xjYXRjb2RlYEA9MCBAY2F0Y29kZWBAXD1AYWN0aXZlCisgQGdkZWZAdXNlbWJvZHliYWNrc2xhc2h7QGxldFw9QG1ib2R5YmFja3NsYXNofQorIEBnZGVmQG1ib2R5YmFja3NsYXNoIzFce0Bjc25hbWUgbWFjYXJnLiMxQGVuZGNzbmFtZX0KK30KK1xleHBhbmRhZnRlclxkZWZcY3NuYW1lIG1hY2FyZy5cZW5kY3NuYW1le1xyZWFsYmFja3NsYXNofQorCitcZGVmXG1hY3Jve1xyZWN1cnNpdmVmYWxzZVxwYXJzZWFyZ1xtYWNyb3h4eH0KK1xkZWZccm1hY3Jve1xyZWN1cnNpdmV0cnVlXHBhcnNlYXJnXG1hY3JveHh4fQorCitcZGVmXG1hY3JveHh4IzF7JQorICBcZ2V0YXJnc3sjMX0lICAgICAgICAgICBub3cgXG1hY25hbWUgaXMgdGhlIG1hY25hbWUgYW5kIFxhcmdsIHRoZSBhcmdsaXN0CisgIFxpZnhcYXJnbFxlbXB0eSAgICAgICAlIG5vIGFyZ3VtZW50cworICAgICBccGFyYW1ubz0wJQorICBcZWxzZQorICAgICBcZXhwYW5kYWZ0ZXJccGFyc2VtYXJnZGVmIFxhcmdsOyUKKyAgXGZpCisgIFxpZjFcY3NuYW1lIGlzbWFjcm8uXHRoZVxtYWNuYW1lXGVuZGNzbmFtZQorICAgICBcbWVzc2FnZXtXYXJuaW5nOiByZWRlZmluaW5nIFx0aGVcbWFjbmFtZX0lCisgIFxlbHNlCisgICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFx0aGVcbWFjbmFtZVxlbmRjc25hbWUgXHJlbGF4CisgICAgIFxlbHNlIFxlcnJtZXNzYWdle01hY3JvIG5hbWUgXHRoZVxtYWNuYW1lXHNwYWNlIGFscmVhZHkgZGVmaW5lZH1cZmkKKyAgICAgXGdsb2JhbFxjc2xldHttYWNzYXZlLlx0aGVcbWFjbmFtZX17XHRoZVxtYWNuYW1lfSUKKyAgICAgXGdsb2JhbFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIGlzbWFjcm8uXHRoZVxtYWNuYW1lXGVuZGNzbmFtZT0xJQorICAgICBcYWRkdG9tYWNyb2xpc3R7XHRoZVxtYWNuYW1lfSUKKyAgXGZpCisgIFxiZWdpbmdyb3VwIFxtYWNyb2JvZHljdHh0CisgIFxpZnJlY3Vyc2l2ZSBcZXhwYW5kYWZ0ZXJccGFyc2VybWFjYm9keQorICBcZWxzZSBcZXhwYW5kYWZ0ZXJccGFyc2VtYWNib2R5CisgIFxmaX0KKworXHBhcnNlYXJnZGVmXHVubWFjcm97JQorICBcaWYxXGNzbmFtZSBpc21hY3JvLiMxXGVuZGNzbmFtZQorICAgIFxnbG9iYWxcY3NsZXR7IzF9e21hY3NhdmUuIzF9JQorICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0IFxjc25hbWUgaXNtYWNyby4jMVxlbmRjc25hbWU9MCUKKyAgICAlIFJlbW92ZSB0aGUgbWFjcm8gbmFtZSBmcm9tIFxtYWNyb2xpc3Q6CisgICAgXGJlZ2luZ3JvdXAKKyAgICAgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIzFcZW5kY3NuYW1lIFxyZWxheAorICAgICAgXGxldFxkZWZpbmVkdW1teXdvcmRcdW5tYWNyb2RvCisgICAgICBceGRlZlxtYWNyb2xpc3R7XG1hY3JvbGlzdH0lCisgICAgXGVuZGdyb3VwCisgIFxlbHNlCisgICAgXGVycm1lc3NhZ2V7TWFjcm8gIzEgbm90IGRlZmluZWR9JQorICBcZmkKK30KKworJSBDYWxsZWQgYnkgXGRvIGZyb20gXGRvdW5tYWNybyBvbiBlYWNoIG1hY3JvLiAgVGhlIGlkZWEgaXMgdG8gb21pdCBhbnkKKyUgbWFjcm8gZGVmaW5pdGlvbnMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCB0byBccmVsYXguCislCitcZGVmXHVubWFjcm9kbyMxeyUKKyAgXGlmeCAjMVxyZWxheAorICAgICUgcmVtb3ZlIHRoaXMKKyAgXGVsc2UKKyAgICBcbm9leHBhbmRcZGVmaW5lZHVtbXl3b3JkIFxub2V4cGFuZCMxJQorICBcZmkKK30KKworJSBUaGlzIG1ha2VzIHVzZSBvZiB0aGUgb2JzY3VyZSBmZWF0dXJlIHRoYXQgaWYgdGhlIGxhc3QgdG9rZW4gb2YgYQorJSA8cGFyYW1ldGVyIGxpc3Q+IGlzICMsIHRoZW4gdGhlIHByZWNlZGluZyBhcmd1bWVudCBpcyBkZWxpbWl0ZWQgYnkKKyUgYW4gb3BlbmluZyBicmFjZSwgYW5kIHRoYXQgb3BlbmluZyBicmFjZSBpcyBub3QgY29uc3VtZWQuCitcZGVmXGdldGFyZ3MjMXtcZ2V0YXJnc3h4eCMxe319CitcZGVmXGdldGFyZ3N4eHgjMSN7XGdldG1hY25hbWUgIzEgXHJlbGF4XGdldG1hY2FyZ3N9CitcZGVmXGdldG1hY25hbWUgIzEgIzJccmVsYXh7XG1hY25hbWU9eyMxfX0KK1xkZWZcZ2V0bWFjYXJncyMxe1xkZWZcYXJnbHsjMX19CisKKyUgUGFyc2UgdGhlIG9wdGlvbmFsIHtwYXJhbXN9IGxpc3QuICBTZXQgdXAgXHBhcmFtbm8gYW5kIFxwYXJhbWxpc3QKKyUgc28gXGRlZm1hY3JvIGtub3dzIHdoYXQgdG8gZG8uICBEZWZpbmUgXG1hY2FyZy5ibGFoIGZvciBlYWNoIGJsYWgKKyUgaW4gdGhlIHBhcmFtcyBsaXN0LCB0byBiZSAjI04gd2hlcmUgTiBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBsaXN0LgorJSBUaGF0IGdldHMgdXNlZCBieSBcbWJvZHliYWNrc2xhc2ggKGFib3ZlKS4KKworJSBXZSBuZWVkIHRvIGdldCBgbWFjcm8gcGFyYW1ldGVyIGNoYXIgIycgaW50byBzZXZlcmFsIGRlZmluaXRpb25zLgorJSBUaGUgdGVjaG5pcXVlIHVzZWQgaXMgc3RvbGVuIGZyb20gTGFUZVg6ICBsZXQgXGhhc2ggYmUgc29tZXRoaW5nCislIHVuZXhwYW5kYWJsZSwgaW5zZXJ0IHRoYXQgd2hlcmV2ZXIgeW91IG5lZWQgYSAjLCBhbmQgdGhlbiByZWRlZmluZQorJSBpdCB0byAjIGp1c3QgYmVmb3JlIHVzaW5nIHRoZSB0b2tlbiBsaXN0IHByb2R1Y2VkLgorJQorJSBUaGUgc2FtZSB0ZWNobmlxdWUgaXMgdXNlZCB0byBwcm90ZWN0IFxlYXRzcGFjZXMgdGlsbCBqdXN0IGJlZm9yZQorJSB0aGUgbWFjcm8gaXMgdXNlZC4KKworXGRlZlxwYXJzZW1hcmdkZWYjMTt7XHBhcmFtbm89MFxkZWZccGFyYW1saXN0e30lCisgICAgICAgIFxsZXRcaGFzaFxyZWxheFxsZXRceGVhdHNwYWNlc1xyZWxheFxwYXJzZW1hcmdkZWZ4eHgjMSw7LH0KK1xkZWZccGFyc2VtYXJnZGVmeHh4IzEseyUKKyAgXGlmIzE7XGxldFxuZXh0PVxyZWxheAorICBcZWxzZSBcbGV0XG5leHQ9XHBhcnNlbWFyZ2RlZnh4eAorICAgIFxhZHZhbmNlXHBhcmFtbm8gYnkgMSUKKyAgICBcZXhwYW5kYWZ0ZXJcZWRlZlxjc25hbWUgbWFjYXJnLlxlYXRzcGFjZXN7IzF9XGVuZGNzbmFtZQorICAgICAgICB7XHhlYXRzcGFjZXN7XGhhc2hcdGhlXHBhcmFtbm99fSUKKyAgICBcZWRlZlxwYXJhbWxpc3R7XHBhcmFtbGlzdFxoYXNoXHRoZVxwYXJhbW5vLH0lCisgIFxmaVxuZXh0fQorCislIFRoZXNlIHR3byBjb21tYW5kcyByZWFkIHJlY3Vyc2l2ZSBhbmQgbm9ucmVjdXJzaXZlIG1hY3JvIGJvZGllcy4KKyUgKFRoZXkncmUgZGlmZmVyZW50IHNpbmNlIHJlYyBhbmQgbm9ucmVjIG1hY3JvcyBlbmQgZGlmZmVyZW50bHkuKQorCitcbG9uZ1xkZWZccGFyc2VtYWNib2R5IzFAZW5kIG1hY3JvJQore1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQorXGxvbmdcZGVmXHBhcnNlcm1hY2JvZHkjMUBlbmQgcm1hY3JvJQore1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQorCislIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gaXRzZWxmLiBUaGVyZSBhcmUgc2l4IGNhc2VzOiByZWN1cnNpdmUgYW5kCislIG5vbnJlY3Vyc2l2ZSBtYWNyb3Mgb2YgemVybywgb25lLCBhbmQgbWFueSBhcmd1bWVudHMuCislIE11Y2ggbWFnaWMgd2l0aCBcZXhwYW5kYWZ0ZXIgaGVyZS4KKyUgXHhkZWYgaXMgdXNlZCBzbyB0aGF0IG1hY3JvIGRlZmluaXRpb25zIHdpbGwgc3Vydml2ZSB0aGUgZmlsZQorJSB0aGV5J3JlIGRlZmluZWQgaW47IEBpbmNsdWRlIHJlYWRzIHRoZSBmaWxlIGluc2lkZSBhIGdyb3VwLgorXGRlZlxkZWZtYWNyb3slCisgIFxsZXRcaGFzaD0jIyUgY29udmVydCBwbGFjZWhvbGRlcnMgdG8gbWFjcm8gcGFyYW1ldGVyIGNoYXJzCisgIFxpZnJlY3Vyc2l2ZQorICAgIFxpZmNhc2VccGFyYW1ubworICAgICUgMAorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICBcb3IgJSAxCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgIFxiZ3JvdXBcbm9leHBhbmRcbWFjcm9hcmdjdHh0CisgICAgICAgICBcbm9leHBhbmRcYnJhY2VvcmxpbmUKKyAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCisgICAgICAgICBcZWdyb3VwXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQorICAgIFxlbHNlICUgbWFueQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAorICAgICAgICAgXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWV9JQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZSMjMXslCisgICAgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lICMjMSx9JQorICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZgorICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCisgICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQorICAgICAgICAgIFxwYXJhbWxpc3R7XGVncm91cFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICBcZmkKKyAgXGVsc2UKKyAgICBcaWZjYXNlXHBhcmFtbm8KKyAgICAlIDAKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCisgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCisgICAgXG9yICUgMQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAorICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lCisgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWV9JQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICBcZWdyb3VwCisgICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKKyAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKKyAgICBcZWxzZSAlIG1hbnkKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKKyAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lfSUKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lCisgICAgICBccGFyYW1saXN0eyUKKyAgICAgICAgICBcZWdyb3VwCisgICAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQorICAgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCisgICAgXGZpCisgIFxmaX0KKworXGRlZlxub3JlY3Vyc2UjMXtcYmdyb3VwXGNzbGV0eyMxfXttYWNzYXZlLiMxfX0KKworJSBcYnJhY2VvcmxpbmUgZGVjaWRlcyB3aGV0aGVyIHRoZSBuZXh0IG5vbndoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGEKKyUgey4gIElmIHNvIGl0IHJlYWRzIHVwIHRvIHRoZSBjbG9zaW5nIH0sIGlmIG5vdCwgaXQgcmVhZHMgdGhlIHdob2xlCislIGxpbmUuICBXaGF0ZXZlciB3YXMgcmVhZCBpcyB0aGVuIGZlZCB0byB0aGUgbmV4dCBjb250cm9sIHNlcXVlbmNlCislIGFzIGFuIGFyZ3VtZW50IChieSBccGFyc2VicmFjZSBvciBccGFyc2VhcmcpCitcZGVmXGJyYWNlb3JsaW5lIzF7XGxldFxuZXh0PSMxXGZ1dHVyZWxldFxuY2hhclxicmFjZW9ybGluZXh4eH0KK1xkZWZcYnJhY2VvcmxpbmV4eHh7JQorICBcaWZ4XG5jaGFyXGJncm91cFxlbHNlCisgICAgXGV4cGFuZGFmdGVyXHBhcnNlYXJnCisgIFxmaSBcbmV4dH0KKworCislIEBhbGlhcy4KKyUgV2UgbmVlZCBzb21lIHRyaWNrZXJ5IHRvIHJlbW92ZSB0aGUgb3B0aW9uYWwgc3BhY2VzIGFyb3VuZCB0aGUgZXF1YWwKKyUgc2lnbi4gIEp1c3QgbWFrZSB0aGVtIGFjdGl2ZSBhbmQgdGhlbiBleHBhbmQgdGhlbSBhbGwgdG8gbm90aGluZy4KK1xkZWZcYWxpYXN7XHBhcnNlYXJndXNpbmdcb2JleXNwYWNlc1xhbGlhc3h4eH0KK1xkZWZcYWxpYXN4eHggIzF7XGFsaWFzeXl5IzFccmVsYXh9CitcZGVmXGFsaWFzeXl5ICMxPSMyXHJlbGF4eyUKKyAgeyUKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XG9iZXllZHNwYWNlPVxlbXB0eQorICAgIFxhZGR0b21hY3JvbGlzdHsjMX0lCisgICAgXHhkZWZcbmV4dHtcZ2xvYmFsXGxldFxtYWtlY3NuYW1leyMxfT1cbWFrZWNzbmFtZXsjMn19JQorICB9JQorICBcbmV4dAorfQorCisKK1xtZXNzYWdle2Nyb3NzIHJlZmVyZW5jZXMsfQorCitcbmV3d3JpdGVcYXV4ZmlsZQorCitcbmV3aWZcaWZoYXZleHJlZnMgICAgJSBUcnVlIGlmIHhyZWYgdmFsdWVzIGFyZSBrbm93bi4KK1xuZXdpZlxpZndhcm5lZHhyZWZzICAlIFRydWUgaWYgd2Ugd2FybmVkIG9uY2UgdGhhdCB0aGV5IGFyZW4ndCBrbm93bi4KKworJSBAaW5mb3JlZiBpcyByZWxhdGl2ZWx5IHNpbXBsZS4KK1xkZWZcaW5mb3JlZiAjMXtcaW5mb3JlZnp6eiAjMSwsLCwqKn0KK1xkZWZcaW5mb3JlZnp6eiAjMSwjMiwjMywjNCoqe1xwdXR3b3JkU2Vle30gXHB1dHdvcmRJbmZve30gXHB1dHdvcmRmaWxle30gXGZpbGV7XGlnbm9yZXNwYWNlcyAjM3t9fSwKKyAgbm9kZSBcc2FtcHtcaWdub3Jlc3BhY2VzIzF7fX19CisKKyUgQG5vZGUncyBvbmx5IGpvYiBpbiBUZVggaXMgdG8gZGVmaW5lIFxsYXN0bm9kZSwgd2hpY2ggaXMgdXNlZCBpbgorJSBjcm9zcy1yZWZlcmVuY2VzLiAgVGhlIEBub2RlIGxpbmUgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgY29tbWFzLCBhbmQKKyUgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgc3BhY2VzIGJlZm9yZSB0aGUgZmlyc3QgY29tbWEsIGxpa2U6CislIEBub2RlIGZvbyAsIGJhciAsIC4uLgorJSBXZSBkb24ndCB3YW50IHN1Y2ggdHJhaWxpbmcgc3BhY2VzIGluIHRoZSBub2RlIG5hbWUuCislCitccGFyc2VhcmdkZWZcbm9kZXtcY2hlY2tlbnZ7fVxkb25vZGUgIzEgLFxmaW5pc2hub2RlcGFyc2V9CislCislIGFsc28gcmVtb3ZlIGEgdHJhaWxpbmcgY29tbWEsIGluIGNhc2Ugb2Ygc29tZXRoaW5nIGxpa2UgdGhpczoKKyUgQG5vZGUgSGVscC1Dcm9zcywgICwgICwgQ3Jvc3MtcmVmcworXGRlZlxkb25vZGUjMSAsIzJcZmluaXNobm9kZXBhcnNle1xkb2Rvbm9kZSAjMSxcZmluaXNobm9kZXBhcnNlfQorXGRlZlxkb2Rvbm9kZSMxLCMyXGZpbmlzaG5vZGVwYXJzZXtcZ2RlZlxsYXN0bm9kZXsjMX19CisKK1xsZXRcbndub2RlPVxub2RlCitcbGV0XGxhc3Rub2RlPVxlbXB0eQorCislIFdyaXRlIGEgY3Jvc3MtcmVmZXJlbmNlIGRlZmluaXRpb24gZm9yIHRoZSBjdXJyZW50IG5vZGUuICAjMSBpcyB0aGUKKyUgdHlwZSAoWW51bWJlcmVkLCBZYXBwZW5kaXgsIFlub3RoaW5nKS4KKyUKK1xkZWZcZG9ub2RlcmVmIzF7JQorICBcaWZ4XGxhc3Rub2RlXGVtcHR5XGVsc2UKKyAgICBcc2V0cmVme1xsYXN0bm9kZX17IzF9JQorICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxlbXB0eQorICBcZmkKK30KKworJSBAYW5jaG9ye05BTUV9IC0tIGRlZmluZSB4cmVmIHRhcmdldCBhdCBhcmJpdHJhcnkgcG9pbnQuCislCitcbmV3Y291bnRcc2F2ZXNmcmVnaXN0ZXIKKyUKK1xkZWZcc2F2ZXNme1xyZWxheCBcaWZobW9kZSBcc2F2ZXNmcmVnaXN0ZXI9XHNwYWNlZmFjdG9yIFxmaX0KK1xkZWZccmVzdG9yZXNme1xyZWxheCBcaWZobW9kZSBcc3BhY2VmYWN0b3I9XHNhdmVzZnJlZ2lzdGVyIFxmaX0KK1xkZWZcYW5jaG9yIzF7XHNhdmVzZiBcc2V0cmVmeyMxfXtZbm90aGluZ31ccmVzdG9yZXNmIFxpZ25vcmVzcGFjZXN9CisKKyUgXHNldHJlZntOQU1FfXtTTlR9IGRlZmluZXMgYSBjcm9zcy1yZWZlcmVuY2UgcG9pbnQgTkFNRSAoYSBub2RlIG9yIGFuCislIGFuY2hvciksIHdoaWNoIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOgorJSAxKSBOQU1FLXRpdGxlIC0gdGhlIGN1cnJlbnQgc2VjdGlvbmluZyBuYW1lIHRha2VuIGZyb20gXHRoaXNzZWN0aW9uLAorJSAgICAgICAgICAgICAgICAgb3IgdGhlIGFuY2hvciBuYW1lLgorJSAyKSBOQU1FLXNudCAgIC0gc2VjdGlvbiBudW1iZXIgYW5kIHR5cGUsIHBhc3NlZCBhcyB0aGUgU05UIGFyZywgb3IKKyUgICAgICAgICAgICAgICAgIGVtcHR5IGZvciBhbmNob3JzLgorJSAzKSBOQU1FLXBnICAgIC0gdGhlIHBhZ2UgbnVtYmVyLgorJQorJSBUaGlzIGlzIGNhbGxlZCBmcm9tIFxkb25vZGVyZWYsIFxhbmNob3IsIGFuZCBcZG9mbG9hdC4gIEluIHRoZSBjYXNlIG9mCislIGZsb2F0cywgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYXJ0LCB3aGljaCBpcyBub3Qgd3JpdHRlbiBoZXJlOgorJSA0KSBOQU1FLWxvZiAgIC0gdGhlIHRleHQgYXMgaXQgc2hvdWxkIGFwcGVhciBpbiBhIEBsaXN0b2ZmbG9hdHMuCislCitcZGVmXHNldHJlZiMxIzJ7JQorICBccGRmbWtkZXN0eyMxfSUKKyAgXGlmbGlua3MKKyAgICB7JQorICAgICAgXGF0ZHVtbWllcyAgJSBwcmVzZXJ2ZSBjb21tYW5kcywgYnV0IGRvbid0IGV4cGFuZCB0aGVtCisgICAgICBcZWRlZlx3cml0ZXhyZGVmIyMxIyMyeyUKKwlcd3JpdGVcYXV4ZmlsZXtAeHJkZWZ7IzEtJSAjMSBvZiBcc2V0cmVmLCBleHBhbmRlZCBieSB0aGUgXGVkZWYKKwkgICMjMX17IyMyfX0lIHRoZXNlIGFyZSBwYXJhbWV0ZXJzIG9mIFx3cml0ZXhyZGVmCisgICAgICB9JQorICAgICAgXHRva3MwID0gXGV4cGFuZGFmdGVye1x0aGlzc2VjdGlvbn0lCisgICAgICBcaW1tZWRpYXRlIFx3cml0ZXhyZGVme3RpdGxlfXtcdGhlXHRva3MwIH0lCisgICAgICBcaW1tZWRpYXRlIFx3cml0ZXhyZGVme3NudH17XGNzbmFtZSAjMlxlbmRjc25hbWV9JSBcWW51bWJlcmVkIGV0Yy4KKyAgICAgIFx3cml0ZXhyZGVme3BnfXtcZm9saW99JSB3aWxsIGJlIHdyaXR0ZW4gbGF0ZXIsIGR1cmluZyBcc2hpcG91dAorICAgIH0lCisgIFxmaQorfQorCislIEB4cmVmLCBAcHhyZWYsIGFuZCBAcmVmIGdlbmVyYXRlIGNyb3NzLXJlZmVyZW5jZXMuICBGb3IgXHhyZWZYLCAjMSBpcworJSB0aGUgbm9kZSBuYW1lLCAjMiB0aGUgbmFtZSBvZiB0aGUgSW5mbyBjcm9zcy1yZWZlcmVuY2UsICMzIHRoZSBwcmludGVkCislIG5vZGUgbmFtZSwgIzQgdGhlIG5hbWUgb2YgdGhlIEluZm8gZmlsZSwgIzUgdGhlIG5hbWUgb2YgdGhlIHByaW50ZWQKKyUgbWFudWFsLiAgQWxsIGJ1dCB0aGUgbm9kZSBuYW1lIGNhbiBiZSBvbWl0dGVkLgorJQorXGRlZlxweHJlZiMxe1xwdXR3b3Jkc2Vle30gXHhyZWZYWyMxLCwsLCwsLF19CitcZGVmXHhyZWYjMXtccHV0d29yZFNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQorXGRlZlxyZWYjMXtceHJlZlhbIzEsLCwsLCwsXX0KK1xkZWZceHJlZlhbIzEsIzIsIzMsIzQsIzUsIzZde1xiZWdpbmdyb3VwCisgIFx1bnNlcHNwYWNlcworICBcZGVmXHByaW50ZWRtYW51YWx7XGlnbm9yZXNwYWNlcyAjNX0lCisgIFxkZWZccHJpbnRlZHJlZm5hbWV7XGlnbm9yZXNwYWNlcyAjM30lCisgIFxzZXRib3gxPVxoYm94e1xwcmludGVkbWFudWFsXHVuc2tpcH0lCisgIFxzZXRib3gwPVxoYm94e1xwcmludGVkcmVmbmFtZVx1bnNraXB9JQorICBcaWZkaW0gXHdkMCA9IDBwdAorICAgICUgTm8gcHJpbnRlZCBub2RlIG5hbWUgd2FzIGV4cGxpY2l0bHkgZ2l2ZW4uCisgICAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUeHJlZi1hdXRvbWF0aWMtc2VjdGlvbi10aXRsZVxlbmRjc25hbWVccmVsYXgKKyAgICAgICUgVXNlIHRoZSBub2RlIG5hbWUgaW5zaWRlIHRoZSBzcXVhcmUgYnJhY2tldHMuCisgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQorICAgIFxlbHNlCisgICAgICAlIFVzZSB0aGUgYWN0dWFsIGNoYXB0ZXIvc2VjdGlvbiB0aXRsZSBhcHBlYXIgaW5zaWRlCisgICAgICAlIHRoZSBzcXVhcmUgYnJhY2tldHMuICBVc2UgdGhlIHJlYWwgc2VjdGlvbiB0aXRsZSBpZiB3ZSBoYXZlIGl0LgorICAgICAgXGlmZGltIFx3ZDEgPiAwcHQKKyAgICAgICAgJSBJdCBpcyBpbiBhbm90aGVyIG1hbnVhbCwgc28gd2UgZG9uJ3QgaGF2ZSBpdC4KKyAgICAgICAgXGRlZlxwcmludGVkcmVmbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKKyAgICAgIFxlbHNlCisgICAgICAgIFxpZmhhdmV4cmVmcworICAgICAgICAgICUgV2Uga25vdyB0aGUgcmVhbCB0aXRsZSBpZiB3ZSBoYXZlIHRoZSB4cmVmIHZhbHVlcy4KKyAgICAgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xyZWZ4eyMxLXRpdGxlfXt9fSUKKyAgICAgICAgXGVsc2UKKyAgICAgICAgICAlIE90aGVyd2lzZSBqdXN0IGNvcHkgdGhlIEluZm8gbm9kZSBuYW1lLgorICAgICAgICAgIFxkZWZccHJpbnRlZHJlZm5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCisgICAgICAgIFxmaSUKKyAgICAgIFxmaQorICAgIFxmaQorICBcZmkKKyAgJQorICAlIE1ha2UgbGluayBpbiBwZGYgb3V0cHV0LgorICBcaWZwZGYKKyAgICBcbGVhdmV2bW9kZQorICAgIFxnZXRmaWxlbmFtZXsjNH0lCisgICAge1x0dXJub2ZmYWN0aXZlCisgICAgICUgU2VlIGNvbW1lbnRzIGF0IFxhY3RpdmViYWNrc2xhc2hkb3VibGUuCisgICAgIHtcYWN0aXZlYmFja3NsYXNoZG91YmxlIFx4ZGVmXHBkZnhyZWZkZXN0eyMxfSUKKyAgICAgIFxiYWNrc2xhc2hwYXJlbnNccGRmeHJlZmRlc3R9JQorICAgICAlCisgICAgIFxpZm51bVxmaWxlbmFtZWxlbmd0aD4wCisgICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0lCisgICAgICAgICBnb3RvIGZpbGV7XHRoZVxmaWxlbmFtZS5wZGZ9IG5hbWV7XHBkZnhyZWZkZXN0fSUKKyAgICAgXGVsc2UKKyAgICAgICBcc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSUKKyAgICAgICAgIGdvdG8gbmFtZXtccGRmbWtwZ257XHBkZnhyZWZkZXN0fX0lCisgICAgIFxmaQorICAgIH0lCisgICAgXGxpbmtjb2xvcgorICBcZmkKKyAgJQorICAlIEZsb2F0IHJlZmVyZW5jZXMgYXJlIHByaW50ZWQgY29tcGxldGVseSBkaWZmZXJlbnRseTogIkZpZ3VyZSAxLjIiCisgICUgaW5zdGVhZCBvZiAiW3NvbWVub2RlXSwgcC4zIi4gIFdlIGRpc3Rpbmd1aXNoIHRoZW0gYnkgdGhlCisgICUgTEFCRUwtdGl0bGUgYmVpbmcgc2V0IHRvIGEgbWFnaWMgc3RyaW5nLgorICB7JQorICAgICUgSGF2ZSB0byBvdGhlcmlmeSBldmVyeXRoaW5nIHNwZWNpYWwgdG8gYWxsb3cgdGhlIFxjc25hbWUgdG8KKyAgICAlIGluY2x1ZGUgYW4gXyBpbiB0aGUgeHJlZiBuYW1lLCBldGMuCisgICAgXGluZGV4bm9mb250cworICAgIFx0dXJub2ZmYWN0aXZlCisgICAgXGV4cGFuZGFmdGVyXGdsb2JhbFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcWHRoaXNyZWZ0aXRsZQorICAgICAgXGNzbmFtZSBYUiMxLXRpdGxlXGVuZGNzbmFtZQorICB9JQorICBcaWZmbG9hdFxYdGhpc3JlZnRpdGxlCisgICAgJSBJZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIHByaW50IG5hbWUgKHRoaXJkIGFyZykgdG8gdGhlIHJlZiwKKyAgICAlIHByaW50IGl0IGluc3RlYWQgb2Ygb3VyIHVzdWFsICJGaWd1cmUgMS4yIi4KKyAgICBcaWZkaW1cd2QwID0gMHB0CisgICAgICBccmVmeHsjMS1zbnR9e30lCisgICAgXGVsc2UKKyAgICAgIFxwcmludGVkcmVmbmFtZQorICAgIFxmaQorICAgICUKKyAgICAlIGlmIHRoZSB1c2VyIGFsc28gZ2F2ZSB0aGUgcHJpbnRlZCBtYW51YWwgbmFtZSAoZmlmdGggYXJnKSwgYXBwZW5kCisgICAgJSAiaW4gTUFOVUFMTkFNRSIuCisgICAgXGlmZGltIFx3ZDEgPiAwcHQKKyAgICAgIFxzcGFjZSBccHV0d29yZGlue30gXGNpdGV7XHByaW50ZWRtYW51YWx9JQorICAgIFxmaQorICBcZWxzZQorICAgICUgbm9kZS9hbmNob3IgKG5vbi1mbG9hdCkgcmVmZXJlbmNlcy4KKyAgICAlCisgICAgJSBJZiB3ZSB1c2UgXHVuaGJveDAgYW5kIFx1bmhib3gxIHRvIHByaW50IHRoZSBub2RlIG5hbWVzLCBUZVggZG9lcyBub3QKKyAgICAlIGluc2VydCBlbXB0eSBkaXNjcmV0aW9uYXJpZXMgYWZ0ZXIgaHlwaGVucywgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsCisgICAgJSBub3QgZmluZCBhIGxpbmUgYnJlYWsgYXQgYSBoeXBoZW4gaW4gYSBub2RlIG5hbWVzLiAgU2luY2Ugc29tZSBtYW51YWxzCisgICAgJSBhcmUgYmVzdCB3cml0dGVuIHdpdGggZmFpcmx5IGxvbmcgbm9kZSBuYW1lcywgY29udGFpbmluZyBoeXBoZW5zLCB0aGlzCisgICAgJSBpcyBhIGxvc3MuICBUaGVyZWZvcmUsIHdlIGdpdmUgdGhlIHRleHQgb2YgdGhlIG5vZGUgbmFtZSBhZ2Fpbiwgc28gaXQKKyAgICAlIGlzIGFzIGlmIFRlWCBpcyBzZWVpbmcgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgIFxpZmRpbSBcd2QxID4gMHB0CisgICAgICBccHV0d29yZHNlY3Rpb257fSBgYFxwcmludGVkcmVmbmFtZScnIFxwdXR3b3JkaW57fSBcY2l0ZXtccHJpbnRlZG1hbnVhbH0lCisgICAgXGVsc2UKKyAgICAgICUgXyAoZm9yIGV4YW1wbGUpIGhhcyB0byBiZSB0aGUgY2hhcmFjdGVyIF8gZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUKKyAgICAgICUgY29udHJvbCBzZXF1ZW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlLCBidXQgaXQgaGFzIHRvIGV4cGFuZAorICAgICAgJSBpbnRvIHRoZSB1c3VhbCBcbGVhdmV2bW9kZS4uLlx2cnVsZSBzdHVmZiBmb3IgcHVycG9zZXMgb2YKKyAgICAgICUgcHJpbnRpbmcuIFNvIHdlIFx0dXJub2ZmYWN0aXZlIGZvciB0aGUgXHJlZngtc250LCBiYWNrIG9uIGZvciB0aGUKKyAgICAgICUgcHJpbnRpbmcsIGJhY2sgb2ZmIGZvciB0aGUgXHJlZngtcGcuCisgICAgICB7XHR1cm5vZmZhY3RpdmUKKyAgICAgICAlIE9ubHkgb3V0cHV0IGEgZm9sbG93aW5nIHNwYWNlIGlmIHRoZSAtc250IHJlZiBpcyBub25lbXB0eTsgZm9yCisgICAgICAgJSBAdW5udW1iZXJlZCBhbmQgQGFuY2hvciwgaXQgd29uJ3QgYmUuCisgICAgICAgXHNldGJveDIgPSBcaGJveHtcaWdub3Jlc3BhY2VzIFxyZWZ4eyMxLXNudH17fX0lCisgICAgICAgXGlmZGltIFx3ZDIgPiAwcHQgXHJlZnh7IzEtc250fVxzcGFjZVxmaQorICAgICAgfSUKKyAgICAgICUgb3V0cHV0IHRoZSBgW215bm9kZV0nIHZpYSBhIG1hY3JvIHNvIGl0IGNhbiBiZSBvdmVycmlkZGVuLgorICAgICAgXHhyZWZwcmludG5vZGVuYW1lXHByaW50ZWRyZWZuYW1lCisgICAgICAlCisgICAgICAlIEJ1dCB3ZSBhbHdheXMgd2FudCBhIGNvbW1hIGFuZCBhIHNwYWNlOgorICAgICAgLFxzcGFjZQorICAgICAgJQorICAgICAgJSBvdXRwdXQgdGhlIGBwYWdlIDMnLgorICAgICAgXHR1cm5vZmZhY3RpdmUgXHB1dHdvcmRwYWdlXHRpZVxyZWZ4eyMxLXBnfXt9JQorICAgIFxmaQorICBcZmkKKyAgXGVuZGxpbmsKK1xlbmRncm91cH0KKworJSBUaGlzIG1hY3JvIGlzIGNhbGxlZCBmcm9tIFx4cmVmWCBmb3IgdGhlIGBbbm9kZW5hbWVdJyBwYXJ0IG9mIHhyZWYKKyUgb3V0cHV0LiAgSXQncyBhIHNlcGFyYXRlIG1hY3JvIG9ubHkgc28gaXQgY2FuIGJlIGNoYW5nZWQgbW9yZSBlYXNpbHksCislIHNpbmNlIHNxdWFyZSBicmFja2V0cyBkb24ndCB3b3JrIHdlbGwgaW4gc29tZSBkb2N1bWVudHMuICBQYXJ0aWN1bGFybHkKKyUgb25lIHRoYXQgQm9iIGlzIHdvcmtpbmcgb24gOikuCislCitcZGVmXHhyZWZwcmludG5vZGVuYW1lIzF7WyMxXX0KKworJSBUaGluZ3MgcmVmZXJyZWQgdG8gYnkgXHNldHJlZi4KKyUKK1xkZWZcWW5vdGhpbmd7fQorXGRlZlxZb21pdGZyb210b2N7fQorXGRlZlxZbnVtYmVyZWR7JQorICBcaWZudW1cc2Vjbm89MAorICAgIFxwdXR3b3JkQ2hhcHRlckB0aWUgXHRoZVxjaGFwbm8KKyAgXGVsc2UgXGlmbnVtXHN1YnNlY25vPTAKKyAgICBccHV0d29yZFNlY3Rpb25AdGllIFx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8KKyAgXGVsc2UgXGlmbnVtXHN1YnN1YnNlY25vPTAKKyAgICBccHV0d29yZFNlY3Rpb25AdGllIFx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNubworICBcZWxzZQorICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUgXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm8KKyAgXGZpXGZpXGZpCit9CitcZGVmXFlhcHBlbmRpeHslCisgIFxpZm51bVxzZWNubz0wCisgICAgIFxwdXR3b3JkQXBwZW5kaXhAdGllIEBjaGFyXHRoZVxhcHBlbmRpeG5ve30lCisgIFxlbHNlIFxpZm51bVxzdWJzZWNubz0wCisgICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUgQGNoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNubworICBcZWxzZSBcaWZudW1cc3Vic3Vic2Vjbm89MAorICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUgQGNoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vCisgIFxlbHNlCisgICAgXHB1dHdvcmRTZWN0aW9uQHRpZQorICAgICAgQGNoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm8KKyAgXGZpXGZpXGZpCit9CisKKyUgRGVmaW5lIFxyZWZ4e05BTUV9e1NVRkZJWH0gdG8gcmVmZXJlbmNlIGEgY3Jvc3MtcmVmZXJlbmNlIHN0cmluZyBuYW1lZCBOQU1FLgorJSBJZiBpdHMgdmFsdWUgaXMgbm9uZW1wdHksIFNVRkZJWCBpcyBvdXRwdXQgYWZ0ZXJ3YXJkLgorJQorXGRlZlxyZWZ4IzEjMnslCisgIHslCisgICAgXGluZGV4bm9mb250cworICAgIFxvdGhlcmJhY2tzbGFzaAorICAgIFxleHBhbmRhZnRlclxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHRoaXNyZWZYCisgICAgICBcY3NuYW1lIFhSIzFcZW5kY3NuYW1lCisgIH0lCisgIFxpZnhcdGhpc3JlZlhccmVsYXgKKyAgICAlIElmIG5vdCBkZWZpbmVkLCBzYXkgc29tZXRoaW5nIGF0IGxlYXN0LgorICAgIFxhbmdsZWxlZnQgdW5cLWRlXC1maW5lZFxhbmdsZXJpZ2h0CisgICAgXGlmbGlua3MKKyAgICAgIFxpZmhhdmV4cmVmcworICAgICAgICBcbWVzc2FnZXtcbGluZW51bWJlciBVbmRlZmluZWQgY3Jvc3MgcmVmZXJlbmNlIGAjMScufSUKKyAgICAgIFxlbHNlCisgICAgICAgIFxpZndhcm5lZHhyZWZzXGVsc2UKKyAgICAgICAgICBcZ2xvYmFsXHdhcm5lZHhyZWZzdHJ1ZQorICAgICAgICAgIFxtZXNzYWdle0Nyb3NzIHJlZmVyZW5jZSB2YWx1ZXMgdW5rbm93bjsgeW91IG11c3QgcnVuIFRlWCBhZ2Fpbi59JQorICAgICAgICBcZmkKKyAgICAgIFxmaQorICAgIFxmaQorICBcZWxzZQorICAgICUgSXQncyBkZWZpbmVkLCBzbyBqdXN0IHVzZSBpdC4KKyAgICBcdGhpc3JlZlgKKyAgXGZpCisgICMyJSBPdXRwdXQgdGhlIHN1ZmZpeCBpbiBhbnkgY2FzZS4KK30KKworJSBUaGlzIGlzIHRoZSBtYWNybyBpbnZva2VkIGJ5IGVudHJpZXMgaW4gdGhlIGF1eCBmaWxlLiAgVXN1YWxseSBpdCdzCislIGp1c3QgYSBcZGVmICh3ZSBwcmVwZW5kIFhSIHRvIHRoZSBjb250cm9sIHNlcXVlbmNlIG5hbWUgdG8gYXZvaWQKKyUgY29sbGlzaW9ucykuICBCdXQgaWYgdGhpcyBpcyBhIGZsb2F0IHR5cGUsIHdlIGhhdmUgbW9yZSB3b3JrIHRvIGRvLgorJQorXGRlZlx4cmRlZiMxIzJ7JQorICBcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgWFIjMVxlbmRjc25hbWV7IzJ9JSByZW1lbWJlciB0aGlzIHhyZWYgdmFsdWUuCisgICUKKyAgJSBXYXMgdGhhdCB4cmVmIGNvbnRyb2wgc2VxdWVuY2UgdGhhdCB3ZSBqdXN0IGRlZmluZWQgZm9yIGEgZmxvYXQ/CisgIFxleHBhbmRhZnRlclxpZmZsb2F0XGNzbmFtZSBYUiMxXGVuZGNzbmFtZQorICAgICUgaXQgd2FzIGEgZmxvYXQsIGFuZCB3ZSBoYXZlIHRoZSAoc2FmZSkgZmxvYXQgdHlwZSBpbiBcaWZmbG9hdHR5cGUuCisgICAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclxmbG9hdGxpc3QKKyAgICAgIFxjc25hbWUgZmxvYXRsaXN0XGlmZmxvYXR0eXBlXGVuZGNzbmFtZQorICAgICUKKyAgICAlIElzIHRoaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGlzIGZsb2F0IHR5cGU/CisgICAgXGV4cGFuZGFmdGVyXGlmeFxmbG9hdGxpc3RccmVsYXgKKyAgICAgIFx0b2tzMCA9IHtcZG99JSB5ZXMsIHNvIGp1c3QgXGRvCisgICAgXGVsc2UKKyAgICAgICUgaGFkIGl0IGJlZm9yZSwgc28gcHJlc2VydmUgcHJldmlvdXMgZWxlbWVudHMgaW4gbGlzdC4KKyAgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcZmxvYXRsaXN0XGRvfSUKKyAgICBcZmkKKyAgICAlCisgICAgJSBSZW1lbWJlciB0aGlzIHhyZWYgaW4gdGhlIGNvbnRyb2wgc2VxdWVuY2UgXGZsb2F0bGlzdEZMT0FUVFlQRSwKKyAgICAlIGZvciBsYXRlciB1c2UgaW4gXGxpc3RvZmZsb2F0cy4KKyAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgZmxvYXRsaXN0XGlmZmxvYXR0eXBlXGVuZGNzbmFtZXtcdGhlXHRva3MweyMxfX0lCisgIFxmaQorfQorCislIFJlYWQgdGhlIGxhc3QgZXhpc3RpbmcgYXV4IGZpbGUsIGlmIGFueS4gIE5vIGVycm9yIGlmIG5vbmUgZXhpc3RzLgorJQorXGRlZlx0cnlhdXhmaWxleyUKKyAgXG9wZW5pbiAxIFxqb2JuYW1lLmF1eAorICBcaWZlb2YgMSBcZWxzZQorICAgIFxyZWFkZGF0YWZpbGV7YXV4fSUKKyAgICBcZ2xvYmFsXGhhdmV4cmVmc3RydWUKKyAgXGZpCisgIFxjbG9zZWluIDEKK30KKworXGRlZlxzZXR1cGRhdGFmaWxleyUKKyAgXGNhdGNvZGVgXF5eQD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eQT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eQj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eQz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eSD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eSz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eTD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eTj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eWD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eWj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eWz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXz1cb3RoZXIKKyAgJSBJdCB3YXMgc3VnZ2VzdGVkIHRvIHNldCB0aGUgY2F0Y29kZSBvZiBeIHRvIDcsIHdoaWNoIHdvdWxkIGFsbG93IF5eZTQgZXRjLgorICAlIGluIHhyZWYgdGFncywgaS5lLiwgbm9kZSBuYW1lcy4gIEJ1dCBzaW5jZSBeXmU0IG5vdGF0aW9uIGlzbid0CisgICUgc3VwcG9ydGVkIGluIHRoZSBtYWluIHRleHQsIGl0IGRvZXNuJ3Qgc2VlbSBkZXNpcmFibGUuICBGdXJ0aGVybW9yZSwKKyAgJSB0aGF0IGlzIG5vdCBlbm91Z2g6IGZvciBub2RlIG5hbWVzIHRoYXQgYWN0dWFsbHkgY29udGFpbiBhIF4KKyAgJSBjaGFyYWN0ZXIsIHdlIHdvdWxkIGVuZCB1cCB3cml0aW5nIGEgbGluZSBsaWtlIHRoaXM6ICd4cmRlZiB7J2hhdAorICAlIGItdGl0bGV9eydoYXQgYn0gYW5kIFx4cmRlZiBkb2VzIGEgXGNzbmFtZS4uLlxlbmRjc25hbWUgb24gdGhlIGZpcnN0CisgICUgYXJndW1lbnQsIGFuZCBcaGF0IGlzIG5vdCBhbiBleHBhbmRhYmxlIGNvbnRyb2wgc2VxdWVuY2UuICBJdCBjb3VsZAorICAlIGFsbCBiZSB3b3JrZWQgb3V0LCBidXQgd2h5PyAgRWl0aGVyIHdlIHN1cHBvcnQgXl4gb3Igd2UgZG9uJ3QuCisgICUKKyAgJSBUaGUgb3RoZXIgY2hhbmdlIG5lY2Vzc2FyeSBmb3IgdGhpcyB3YXMgdG8gZGVmaW5lIFxhdXhoYXQ6CisgICUgXGRlZlxhdXhoYXR7XGRlZl57J2hhdCB9fSUgZXh0cmEgc3BhY2Ugc28gb2sgaWYgZm9sbG93ZWQgYnkgbGV0dGVyCisgICUgYW5kIHRoZW4gdG8gY2FsbCBcYXV4aGF0IGluIFxzZXRxLgorICAlCisgIFxjYXRjb2RlYFxePVxvdGhlcgorICAlCisgICUgU3BlY2lhbCBjaGFyYWN0ZXJzLiAgU2hvdWxkIGJlIHR1cm5lZCBvZmYgYW55d2F5LCBidXQuLi4KKyAgXGNhdGNvZGVgXH49XG90aGVyCisgIFxjYXRjb2RlYFxbPVxvdGhlcgorICBcY2F0Y29kZWBcXT1cb3RoZXIKKyAgXGNhdGNvZGVgXCI9XG90aGVyCisgIFxjYXRjb2RlYFxfPVxvdGhlcgorICBcY2F0Y29kZWBcfD1cb3RoZXIKKyAgXGNhdGNvZGVgXDw9XG90aGVyCisgIFxjYXRjb2RlYFw+PVxvdGhlcgorICBcY2F0Y29kZWBcJD1cb3RoZXIKKyAgXGNhdGNvZGVgXCM9XG90aGVyCisgIFxjYXRjb2RlYFwmPVxvdGhlcgorICBcY2F0Y29kZWBcJT1cb3RoZXIKKyAgXGNhdGNvZGVgKz1cb3RoZXIgJSBhdm9pZCBcKyBmb3IgcGFyYW5vaWEgZXZlbiB0aG91Z2ggd2UndmUgdHVybmVkIGl0IG9mZgorICAlCisgICUgVGhpcyBpcyB0byBzdXBwb3J0IFwgaW4gbm9kZSBuYW1lcyBhbmQgdGl0bGVzLCBzaW5jZSB0aGUgXAorICAlIGNoYXJhY3RlcnMgZW5kIHVwIGluIGEgXGNzbmFtZS4gIEl0J3MgZWFzaWVyIHRoYW4KKyAgJSBsZWF2aW5nIGl0IGFjdGl2ZSBhbmQgbWFraW5nIGl0cyBhY3RpdmUgZGVmaW5pdGlvbiBhbiBhY3R1YWwgXAorICAlIGNoYXJhY3Rlci4gIFdoYXQgSSBkb24ndCB1bmRlcnN0YW5kIGlzIHdoeSBpdCB3b3JrcyBpbiB0aGUgKnZhbHVlKgorICAlIG9mIHRoZSB4cmRlZi4gIFNlZW1zIGxpa2UgaXQgc2hvdWxkIGJlIGEgY2F0Y29kZTEyIFwsIGFuZCB0aGF0CisgICUgc2hvdWxkIG5vdCB0eXBlc2V0IHByb3Blcmx5LiAgQnV0IGl0IHdvcmtzLCBzbyBJJ20gbW92aW5nIG9uIGZvcgorICAlIG5vdy4gIC0ta2FybCwgMTVqYW4wNC4KKyAgXGNhdGNvZGVgXFw9XG90aGVyCisgICUKKyAgJSBNYWtlIHRoZSBjaGFyYWN0ZXJzIDEyOC0yNTUgYmUgcHJpbnRpbmcgY2hhcmFjdGVycy4KKyAgeyUKKyAgICBcY291bnQxPTEyOAorICAgIFxkZWZcbG9vcHslCisgICAgICBcY2F0Y29kZVxjb3VudDE9XG90aGVyCisgICAgICBcYWR2YW5jZVxjb3VudDEgYnkgMQorICAgICAgXGlmbnVtIFxjb3VudDE8MjU2IFxsb29wIFxmaQorICAgIH0lCisgIH0lCisgICUKKyAgJSBAIGlzIG91ciBlc2NhcGUgY2hhcmFjdGVyIGluIC5hdXggZmlsZXMsIGFuZCB3ZSBuZWVkIGJyYWNlcy4KKyAgXGNhdGNvZGVgXHs9MQorICBcY2F0Y29kZWBcfT0yCisgIFxjYXRjb2RlYFxAPTAKK30KKworXGRlZlxyZWFkZGF0YWZpbGUjMXslCitcYmVnaW5ncm91cAorICBcc2V0dXBkYXRhZmlsZQorICBcaW5wdXRcam9ibmFtZS4jMQorXGVuZGdyb3VwfQorCitcbWVzc2FnZXtpbnNlcnRpb25zLH0KKyUgaW5jbHVkaW5nIGZvb3Rub3Rlcy4KKworXG5ld2NvdW50IFxmb290bm90ZW5vCisKKyUgVGhlIHRyYWlsaW5nIHNwYWNlIGluIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBmb3Igc3VwZXJlamVjdCBpcworJSB2aXRhbCBmb3IgcHJvcGVyIGZpbGxpbmc7IHBhZ2VzIGNvbWUgb3V0IHVuYWxpZ25lZCB3aGVuIHlvdSBkbyBhCislIHBhZ2VhbGlnbm1hY3JvIGNhbGwgaWYgdGhhdCBzcGFjZSBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2UgaXMKKyUgcmVtb3ZlZC4gKEdlbmVyYWxseSwgbnVtZXJpYyBjb25zdGFudHMgc2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSBhCislIHNwYWNlIHRvIHByZXZlbnQgc3RyYW5nZSBleHBhbnNpb24gZXJyb3JzLikKK1xkZWZcc3VwZXJlamVjdHtccGFyXHBlbmFsdHkgLTIwMDAwXGZvb3Rub3Rlbm8gPTAgfQorCislIEBmb290bm90ZXN0eWxlIGlzIG1lYW5pbmdmdWwgZm9yIGluZm8gb3V0cHV0IG9ubHkuCitcbGV0XGZvb3Rub3Rlc3R5bGU9XGNvbW1lbnQKKwore1xjYXRjb2RlIGBcQD0xMQorJQorJSBBdXRvLW51bWJlciBmb290bm90ZXMuICBPdGhlcndpc2UgbGlrZSBwbGFpbi4KK1xnZGVmXGZvb3Rub3RleyUKKyAgXGxldFxpbmRlbnQ9XHB0ZXhpbmRlbnQKKyAgXGxldFxub2luZGVudD1ccHRleG5vaW5kZW50CisgIFxnbG9iYWxcYWR2YW5jZVxmb290bm90ZW5vIGJ5IFxAbmUKKyAgXGVkZWZcdGhpc2Zvb3Rub3skXntcdGhlXGZvb3Rub3Rlbm99JH0lCisgICUKKyAgJSBJbiBjYXNlIHRoZSBmb290bm90ZSBjb21lcyBhdCB0aGUgZW5kIG9mIGEgc2VudGVuY2UsIHByZXNlcnZlIHRoZQorICAlIGV4dHJhIHNwYWNpbmcgYWZ0ZXIgd2UgZG8gdGhlIGZvb3Rub3RlIG51bWJlci4KKyAgXGxldFxAc2ZcZW1wdHkKKyAgXGlmaG1vZGVcZWRlZlxAc2Z7XHNwYWNlZmFjdG9yXHRoZVxzcGFjZWZhY3Rvcn1ccHRleHNsYXNoXGZpCisgICUKKyAgJSBSZW1vdmUgaW5hZHZlcnRlbnQgYmxhbmsgc3BhY2UgYmVmb3JlIHR5cGVzZXR0aW5nIHRoZSBmb290bm90ZSBudW1iZXIuCisgIFx1bnNraXAKKyAgXHRoaXNmb290bm9cQHNmCisgIFxkb2Zvb3Rub3RlCit9JQorCislIERvbid0IGJvdGhlciB3aXRoIHRoZSB0cmlja2VyeSBpbiBwbGFpbi50ZXggdG8gbm90IHJlcXVpcmUgdGhlCislIGZvb3Rub3RlIHRleHQgYXMgYSBwYXJhbWV0ZXIuICBPdXIgZm9vdG5vdGVzIGRvbid0IG5lZWQgdG8gYmUgc28gZ2VuZXJhbC4KKyUKKyUgT2ggeWVzLCB0aGV5IGRvOyBvdGhlcndpc2UsIEBpZnNldCAoYW5kIGFueXRoaW5nIGVsc2UgdGhhdCB1c2VzCislIFxwYXJzZWFyZ2xpbmUpIGZhaWxzIGluc2lkZSBmb290bm90ZXMgYmVjYXVzZSB0aGUgdG9rZW5zIGFyZSBmaXhlZCB3aGVuCislIHRoZSBmb290bm90ZSBpcyByZWFkLiAgLS1rYXJsLCAxNm5vdjk2LgorJQorXGdkZWZcZG9mb290bm90ZXslCisgIFxpbnNlcnRcZm9vdGluc1xiZ3JvdXAKKyAgJSBXZSB3YW50IHRvIHR5cGVzZXQgdGhpcyB0ZXh0IGFzIGEgbm9ybWFsIHBhcmFncmFwaCwgZXZlbiBpZiB0aGUKKyAgJSBmb290bm90ZSByZWZlcmVuY2Ugb2NjdXJzIGluIChmb3IgZXhhbXBsZSkgYSBkaXNwbGF5IGVudmlyb25tZW50LgorICAlIFNvIHJlc2V0IHNvbWUgcGFyYW1ldGVycy4KKyAgXGhzaXplPVxwYWdld2lkdGgKKyAgXGludGVybGluZXBlbmFsdHlcaW50ZXJmb290bm90ZWxpbmVwZW5hbHR5CisgIFxzcGxpdHRvcHNraXBcaHRcc3RydXRib3ggJSB0b3AgYmFzZWxpbmUgZm9yIGJyb2tlbiBmb290bm90ZXMKKyAgXHNwbGl0bWF4ZGVwdGhcZHBcc3RydXRib3gKKyAgXGZsb2F0aW5ncGVuYWx0eVxATU0KKyAgXGxlZnRza2lwXHpAc2tpcAorICBccmlnaHRza2lwXHpAc2tpcAorICBcc3BhY2Vza2lwXHpAc2tpcAorICBceHNwYWNlc2tpcFx6QHNraXAKKyAgXHBhcmluZGVudFxkZWZhdWx0cGFyaW5kZW50CisgICUKKyAgXHNtYWxsZm9udHMgXHJtCisgICUKKyAgJSBCZWNhdXNlIHdlIHVzZSBoYW5naW5nIGluZGVudGF0aW9uIGluIGZvb3Rub3RlcywgYSBAbm9pbmRlbnQgYXBwZWFycworICAlIHRvIGV4ZGVudCB0aGlzIHRleHQsIHNvIG1ha2UgaXQgYmUgYSBuby1vcC4gIG1ha2VpbmZvIGRvZXMgbm90IHVzZQorICAlIGhhbmdpbmcgaW5kZW50YXRpb24gc28gQG5vaW5kZW50IGNhbiBzdGlsbCBiZSBuZWVkZWQgd2l0aGluIGZvb3Rub3RlCisgICUgdGV4dCBhZnRlciBhbiBAZXhhbXBsZSBvciB0aGUgbGlrZSAobm90IHRoYXQgdGhpcyBpcyBnb29kIHN0eWxlKS4KKyAgXGxldFxub2luZGVudCA9IFxyZWxheAorICAlCisgICUgSGFuZyB0aGUgZm9vdG5vdGUgdGV4dCBvZmYgdGhlIG51bWJlci4gIFVzZSBcZXZlcnlwYXIgaW4gY2FzZSB0aGUKKyAgJSBmb290bm90ZSBleHRlbmRzIGZvciBtb3JlIHRoYW4gb25lIHBhcmFncmFwaC4KKyAgXGV2ZXJ5cGFyID0ge1xoYW5nfSUKKyAgXHRleHRpbmRlbnR7XHRoaXNmb290bm99JQorICAlCisgICUgRG9uJ3QgY3Jhc2ggaW50byB0aGUgbGluZSBhYm92ZSB0aGUgZm9vdG5vdGUgdGV4dC4gIFNpbmNlIHRoaXMKKyAgJSBleHBhbmRzIGludG8gYSBib3gsIGl0IG11c3QgY29tZSB3aXRoaW4gdGhlIHBhcmFncmFwaCwgbGVzdCBpdAorICAlIHByb3ZpZGUgYSBwbGFjZSB3aGVyZSBUZVggY2FuIHNwbGl0IHRoZSBmb290bm90ZS4KKyAgXGZvb3RzdHJ1dAorICBcZnV0dXJlbGV0XG5leHRcZm9AdAorfQorfSVlbmQgXGNhdGNvZGUgYFxAPTExCisKKyUgSW4gY2FzZSBhIEBmb290bm90ZSBhcHBlYXJzIGluIGEgdmJveCwgc2F2ZSB0aGUgZm9vdG5vdGUgdGV4dCBhbmQgY3JlYXRlCislIHRoZSByZWFsIFxpbnNlcnQganVzdCBhZnRlciB0aGUgdmJveCBmaW5pc2hlZC4gIE90aGVyd2lzZSwgdGhlIGluc2VydGlvbgorJSB3b3VsZCBiZSBsb3N0LgorJSBTaW1pbGFyaWx5LCBpZiBhIEBmb290bm90ZSBhcHBlYXJzIGluc2lkZSBhbiBhbGlnbm1lbnQsIHNhdmUgdGhlIGZvb3Rub3RlCislIHRleHQgdG8gYSBib3ggYW5kIG1ha2UgdGhlIFxpbnNlcnQgd2hlbiBhIHJvdyBvZiB0aGUgdGFibGUgaXMgZmluaXNoZWQuCislIEFuZCB0aGUgc2FtZSBjYW4gYmUgZG9uZSBmb3Igb3RoZXIgaW5zZXJ0IGNsYXNzZXMuICAtLWthc2FsLCAxNm5vdjAzLgorCislIFJlcGxhY2UgdGhlIFxpbnNlcnQgcHJpbWl0aXZlIGJ5IGEgY2hlYXRpbmcgbWFjcm8uCislIERlZXBlciBpbnNpZGUsIGp1c3QgbWFrZSBzdXJlIHRoYXQgdGhlIHNhdmVkIGluc2VydGlvbnMgYXJlIG5vdCBzcGlsbGVkCislIG91dCBwcmVtYXR1cmVseS4KKyUKK1xkZWZcc3RhcnRzYXZpbmdpbnNlcnRzeyUKKyAgXGlmeCBcaW5zZXJ0XHB0ZXhpbnNlcnQKKyAgICBcbGV0XGluc2VydFxzYXZlaW5zZXJ0CisgIFxlbHNlCisgICAgXGxldFxjaGVja2luc2VydHNccmVsYXgKKyAgXGZpCit9CisKKyUgVGhpcyBcaW5zZXJ0IHJlcGxhY2VtZW50IHdvcmtzIGZvciBib3RoIFxpbnNlcnRcZm9vdGluc3tmb299IGFuZAorJSBcaW5zZXJ0XGZvb3RpbnNcYmdyb3VwIGZvb1xlZ3JvdXAsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgZm9yIFxpbnNlcnQyN3tmb299LgorJQorXGRlZlxzYXZlaW5zZXJ0IzF7JQorICBcZWRlZlxuZXh0e1xub2V4cGFuZFxzYXZldG9ib3ggXG1ha2VTQVZFbmFtZSMxfSUKKyAgXGFmdGVyYXNzaWdubWVudFxuZXh0CisgICUgc3dhbGxvdyB0aGUgbGVmdCBicmFjZQorICBcbGV0XHRlbXAgPQorfQorXGRlZlxtYWtlU0FWRW5hbWUjMXtcbWFrZWNzbmFtZXtTQVZFXGV4cGFuZGFmdGVyXGdvYmJsZVxzdHJpbmcjMX19CitcZGVmXHNhdmV0b2JveCMxe1xnbG9iYWxcc2V0Ym94IzEgPSBcdmJveFxiZ3JvdXAgXHVudmJveCMxfQorCitcZGVmXGNoZWNrc2F2ZWlucyMxe1xpZnZvaWQjMVxlbHNlIFxwbGFjZXNhdmVpbnMjMVxmaX0KKworXGRlZlxwbGFjZXNhdmVpbnMjMXslCisgIFxwdGV4aW5zZXJ0IFxjc25hbWVcZXhwYW5kYWZ0ZXJcZ29iYmxlc2F2ZVxzdHJpbmcjMVxlbmRjc25hbWUKKyAgICB7XGJveCMxfSUKK30KKworJSBlYXQgQFNBVkUgLS0gYmV3YXJlLCBhbGwgb2YgdGhlbSBoYXZlIGNhdGNvZGUgXG90aGVyOgoreworICBcZGVmXGRvc3BlY2lhbHN7XGRvIFNcZG8gQVxkbyBWXGRvIEV9IFx1bmNhdGNvZGVzcGVjaWFscyAgJSAgOy0pCisgIFxnZGVmXGdvYmJsZXNhdmUgQFNBVkV7fQorfQorCislIGluaXRpYWxpemF0aW9uOgorXGRlZlxuZXdzYXZlaW5zICMxeyUKKyAgXGVkZWZcbmV4dHtcbm9leHBhbmRcbmV3c2F2ZWluc1ggXG1ha2VTQVZFbmFtZSMxfSUKKyAgXG5leHQKK30KK1xkZWZcbmV3c2F2ZWluc1ggIzF7JQorICBcY3NuYW1lIG5ld2JveFxlbmRjc25hbWUgIzElCisgIFxleHBhbmRhZnRlclxkZWZcZXhwYW5kYWZ0ZXJcY2hlY2tpbnNlcnRzXGV4cGFuZGFmdGVye1xjaGVja2luc2VydHMKKyAgICBcY2hlY2tzYXZlaW5zICMxfSUKK30KKworJSBpbml0aWFsaXplOgorXGxldFxjaGVja2luc2VydHNcZW1wdHkKK1xuZXdzYXZlaW5zXGZvb3RpbnMKK1xuZXdzYXZlaW5zXG1hcmdpbgorCisKKyUgQGltYWdlLiAgV2UgdXNlIHRoZSBtYWNyb3MgZnJvbSBlcHNmLnRleCB0byBzdXBwb3J0IHRoaXMuCislIElmIGVwc2YudGV4IGlzIG5vdCBpbnN0YWxsZWQgYW5kIEBpbWFnZSBpcyB1c2VkLCB3ZSBjb21wbGFpbi4KKyUKKyUgQ2hlY2sgZm9yIGFuZCByZWFkIGVwc2YudGV4IHVwIGZyb250LiAgSWYgd2UgcmVhZCBpdCBvbmx5IGF0IEBpbWFnZQorJSB0aW1lLCB3ZSBtaWdodCBiZSBpbnNpZGUgYSBncm91cCwgYW5kIHRoZW4gaXRzIGRlZmluaXRpb25zIHdvdWxkIGdldAorJSB1bmRvbmUgYW5kIHRoZSBuZXh0IGltYWdlIHdvdWxkIGZhaWwuCitcb3BlbmluIDEgPSBlcHNmLnRleAorXGlmZW9mIDEgXGVsc2UKKyAgJSBEbyBub3QgYm90aGVyIHNob3dpbmcgYmFubmVyIHdpdGggZXBzZi50ZXggdjIuN2sgKGF2YWlsYWJsZSBpbgorICAlIGRvYy9lcHNmLnRleCBhbmQgb24gY3RhbikuCisgIFxkZWZcZXBzZmFubm91bmNle1x0b2tzMCA9IH0lCisgIFxpbnB1dCBlcHNmLnRleAorXGZpCitcY2xvc2VpbiAxCislCislIFdlIHdpbGwgb25seSBjb21wbGFpbiBvbmNlIGFib3V0IGxhY2sgb2YgZXBzZi50ZXguCitcbmV3aWZcaWZ3YXJuZWRub2Vwc2YKK1xuZXdoZWxwXG5vZXBzZmhlbHB7ZXBzZi50ZXggbXVzdCBiZSBpbnN0YWxsZWQgZm9yIGltYWdlcyB0bworICB3b3JrLiAgSXQgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgVGV4aW5mbyBkaXN0cmlidXRpb24sIG9yIHlvdSBjYW4gZ2V0CisgIGl0IGZyb20gZnRwOi8vdHVnLm9yZy90ZXgvZXBzZi50ZXgufQorJQorXGRlZlxpbWFnZSMxeyUKKyAgXGlmeFxlcHNmYm94XHVuZGVmaW5lZAorICAgIFxpZndhcm5lZG5vZXBzZiBcZWxzZQorICAgICAgXGVycmhlbHAgPSBcbm9lcHNmaGVscAorICAgICAgXGVycm1lc3NhZ2V7ZXBzZi50ZXggbm90IGZvdW5kLCBpbWFnZXMgd2lsbCBiZSBpZ25vcmVkfSUKKyAgICAgIFxnbG9iYWxcd2FybmVkbm9lcHNmdHJ1ZQorICAgIFxmaQorICBcZWxzZQorICAgIFxpbWFnZXh4eCAjMSwsLCwsXGZpbmlzaAorICBcZmkKK30KKyUKKyUgQXJndW1lbnRzIHRvIEBpbWFnZToKKyUgIzEgaXMgKG1hbmRhdG9yeSkgaW1hZ2UgZmlsZW5hbWU7IHdlIHRhY2sgb24gLmVwcyBleHRlbnNpb24uCislICMyIGlzIChvcHRpb25hbCkgd2lkdGgsICMzIGlzIChvcHRpb25hbCkgaGVpZ2h0LgorJSAjNCBpcyAoaWdub3JlZCBvcHRpb25hbCkgaHRtbCBhbHQgdGV4dC4KKyUgIzUgaXMgKGlnbm9yZWQgb3B0aW9uYWwpIGV4dGVuc2lvbi4KKyUgIzYgaXMganVzdCB0aGUgdXN1YWwgZXh0cmEgaWdub3JlZCBhcmcgZm9yIHBhcnNpbmcgdGhpcyBzdHVmZi4KK1xuZXdpZlxpZmltYWdldm1vZGUKK1xkZWZcaW1hZ2V4eHgjMSwjMiwjMywjNCwjNSwjNlxmaW5pc2h7XGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXF5eTSA9IDUgICAgICUgaW4gY2FzZSB3ZSdyZSBpbnNpZGUgYW4gZXhhbXBsZQorICBcbm9ybWFsdHVybm9mZmFjdGl2ZSAgJSBhbGxvdyBfIGV0IGFsLiBpbiBuYW1lcworICAlIElmIHRoZSBpbWFnZSBpcyBieSBpdHNlbGYsIGNlbnRlciBpdC4KKyAgXGlmdm1vZGUKKyAgICBcaW1hZ2V2bW9kZXRydWUKKyAgICBcbm9icmVha1xiaWdza2lwCisgICAgJSBVc3VhbGx5IHdlJ2xsIGhhdmUgdGV4dCBhZnRlciB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBpbnNlcnQKKyAgICAlIFxwYXJza2lwIGdsdWUsIHNvIGluc2VydCBpdCBoZXJlIHRvbyB0byBlcXVhbGl6ZSB0aGUgc3BhY2UKKyAgICAlIGFib3ZlIGFuZCBiZWxvdy4KKyAgICBcbm9icmVha1x2c2tpcFxwYXJza2lwCisgICAgXG5vYnJlYWsKKyAgICBcbGluZVxiZ3JvdXAKKyAgXGZpCisgICUKKyAgJSBPdXRwdXQgdGhlIGltYWdlLgorICBcaWZwZGYKKyAgICBcZG9wZGZpbWFnZXsjMX17IzJ9eyMzfSUKKyAgXGVsc2UKKyAgICAlIFxlcHNmYm94IGl0c2VsZiByZXNldHMgXGVwc2Y/c2l6ZSBhdCBlYWNoIGZpZ3VyZS4KKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnhzaXplPSMyXHJlbGF4IFxmaQorICAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjM31caWZkaW1cd2QwID4gMHB0IFxlcHNmeXNpemU9IzNccmVsYXggXGZpCisgICAgXGVwc2Zib3h7IzEuZXBzfSUKKyAgXGZpCisgICUKKyAgXGlmaW1hZ2V2bW9kZSBcZWdyb3VwIFxiaWdicmVhayBcZmkgICUgc3BhY2UgYWZ0ZXIgdGhlIGltYWdlCitcZW5kZ3JvdXB9CisKKworJSBAZmxvYXQgRkxPQVRUWVBFLExBQkVMLExPQyAuLi4gQGVuZCBmbG9hdCBmb3IgZGlzcGxheWVkIGZpZ3VyZXMsIHRhYmxlcywKKyUgZXRjLiAgV2UgZG9uJ3QgYWN0dWFsbHkgaW1wbGVtZW50IGZsb2F0aW5nIHlldCwgd2UgYWx3YXlzIGluY2x1ZGUgdGhlCislIGZsb2F0ICJoZXJlIi4gIEJ1dCBpdCBzZWVtZWQgdGhlIGJlc3QgbmFtZSBmb3IgdGhlIGZ1dHVyZS4KKyUKK1xlbnZwYXJzZWFyZ2RlZlxmbG9hdHtcZWF0Y29tbWFzcGFjZVxlYXRjb21tYXNwYWNlXGRvZmxvYXQjMSwgLCAsXGZpbmlzaH0KKworJSBUaGVyZSBtYXkgYmUgYSBzcGFjZSBiZWZvcmUgc2Vjb25kIGFuZC9vciB0aGlyZCBwYXJhbWV0ZXI7IGRlbGV0ZSBpdC4KK1xkZWZcZWF0Y29tbWFzcGFjZSMxLCB7IzEsfQorCislICMxIGlzIHRoZSBvcHRpb25hbCBGTE9BVFRZUEUsIHRoZSB0ZXh0IGxhYmVsIGZvciB0aGlzIGZsb2F0LCB0eXBpY2FsbHkKKyUgIkZpZ3VyZSIsICJUYWJsZSIsICJFeGFtcGxlIiwgZXRjLiAgQ2FuJ3QgY29udGFpbiBjb21tYXMuICBJZiBvbWl0dGVkLAorJSB0aGlzIGZsb2F0IHdpbGwgbm90IGJlIG51bWJlcmVkIGFuZCBjYW5ub3QgYmUgcmVmZXJyZWQgdG8uCislCislICMyIGlzIHRoZSBvcHRpb25hbCB4cmVmIGxhYmVsLiAgQWxzbyBtdXN0IGJlIHByZXNlbnQgZm9yIHRoZSBmbG9hdCB0bworJSBiZSByZWZlcmFibGUuCislCislICMzIGlzIHRoZSBvcHRpb25hbCBwb3NpdGlvbmluZyBhcmd1bWVudDsgZm9yIG5vdywgaXQgaXMgaWdub3JlZC4gIEl0CislIHdpbGwgc29tZWhvdyBzcGVjaWZ5IHRoZSBwb3NpdGlvbnMgYWxsb3dlZCB0byBmbG9hdCB0byAoaGVyZSwgdG9wLCBib3R0b20pLgorJQorJSBXZSBrZWVwIGEgc2VwYXJhdGUgY291bnRlciBmb3IgZWFjaCBGTE9BVFRZUEUsIHdoaWNoIHdlIHJlc2V0IGF0IGVhY2gKKyUgY2hhcHRlci1sZXZlbCBjb21tYW5kLgorXGxldFxyZXNldGFsbGZsb2F0bm9zPVxlbXB0eQorJQorXGRlZlxkb2Zsb2F0IzEsIzIsIzMsIzRcZmluaXNoeyUKKyAgXGxldFx0aGlzY2FwdGlvbj1cZW1wdHkKKyAgXGxldFx0aGlzc2hvcnRjYXB0aW9uPVxlbXB0eQorICAlCisgICUgZG9uJ3QgbG9zZSBmb290bm90ZXMgaW5zaWRlIEBmbG9hdC4KKyAgJQorICAlIEJFV0FSRTogd2hlbiB0aGUgZmxvYXRzIHN0YXJ0IGZsb2F0LCB3ZSBoYXZlIHRvIGlzc3VlIHdhcm5pbmcgd2hlbmV2ZXIgYW4KKyAgJSBpbnNlcnQgYXBwZWFycyBpbnNpZGUgYSBmbG9hdCB3aGljaCBjb3VsZCBwb3NzaWJseSBmbG9hdC4gLS1rYXNhbCwgMjZtYXkwNAorICAlCisgIFxzdGFydHNhdmluZ2luc2VydHMKKyAgJQorICAlIFdlIGNhbid0IGJlIHVzZWQgaW5zaWRlIGEgcGFyYWdyYXBoLgorICBccGFyCisgICUKKyAgXHZ0b3BcYmdyb3VwCisgICAgXGRlZlxmbG9hdHR5cGV7IzF9JQorICAgIFxkZWZcZmxvYXRsYWJlbHsjMn0lCisgICAgXGRlZlxmbG9hdGxvY3sjM30lIHdlIGRvIG5vdGhpbmcgd2l0aCB0aGlzIHlldC4KKyAgICAlCisgICAgXGlmeFxmbG9hdHR5cGVcZW1wdHkKKyAgICAgIFxsZXRcc2FmZWZsb2F0dHlwZT1cZW1wdHkKKyAgICBcZWxzZQorICAgICAgeyUKKyAgICAgICAgJSB0aGUgZmxvYXR0eXBlIG1pZ2h0IGhhdmUgYWNjZW50cyBvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMsCisgICAgICAgICUgYnV0IHdlIG5lZWQgdG8gdXNlIGl0IGluIGEgY29udHJvbCBzZXF1ZW5jZSBuYW1lLgorICAgICAgICBcaW5kZXhub2ZvbnRzCisgICAgICAgIFx0dXJub2ZmYWN0aXZlCisgICAgICAgIFx4ZGVmXHNhZmVmbG9hdHR5cGV7XGZsb2F0dHlwZX0lCisgICAgICB9JQorICAgIFxmaQorICAgICUKKyAgICAlIElmIGxhYmVsIGlzIGdpdmVuIGJ1dCBubyB0eXBlLCB3ZSBoYW5kbGUgdGhhdCBhcyB0aGUgZW1wdHkgdHlwZS4KKyAgICBcaWZ4XGZsb2F0bGFiZWxcZW1wdHkgXGVsc2UKKyAgICAgICUgV2Ugd2FudCBlYWNoIEZMT0FUVFlQRSB0byBiZSBudW1iZXJlZCBzZXBhcmF0ZWx5IChGaWd1cmUgMSwKKyAgICAgICUgVGFibGUgMSwgRmlndXJlIDIsIC4uLikuICAoQW5kIGlmIG5vIGxhYmVsLCBubyBudW1iZXIuKQorICAgICAgJQorICAgICAgXGV4cGFuZGFmdGVyXGdldGZsb2F0bm9cY3NuYW1lXHNhZmVmbG9hdHR5cGUgZmxvYXRub1xlbmRjc25hbWUKKyAgICAgIFxnbG9iYWxcYWR2YW5jZVxmbG9hdG5vIGJ5IDEKKyAgICAgICUKKyAgICAgIHslCisgICAgICAgICUgVGhpcyBtYWdpYyB2YWx1ZSBmb3IgXHRoaXNzZWN0aW9uIGlzIG91dHB1dCBieSBcc2V0cmVmIGFzIHRoZQorICAgICAgICAlIFhSRUZMQUJFTC10aXRsZSB2YWx1ZS4gIFx4cmVmWCB1c2VzIGl0IHRvIGRpc3Rpbmd1aXNoIGZsb2F0CisgICAgICAgICUgbGFiZWxzICh3aGljaCBoYXZlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdCkgZnJvbQorICAgICAgICAlIG5vZGUgYW5kIGFuY2hvciBsYWJlbHMuICBBbmQgXHhyZGVmIHVzZXMgaXQgdG8gY29uc3RydWN0IHRoZQorICAgICAgICAlIGxpc3RzIG9mIGZsb2F0cy4KKyAgICAgICAgJQorICAgICAgICBcZWRlZlx0aGlzc2VjdGlvbntcZmxvYXRtYWdpYz1cc2FmZWZsb2F0dHlwZX0lCisgICAgICAgIFxzZXRyZWZ7XGZsb2F0bGFiZWx9e1lmbG9hdH0lCisgICAgICB9JQorICAgIFxmaQorICAgICUKKyAgICAlIHN0YXJ0IHdpdGggXHBhcnNraXAgZ2x1ZSwgSSBndWVzcy4KKyAgICBcdnNraXBccGFyc2tpcAorICAgICUKKyAgICAlIERvbid0IHN1cHByZXNzIGluZGVudGF0aW9uIGlmIGEgZmxvYXQgaGFwcGVucyB0byBzdGFydCBhIHNlY3Rpb24uCisgICAgXHJlc3RvcmVmaXJzdHBhcmFncmFwaGluZGVudAorfQorCislIHdlIGhhdmUgdGhlc2UgcG9zc2liaWxpdGllczoKKyUgQGZsb2F0IEZvbyxsYmwgJiBAY2FwdGlvbntDYXB9OiBGb28gMS4xOiBDYXAKKyUgQGZsb2F0IEZvbyxsYmwgJiBubyBjYXB0aW9uOiAgICBGb28gMS4xCislIEBmbG9hdCBGb28gJiBAY2FwdGlvbntDYXB9OiAgICAgRm9vOiBDYXAKKyUgQGZsb2F0IEZvbyAmIG5vIGNhcHRpb246ICAgICAgICBGb28KKyUgQGZsb2F0ICxsYmwgJiBDYXB0aW9ue0NhcH06ICAgICAxLjE6IENhcAorJSBAZmxvYXQgLGxibCAmIG5vIGNhcHRpb246ICAgICAgIDEuMQorJSBAZmxvYXQgJiBAY2FwdGlvbntDYXB9OiAgICAgICAgIENhcAorJSBAZmxvYXQgJiBubyBjYXB0aW9uOgorJQorXGRlZlxFZmxvYXR7JQorICAgIFxsZXRcZmxvYXRpZGVudCA9IFxlbXB0eQorICAgICUKKyAgICAlIEluIGFsbCBjYXNlcywgaWYgd2UgaGF2ZSBhIGZsb2F0IHR5cGUsIGl0IGNvbWVzIGZpcnN0LgorICAgIFxpZnhcZmxvYXR0eXBlXGVtcHR5IFxlbHNlIFxkZWZcZmxvYXRpZGVudHtcZmxvYXR0eXBlfVxmaQorICAgICUKKyAgICAlIElmIHdlIGhhdmUgYW4geHJlZiBsYWJlbCwgdGhlIG51bWJlciBjb21lcyBuZXh0LgorICAgIFxpZnhcZmxvYXRsYWJlbFxlbXB0eSBcZWxzZQorICAgICAgXGlmeFxmbG9hdHR5cGVcZW1wdHkgXGVsc2UgJSBpZiBhbHNvIGhhZCBmbG9hdCB0eXBlLCBuZWVkIHRpZSBmaXJzdC4KKyAgICAgICAgXGFwcGVuZHRvbWFjcm9cZmxvYXRpZGVudHtcdGllfSUKKyAgICAgIFxmaQorICAgICAgJSB0aGUgbnVtYmVyLgorICAgICAgXGFwcGVuZHRvbWFjcm9cZmxvYXRpZGVudHtcY2hhcGxldmVscHJlZml4XHRoZVxmbG9hdG5vfSUKKyAgICBcZmkKKyAgICAlCisgICAgJSBTdGFydCB0aGUgcHJpbnRlZCBjYXB0aW9uIHdpdGggd2hhdCB3ZSd2ZSBjb25zdHJ1Y3RlZCBpbgorICAgICUgXGZsb2F0aWRlbnQsIGJ1dCBrZWVwIGl0IHNlcGFyYXRlOyB3ZSBuZWVkIFxmbG9hdGlkZW50IGFnYWluLgorICAgIFxsZXRcY2FwdGlvbmxpbmUgPSBcZmxvYXRpZGVudAorICAgICUKKyAgICBcaWZ4XHRoaXNjYXB0aW9uXGVtcHR5IFxlbHNlCisgICAgICBcaWZ4XGZsb2F0aWRlbnRcZW1wdHkgXGVsc2UKKwlcYXBwZW5kdG9tYWNyb1xjYXB0aW9ubGluZXs6IH0lIGhhZCBpZGVudCwgc28gbmVlZCBhIGNvbG9uIGJldHdlZW4KKyAgICAgIFxmaQorICAgICAgJQorICAgICAgJSBjYXB0aW9uIHRleHQuCisgICAgICBcYXBwZW5kdG9tYWNyb1xjYXB0aW9ubGluZXtcc2NhbmV4cFx0aGlzY2FwdGlvbn0lCisgICAgXGZpCisgICAgJQorICAgICUgSWYgd2UgaGF2ZSBhbnl0aGluZyB0byBwcmludCwgcHJpbnQgaXQsIHdpdGggc3BhY2UgYmVmb3JlLgorICAgICUgRXZlbnR1YWxseSB0aGlzIG5lZWRzIHRvIGJlY29tZSBhbiBcaW5zZXJ0LgorICAgIFxpZnhcY2FwdGlvbmxpbmVcZW1wdHkgXGVsc2UKKyAgICAgIFx2c2tpcC41XHBhcnNraXAKKyAgICAgIFxjYXB0aW9ubGluZQorICAgICAgJQorICAgICAgJSBTcGFjZSBiZWxvdyBjYXB0aW9uLgorICAgICAgXHZza2lwXHBhcnNraXAKKyAgICBcZmkKKyAgICAlCisgICAgJSBJZiBoYXZlIGFuIHhyZWYgbGFiZWwsIHdyaXRlIHRoZSBsaXN0IG9mIGZsb2F0cyBpbmZvLiAgRG8gdGhpcworICAgICUgYWZ0ZXIgdGhlIGNhcHRpb24sIHRvIGF2b2lkIGNoYW5jZSBvZiBpdCBiZWluZyBhIGJyZWFrcG9pbnQuCisgICAgXGlmeFxmbG9hdGxhYmVsXGVtcHR5IFxlbHNlCisgICAgICAlIFdyaXRlIHRoZSB0ZXh0IHRoYXQgZ29lcyBpbiB0aGUgbG9mIHRvIHRoZSBhdXggZmlsZSBhcworICAgICAgJSBcZmxvYXRsYWJlbC1sb2YuICBCZXNpZGVzIFxmbG9hdGlkZW50LCB3ZSBpbmNsdWRlIHRoZSBzaG9ydAorICAgICAgJSBjYXB0aW9uIGlmIHNwZWNpZmllZCwgZWxzZSB0aGUgZnVsbCBjYXB0aW9uIGlmIHNwZWNpZmllZCwgZWxzZSBub3RoaW5nLgorICAgICAgeyUKKyAgICAgICAgXGF0ZHVtbWllcworICAgICAgICAlCisgICAgICAgICUgc2luY2Ugd2UgcmVhZCB0aGUgY2FwdGlvbiB0ZXh0IGluIHRoZSBtYWNybyB3b3JsZCwgd2hlcmUgXl5NCisgICAgICAgICUgaXMgdHVybmVkIGludG8gYSBub3JtYWwgY2hhcmFjdGVyLCB3ZSBoYXZlIHRvIHNjYW4gaXQgYmFjaywgc28KKyAgICAgICAgJSB3ZSBkb24ndCB3cml0ZSB0aGUgbGl0ZXJhbCB0aHJlZSBjaGFyYWN0ZXJzICJeXk0iIGludG8gdGhlIGF1eCBmaWxlLgorCVxzY2FuZXhweyUKKwkgIFx4ZGVmXG5vZXhwYW5kXGd0ZW1weyUKKwkgICAgXGlmeFx0aGlzc2hvcnRjYXB0aW9uXGVtcHR5CisJICAgICAgXHRoaXNjYXB0aW9uCisJICAgIFxlbHNlCisJICAgICAgXHRoaXNzaG9ydGNhcHRpb24KKwkgICAgXGZpCisJICB9JQorCX0lCisgICAgICAgIFxpbW1lZGlhdGVcd3JpdGVcYXV4ZmlsZXtAeHJkZWZ7XGZsb2F0bGFiZWwtbG9mfXtcZmxvYXRpZGVudAorCSAgXGlmeFxndGVtcFxlbXB0eSBcZWxzZSA6IFxndGVtcCBcZml9fSUKKyAgICAgIH0lCisgICAgXGZpCisgIFxlZ3JvdXAgICUgZW5kIG9mIFx2dG9wCisgICUKKyAgJSBwbGFjZSB0aGUgY2FwdHVyZWQgaW5zZXJ0cworICAlCisgICUgQkVXQVJFOiB3aGVuIHRoZSBmbG9hdHMgc3RhcnQgZmxvYXRpbmcsIHdlIGhhdmUgdG8gaXNzdWUgd2FybmluZworICAlIHdoZW5ldmVyIGFuIGluc2VydCBhcHBlYXJzIGluc2lkZSBhIGZsb2F0IHdoaWNoIGNvdWxkIHBvc3NpYmx5CisgICUgZmxvYXQuIC0ta2FzYWwsIDI2bWF5MDQKKyAgJQorICBcY2hlY2tpbnNlcnRzCit9CisKKyUgQXBwZW5kIHRoZSB0b2tlbnMgIzIgdG8gdGhlIGRlZmluaXRpb24gb2YgbWFjcm8gIzEsIG5vdCBleHBhbmRpbmcgZWl0aGVyLgorJQorXGRlZlxhcHBlbmR0b21hY3JvIzEjMnslCisgIFxleHBhbmRhZnRlclxkZWZcZXhwYW5kYWZ0ZXIjMVxleHBhbmRhZnRlcnsjMSMyfSUKK30KKworJSBAY2FwdGlvbiwgQHNob3J0Y2FwdGlvbgorJQorXGRlZlxjYXB0aW9ue1xkb2NhcHRpb25cdGhpc2NhcHRpb259CitcZGVmXHNob3J0Y2FwdGlvbntcZG9jYXB0aW9uXHRoaXNzaG9ydGNhcHRpb259CitcZGVmXGRvY2FwdGlvbntcY2hlY2tlbnZcZmxvYXQgXGJncm91cFxzY2FuYXJnY3R4dFxkZWZjYXB0aW9ufQorXGRlZlxkZWZjYXB0aW9uIzEjMntcZWdyb3VwIFxkZWYjMXsjMn19CisKKyUgVGhlIHBhcmFtZXRlciBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSBpZGVudGlmeWluZyB0aGUgY291bnRlciB3ZSBhcmUKKyUgZ29pbmcgdG8gdXNlLiAgQ3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGFzc2lnbiBpdCB0byBcZmxvYXRuby4KK1xkZWZcZ2V0ZmxvYXRubyMxeyUKKyAgXGlmeCMxXHJlbGF4CisgICAgICAlIEhhdmVuJ3Qgc2VlbiB0aGlzIGZpZ3VyZSB0eXBlIGJlZm9yZS4KKyAgICAgIFxjc25hbWUgbmV3Y291bnRcZW5kY3NuYW1lICMxJQorICAgICAgJQorICAgICAgJSBSZW1lbWJlciB0byByZXNldCB0aGlzIGZsb2F0bm8gYXQgdGhlIG5leHQgY2hhcC4KKyAgICAgIFxleHBhbmRhZnRlclxnZGVmXGV4cGFuZGFmdGVyXHJlc2V0YWxsZmxvYXRub3MKKyAgICAgICAgXGV4cGFuZGFmdGVye1xyZXNldGFsbGZsb2F0bm9zICMxPTAgfSUKKyAgXGZpCisgIFxsZXRcZmxvYXRubyMxJQorfQorCislIFxzZXRyZWYgY2FsbHMgdGhpcyB0byBnZXQgdGhlIFhSRUZMQUJFTC1zbnQgdmFsdWUuICBXZSB3YW50IGFuIEB4cmVmCislIHRvIHRoZSBGTE9BVExBQkVMIHRvIGV4cGFuZCB0byAiRmlndXJlIDMuMSIuICBXZSBjYWxsIFxzZXRyZWYgd2hlbiB3ZQorJSBmaXJzdCByZWFkIHRoZSBAZmxvYXQgY29tbWFuZC4KKyUKK1xkZWZcWWZsb2F0e1xmbG9hdHR5cGVAdGllIFxjaGFwbGV2ZWxwcmVmaXhcdGhlXGZsb2F0bm99JQorCislIE1hZ2ljIHN0cmluZyB1c2VkIGZvciB0aGUgWFJFRkxBQkVMLXRpdGxlIHZhbHVlLCBzbyBceHJlZlggY2FuCislIGRpc3Rpbmd1aXNoIGZsb2F0cyBmcm9tIG90aGVyIHhyZWYgdHlwZXMuCitcZGVmXGZsb2F0bWFnaWN7ISFmbG9hdCEhfQorCislICMxIGlzIHRoZSBjb250cm9sIHNlcXVlbmNlIHdlIGFyZSBwYXNzZWQ7IHdlIGV4cGFuZCBpbnRvIGEgY29uZGl0aW9uYWwKKyUgd2hpY2ggaXMgdHJ1ZSBpZiAjMSByZXByZXNlbnRzIGEgZmxvYXQgcmVmLiAgVGhhdCBpcywgdGhlIG1hZ2ljCislIFx0aGlzc2VjdGlvbiB2YWx1ZSB3aGljaCB3ZSBcc2V0cmVmIGFib3ZlLgorJQorXGRlZlxpZmZsb2F0IzF7XGV4cGFuZGFmdGVyXGRvaWZmbG9hdCMxPT1cZmluaXNofQorJQorJSAjMSBpcyAobWF5YmUpIHRoZSBcZmxvYXRtYWdpYyBzdHJpbmcuICBJZiBzbywgIzIgd2lsbCBiZSB0aGUKKyUgKHNhZmUpIGZsb2F0IHR5cGUgZm9yIHRoaXMgZmxvYXQuICBXZSBzZXQgXGlmZmxvYXR0eXBlIHRvICMyLgorJQorXGRlZlxkb2lmZmxvYXQjMT0jMj0jM1xmaW5pc2h7JQorICBcZGVmXHRlbXB7IzF9JQorICBcZGVmXGlmZmxvYXR0eXBleyMyfSUKKyAgXGlmeFx0ZW1wXGZsb2F0bWFnaWMKK30KKworJSBAbGlzdG9mZmxvYXRzIEZMT0FUVFlQRSAtIHByaW50IGEgbGlzdCBvZiBmbG9hdHMgbGlrZSBhIHRhYmxlIG9mIGNvbnRlbnRzLgorJQorXHBhcnNlYXJnZGVmXGxpc3RvZmZsb2F0c3slCisgIFxkZWZcZmxvYXR0eXBleyMxfSUgZmxvYXR0eXBlCisgIHslCisgICAgJSB0aGUgZmxvYXR0eXBlIG1pZ2h0IGhhdmUgYWNjZW50cyBvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMsCisgICAgJSBidXQgd2UgbmVlZCB0byB1c2UgaXQgaW4gYSBjb250cm9sIHNlcXVlbmNlIG5hbWUuCisgICAgXGluZGV4bm9mb250cworICAgIFx0dXJub2ZmYWN0aXZlCisgICAgXHhkZWZcc2FmZWZsb2F0dHlwZXtcZmxvYXR0eXBlfSUKKyAgfSUKKyAgJQorICAlIFx4cmRlZiBzYXZlcyB0aGUgZmxvYXRzIGFzIGEgXGRvLWxpc3QgaW4gXGZsb2F0bGlzdFNBRkVGTE9BVFRZUEUuCisgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIGZsb2F0bGlzdFxzYWZlZmxvYXR0eXBlXGVuZGNzbmFtZSBccmVsYXgKKyAgICBcaWZoYXZleHJlZnMKKyAgICAgICUgaWYgdGhlIHVzZXIgc2FpZCBAbGlzdG9mZmxvYXRzIGZvbyBidXQgbmV2ZXIgQGZsb2F0IGZvby4KKyAgICAgIFxtZXNzYWdle1xsaW5lbnVtYmVyIE5vIGBcc2FmZWZsb2F0dHlwZScgZmxvYXRzIHRvIGxpc3QufSUKKyAgICBcZmkKKyAgXGVsc2UKKyAgICBcYmVnaW5ncm91cAorICAgICAgXGxlZnRza2lwPVx0b2NpbmRlbnQgICUgaW5kZW50IHRoZXNlIGVudHJpZXMgbGlrZSBhIHRvYworICAgICAgXGxldFxkbz1cbGlzdG9mZmxvYXRzZG8KKyAgICAgIFxjc25hbWUgZmxvYXRsaXN0XHNhZmVmbG9hdHR5cGVcZW5kY3NuYW1lCisgICAgXGVuZGdyb3VwCisgIFxmaQorfQorCislIFRoaXMgaXMgY2FsbGVkIG9uIGVhY2ggZW50cnkgaW4gYSBsaXN0IG9mIGZsb2F0cy4gIFdlJ3JlIHBhc3NlZCB0aGUKKyUgeHJlZiBsYWJlbCwgaW4gdGhlIGZvcm0gTEFCRUwtdGl0bGUsIHdoaWNoIGlzIGhvdyB3ZSBzYXZlIGl0IGluIHRoZQorJSBhdXggZmlsZS4gIFdlIHN0cmlwIG9mZiB0aGUgLXRpdGxlIGFuZCBsb29rIHVwIFxYUkxBQkVMLWxvZiwgd2hpY2gKKyUgaGFzIHRoZSB0ZXh0IHdlJ3JlIHN1cHBvc2VkIHRvIHR5cGVzZXQgaGVyZS4KKyUKKyUgRmlndXJlcyB3aXRob3V0IHhyZWYgbGFiZWxzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IChzaW5jZQorJSB0aGV5IHdvbid0IGFwcGVhciBpbiB0aGUgYXV4IGZpbGUpLgorJQorXGRlZlxsaXN0b2ZmbG9hdHNkbyMxe1xsaXN0b2ZmbG9hdHNkb2VudHJ5IzFcZmluaXNofQorXGRlZlxsaXN0b2ZmbG9hdHNkb2VudHJ5IzEtdGl0bGVcZmluaXNoe3slCisgICUgQ2FuJ3QgZnVsbHkgZXhwYW5kIFhSIzEtbG9mIGJlY2F1c2UgaXQgY2FuIGNvbnRhaW4gYW55dGhpbmcuICBKdXN0CisgICUgcGFzcyB0aGUgY29udHJvbCBzZXF1ZW5jZS4gIE9uIHRoZSBvdGhlciBoYW5kLCBYUiMxLXBnIGlzIGp1c3QgdGhlCisgICUgcGFnZSBudW1iZXIsIGFuZCB3ZSB3YW50IHRvIGZ1bGx5IGV4cGFuZCB0aGF0IHNvIHdlIGNhbiBnZXQgYSBsaW5rCisgICUgaW4gcGRmIG91dHB1dC4KKyAgXHRva3NBID0gXGV4cGFuZGFmdGVye1xjc25hbWUgWFIjMS1sb2ZcZW5kY3NuYW1lfSUKKyAgJQorICAlIHVzZSB0aGUgc2FtZSBcZW50cnkgbWFjcm8gd2UgdXNlIHRvIGdlbmVyYXRlIHRoZSBUT0MgYW5kIGluZGV4LgorICBcZWRlZlx3cml0ZWVudHJ5e1xub2V4cGFuZFxlbnRyeXtcdGhlXHRva3NBfXtcY3NuYW1lIFhSIzEtcGdcZW5kY3NuYW1lfX0lCisgIFx3cml0ZWVudHJ5Cit9fQorCitcbWVzc2FnZXtsb2NhbGl6YXRpb24sfQorJSBhbmQgaTE4bi4KKworJSBAZG9jdW1lbnRsYW5ndWFnZSBpcyB1c3VhbGx5IGdpdmVuIHZlcnkgZWFybHksIGp1c3QgYWZ0ZXIKKyUgQHNldGZpbGVuYW1lLiAgSWYgZG9uZSB0b28gbGF0ZSwgaXQgbWF5IG5vdCBvdmVycmlkZSBldmVyeXRoaW5nCislIHByb3Blcmx5LiAgU2luZ2xlIGFyZ3VtZW50IGlzIHRoZSBsYW5ndWFnZSBhYmJyZXZpYXRpb24uCislIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgc2V0IHVwIGEgaHlwaGVuYXRpb24gZmlsZSBoZXJlLgorJQorXHBhcnNlYXJnZGVmXGRvY3VtZW50bGFuZ3VhZ2V7JQorICBcdGV4ICUgcmVhZCB0eGktPz8udGV4IGZpbGUgaW4gcGxhaW4gVGVYLgorICAgICUgUmVhZCB0aGUgZmlsZSBpZiBpdCBleGlzdHMuCisgICAgXG9wZW5pbiAxIHR4aS0jMS50ZXgKKyAgICBcaWZlb2YgMQorICAgICAgXGVycmhlbHAgPSBcbm9sYW5naGVscAorICAgICAgXGVycm1lc3NhZ2V7Q2Fubm90IHJlYWQgbGFuZ3VhZ2UgZmlsZSB0eGktIzEudGV4fSUKKyAgICBcZWxzZQorICAgICAgXGlucHV0IHR4aS0jMS50ZXgKKyAgICBcZmkKKyAgICBcY2xvc2VpbiAxCisgIFxlbmRncm91cAorfQorXG5ld2hlbHBcbm9sYW5naGVscHtUaGUgZ2l2ZW4gbGFuZ3VhZ2UgZGVmaW5pdGlvbiBmaWxlIGNhbm5vdCBiZSBmb3VuZCBvcgoraXMgZW1wdHkuICBNYXliZSB5b3UgbmVlZCB0byBpbnN0YWxsIGl0PyAgSW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CitzaG91bGQgd29yayBpZiBub3doZXJlIGVsc2UgZG9lcy59CisKKworJSBAZG9jdW1lbnRlbmNvZGluZyBzaG91bGQgY2hhbmdlIHNvbWV0aGluZyBpbiBUZVggZXZlbnR1YWxseSwgbW9zdAorJSBsaWtlbHksIGJ1dCBmb3Igbm93IGp1c3QgcmVjb2duaXplIGl0LgorXGxldFxkb2N1bWVudGVuY29kaW5nID0gXGNvbW1lbnQKKworCislIFBhZ2Ugc2l6ZSBwYXJhbWV0ZXJzLgorJQorXG5ld2RpbWVuXGRlZmF1bHRwYXJpbmRlbnQgXGRlZmF1bHRwYXJpbmRlbnQgPSAxNXB0CisKK1xjaGFwaGVhZGluZ3NraXAgPSAxNXB0IHBsdXMgNHB0IG1pbnVzIDJwdAorXHNlY2hlYWRpbmdza2lwID0gMTJwdCBwbHVzIDNwdCBtaW51cyAycHQKK1xzdWJzZWNoZWFkaW5nc2tpcCA9IDlwdCBwbHVzIDJwdCBtaW51cyAycHQKKworJSBQcmV2ZW50IHVuZGVyZnVsbCB2Ym94IGVycm9yIG1lc3NhZ2VzLgorXHZiYWRuZXNzID0gMTAwMDAKKworJSBEb24ndCBiZSBzbyBmaW5pY2t5IGFib3V0IHVuZGVyZnVsbCBoYm94ZXMsIGVpdGhlci4KK1xoYmFkbmVzcyA9IDIwMDAKKworJSBGb2xsb3dpbmcgR2VvcmdlIEJ1c2gsIGp1c3QgZ2V0IHJpZCBvZiB3aWRvd3MgYW5kIG9ycGhhbnMuCitcd2lkb3dwZW5hbHR5PTEwMDAwCitcY2x1YnBlbmFsdHk9MTAwMDAKKworJSBVc2UgVGVYIDMuMCdzIFxlbWVyZ2VuY3lzdHJldGNoIHRvIGhlbHAgbGluZSBicmVha2luZywgYnV0IGlmIHdlJ3JlCislIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIFRlWCwgZG9uJ3QgZG8gYW55dGhpbmcuICBXZSB3YW50IHRoZSBhbW91bnQgb2YKKyUgc3RyZXRjaCBhZGRlZCB0byBkZXBlbmQgb24gdGhlIGxpbmUgbGVuZ3RoLCBoZW5jZSB0aGUgZGVwZW5kZW5jZSBvbgorJSBcaHNpemUuICBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgdGhlIHBhcGVyIHNpemUgaXMgc2V0LgorJQorXGRlZlxzZXRlbWVyZ2VuY3lzdHJldGNoeyUKKyAgXGlmeFxlbWVyZ2VuY3lzdHJldGNoXHRoaXNpc3VuZGVmaW5lZAorICAgICUgQWxsb3cgdXMgdG8gYXNzaWduIHRvIFxlbWVyZ2VuY3lzdHJldGNoIGFueXdheS4KKyAgICBcZGVmXGVtZXJnZW5jeXN0cmV0Y2h7XGRpbWVuMH0lCisgIFxlbHNlCisgICAgXGVtZXJnZW5jeXN0cmV0Y2ggPSAuMTVcaHNpemUKKyAgXGZpCit9CisKKyUgUGFyYW1ldGVycyBpbiBvcmRlcjogMSkgdGV4dGhlaWdodDsgMikgdGV4dHdpZHRoOworJSAzKSB2b2Zmc2V0OyA0KSBob2Zmc2V0OyA1KSBiaW5kaW5nIG9mZnNldDsgNikgdG9wc2tpcDsKKyUgNykgcGh5c2ljYWwgcGFnZSBoZWlnaHQ7IDgpIHBoeXNpY2FsIHBhZ2Ugd2lkdGguCislCislIFdlIGFsc28gY2FsbCBcc2V0bGVhZGluZ3tcdGV4dGxlYWRpbmd9LCBzbyB0aGUgY2FsbGVyIHNob3VsZCBkZWZpbmUKKyUgXHRleHRsZWFkaW5nLiAgVGhlIGNhbGxlciBzaG91bGQgYWxzbyBzZXQgXHBhcnNraXAuCislCitcZGVmXGludGVybmFscGFnZXNpemVzIzEjMiMzIzQjNSM2IzcjOHslCisgIFx2b2Zmc2V0ID0gIzNccmVsYXgKKyAgXHRvcHNraXAgPSAjNlxyZWxheAorICBcc3BsaXR0b3Bza2lwID0gXHRvcHNraXAKKyAgJQorICBcdnNpemUgPSAjMVxyZWxheAorICBcYWR2YW5jZVx2c2l6ZSBieSBcdG9wc2tpcAorICBcb3V0ZXJ2c2l6ZSA9IFx2c2l6ZQorICBcYWR2YW5jZVxvdXRlcnZzaXplIGJ5IDJcdG9wYW5kYm90dG9tbWFyZ2luCisgIFxwYWdlaGVpZ2h0ID0gXHZzaXplCisgICUKKyAgXGhzaXplID0gIzJccmVsYXgKKyAgXG91dGVyaHNpemUgPSBcaHNpemUKKyAgXGFkdmFuY2Vcb3V0ZXJoc2l6ZSBieSAwLjVpbgorICBccGFnZXdpZHRoID0gXGhzaXplCisgICUKKyAgXG5vcm1hbG9mZnNldCA9ICM0XHJlbGF4CisgIFxiaW5kaW5nb2Zmc2V0ID0gIzVccmVsYXgKKyAgJQorICBcaWZwZGYKKyAgICBccGRmcGFnZWhlaWdodCAjN1xyZWxheAorICAgIFxwZGZwYWdld2lkdGggIzhccmVsYXgKKyAgXGZpCisgICUKKyAgXHNldGxlYWRpbmd7XHRleHRsZWFkaW5nfQorICAlCisgIFxwYXJpbmRlbnQgPSBcZGVmYXVsdHBhcmluZGVudAorICBcc2V0ZW1lcmdlbmN5c3RyZXRjaAorfQorCislIEBsZXR0ZXJwYXBlciAodGhlIGRlZmF1bHQpLgorXGRlZlxsZXR0ZXJwYXBlcnt7XGdsb2JhbGRlZnMgPSAxCisgIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAorICBcdGV4dGxlYWRpbmcgPSAxMy4ycHQKKyAgJQorICAlIElmIHBhZ2UgaXMgbm90aGluZyBidXQgdGV4dCwgbWFrZSBpdCBjb21lIG91dCBldmVuLgorICBcaW50ZXJuYWxwYWdlc2l6ZXN7NDZcYmFzZWxpbmVza2lwfXs2aW59JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9ey4yNWlufSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXszNnB0fSUKKyAgICAgICAgICAgICAgICAgICAgezExaW59ezguNWlufSUKK319CisKKyUgVXNlIEBzbWFsbGJvb2sgdG8gcmVzZXQgcGFyYW1ldGVycyBmb3IgN3g5LjI1IHRyaW0gc2l6ZS4KK1xkZWZcc21hbGxib29re3tcZ2xvYmFsZGVmcyA9IDEKKyAgXHBhcnNraXAgPSAycHQgcGx1cyAxcHQKKyAgXHRleHRsZWFkaW5nID0gMTJwdAorICAlCisgIFxpbnRlcm5hbHBhZ2VzaXplc3s3LjVpbn17NWlufSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXsuMjVpbn0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17MTZwdH0lCisgICAgICAgICAgICAgICAgICAgIHs5LjI1aW59ezdpbn0lCisgICUKKyAgXGxpc3BuYXJyb3dpbmcgPSAwLjNpbgorICBcdG9sZXJhbmNlID0gNzAwCisgIFxoZnV6eiA9IDFwdAorICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAorICBcZGVmYm9keWluZGVudCA9IC41Y20KK319CisKKyUgVXNlIEBzbWFsbGVyYm9vayB0byByZXNldCBwYXJhbWV0ZXJzIGZvciA2eDkgdHJpbSBzaXplLgorJSAoSnVzdCB0ZXN0aW5nLCBwYXJhbWV0ZXJzIHN0aWxsIGluIGZsdXguKQorXGRlZlxzbWFsbGVyYm9va3t7XGdsb2JhbGRlZnMgPSAxCisgIFxwYXJza2lwID0gMS41cHQgcGx1cyAxcHQKKyAgXHRleHRsZWFkaW5nID0gMTJwdAorICAlCisgIFxpbnRlcm5hbHBhZ2VzaXplc3s3LjRpbn17NC44aW59JQorICAgICAgICAgICAgICAgICAgICB7LS4yaW59ey0uNGlufSUKKyAgICAgICAgICAgICAgICAgICAgezBwdH17MTRwdH0lCisgICAgICAgICAgICAgICAgICAgIHs5aW59ezZpbn0lCisgICUKKyAgXGxpc3BuYXJyb3dpbmcgPSAwLjI1aW4KKyAgXHRvbGVyYW5jZSA9IDcwMAorICBcaGZ1enogPSAxcHQKKyAgXGNvbnRlbnRzcmlnaHRtYXJnaW4gPSAwcHQKKyAgXGRlZmJvZHlpbmRlbnQgPSAuNGNtCit9fQorCislIFVzZSBAYWZvdXJwYXBlciB0byBwcmludCBvbiBFdXJvcGVhbiBBNCBwYXBlci4KK1xkZWZcYWZvdXJwYXBlcnt7XGdsb2JhbGRlZnMgPSAxCisgIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAorICBcdGV4dGxlYWRpbmcgPSAxMy4ycHQKKyAgJQorICAlIERvdWJsZS1zaWRlIHByaW50aW5nIHZpYSBwb3N0c2NyaXB0IG9uIExhc2VyamV0IDQwNTAKKyAgJSBwcmludHMgZG91YmxlLXNpZGVkIG5pY2VseSB3aGVuIFxiaW5kaW5nb2Zmc2V0PTEwbW0gYW5kIFxob2Zmc2V0PS02bW0uCisgICUgVG8gY2hhbmdlIHRoZSBzZXR0aW5ncyBmb3IgYSBkaWZmZXJlbnQgcHJpbnRlciBvciBzaXR1YXRpb24sIGFkanVzdAorICAlIFxub3JtYWxvZmZzZXQgdW50aWwgdGhlIGZyb250LXNpZGUgYW5kIGJhY2stc2lkZSB0ZXh0cyBhbGlnbi4gIFRoZW4KKyAgJSBkbyB0aGUgc2FtZSBmb3IgXGJpbmRpbmdvZmZzZXQuICBZb3UgY2FuIHNldCB0aGVzZSBmb3IgdGVzdGluZyBpbgorICAlIHlvdXIgdGV4aW5mbyBzb3VyY2UgZmlsZSBsaWtlIHRoaXM6CisgICUgQHRleAorICAlIFxnbG9iYWxcbm9ybWFsb2Zmc2V0ID0gLTZtbQorICAlIFxnbG9iYWxcYmluZGluZ29mZnNldCA9IDEwbW0KKyAgJSBAZW5kIHRleAorICBcaW50ZXJuYWxwYWdlc2l6ZXN7NTFcYmFzZWxpbmVza2lwfXsxNjBtbX0KKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXtcaG9mZnNldH0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17NDRwdH0lCisgICAgICAgICAgICAgICAgICAgIHsyOTdtbX17MjEwbW19JQorICAlCisgIFx0b2xlcmFuY2UgPSA3MDAKKyAgXGhmdXp6ID0gMXB0CisgIFxjb250ZW50c3JpZ2h0bWFyZ2luID0gMHB0CisgIFxkZWZib2R5aW5kZW50ID0gNW1tCit9fQorCislIFVzZSBAYWZpdmVwYXBlciB0byBwcmludCBvbiBFdXJvcGVhbiBBNSBwYXBlci4KKyUgRnJvbSByb21pbGRvQHVyYW5vLmljZWIudWZvcC5iciwgMiBKdWx5IDIwMDAuCislIEhlIGFsc28gcmVjb21tZW5kcyBtYWtpbmcgQGV4YW1wbGUgYW5kIEBsaXNwIGJlIHNtYWxsLgorXGRlZlxhZml2ZXBhcGVye3tcZ2xvYmFsZGVmcyA9IDEKKyAgXHBhcnNraXAgPSAycHQgcGx1cyAxcHQgbWludXMgMC4xcHQKKyAgXHRleHRsZWFkaW5nID0gMTIuNXB0CisgICUKKyAgXGludGVybmFscGFnZXNpemVzezE2MG1tfXsxMjBtbX0lCisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17XGhvZmZzZXR9JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezhwdH0lCisgICAgICAgICAgICAgICAgICAgIHsyMTBtbX17MTQ4bW19JQorICAlCisgIFxsaXNwbmFycm93aW5nID0gMC4yaW4KKyAgXHRvbGVyYW5jZSA9IDgwMAorICBcaGZ1enogPSAxLjJwdAorICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAorICBcZGVmYm9keWluZGVudCA9IDJtbQorICBcdGFibGVpbmRlbnQgPSAxMm1tCit9fQorCislIEEgc3BlY2lmaWMgdGV4dCBsYXlvdXQsIDI0eDE1Y20gb3ZlcmFsbCwgaW50ZW5kZWQgZm9yIEE0IHBhcGVyLgorXGRlZlxhZm91cmxhdGV4e3tcZ2xvYmFsZGVmcyA9IDEKKyAgXGFmb3VycGFwZXIKKyAgXGludGVybmFscGFnZXNpemVzezIzN21tfXsxNTBtbX0lCisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17NC42bW19JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezdtbX0lCisgICAgICAgICAgICAgICAgICAgIHsyOTdtbX17MjEwbW19JQorICAlCisgICUgTXVzdCBleHBsaWNpdGx5IHJlc2V0IHRvIDAgYmVjYXVzZSB3ZSBjYWxsIFxhZm91cnBhcGVyLgorICBcZ2xvYmFsZGVmcyA9IDAKK319CisKKyUgVXNlIEBhZm91cndpZGUgdG8gcHJpbnQgb24gQTQgcGFwZXIgaW4gbGFuZHNjYXBlIGZvcm1hdC4KK1xkZWZcYWZvdXJ3aWRle3tcZ2xvYmFsZGVmcyA9IDEKKyAgXGFmb3VycGFwZXIKKyAgXGludGVybmFscGFnZXNpemVzezI0MW1tfXsxNjVtbX0lCisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17LTIuOTVtbX0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17N21tfSUKKyAgICAgICAgICAgICAgICAgICAgezI5N21tfXsyMTBtbX0lCisgIFxnbG9iYWxkZWZzID0gMAorfX0KKworJSBAcGFnZXNpemVzIFRFWFRIRUlHSFRbLFRFWFRXSURUSF0KKyUgUGVyaGFwcyB3ZSBzaG91bGQgYWxsb3cgc2V0dGluZyB0aGUgbWFyZ2lucywgXHRvcHNraXAsIFxwYXJza2lwLAorJSBhbmQvb3IgbGVhZGluZywgYWxzby4gT3IgcGVyaGFwcyB3ZSBzaG91bGQgY29tcHV0ZSB0aGVtIHNvbWVob3cuCislCitccGFyc2VhcmdkZWZccGFnZXNpemVze1xwYWdlc2l6ZXN5eXkgIzEsLFxmaW5pc2h9CitcZGVmXHBhZ2VzaXplc3l5eSMxLCMyLCMzXGZpbmlzaHt7JQorICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcaHNpemU9IzJccmVsYXggXGZpCisgIFxnbG9iYWxkZWZzID0gMQorICAlCisgIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAorICBcc2V0bGVhZGluZ3tcdGV4dGxlYWRpbmd9JQorICAlCisgIFxkaW1lbjAgPSAjMQorICBcYWR2YW5jZVxkaW1lbjAgYnkgXHZvZmZzZXQKKyAgJQorICBcZGltZW4yID0gXGhzaXplCisgIFxhZHZhbmNlXGRpbWVuMiBieSBcbm9ybWFsb2Zmc2V0CisgICUKKyAgXGludGVybmFscGFnZXNpemVzeyMxfXtcaHNpemV9JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9e1xub3JtYWxvZmZzZXR9JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQorICAgICAgICAgICAgICAgICAgICB7XGRpbWVuMH17XGRpbWVuMn0lCit9fQorCislIFNldCBkZWZhdWx0IHRvIGxldHRlci4KKyUKK1xsZXR0ZXJwYXBlcgorCisKK1xtZXNzYWdle2FuZCB0dXJuaW5nIG9uIHRleGluZm8gaW5wdXQgZm9ybWF0Ln0KKworJSBEZWZpbmUgbWFjcm9zIHRvIG91dHB1dCB2YXJpb3VzIGNoYXJhY3RlcnMgd2l0aCBjYXRjb2RlIGZvciBub3JtYWwgdGV4dC4KK1xjYXRjb2RlYFwiPVxvdGhlcgorXGNhdGNvZGVgXH49XG90aGVyCitcY2F0Y29kZWBcXj1cb3RoZXIKK1xjYXRjb2RlYFxfPVxvdGhlcgorXGNhdGNvZGVgXHw9XG90aGVyCitcY2F0Y29kZWBcPD1cb3RoZXIKK1xjYXRjb2RlYFw+PVxvdGhlcgorXGNhdGNvZGVgXCs9XG90aGVyCitcY2F0Y29kZWBcJD1cb3RoZXIKK1xkZWZcbm9ybWFsZG91YmxlcXVvdGV7In0KK1xkZWZcbm9ybWFsdGlsZGV7fn0KK1xkZWZcbm9ybWFsY2FyZXR7Xn0KK1xkZWZcbm9ybWFsdW5kZXJzY29yZXtffQorXGRlZlxub3JtYWx2ZXJ0aWNhbGJhcnt8fQorXGRlZlxub3JtYWxsZXNzezx9CitcZGVmXG5vcm1hbGdyZWF0ZXJ7Pn0KK1xkZWZcbm9ybWFscGx1c3srfQorXGRlZlxub3JtYWxkb2xsYXJ7JH0lJCBmb250LWxvY2sgZml4CisKKyUgVGhpcyBtYWNybyBpcyB1c2VkIHRvIG1ha2UgYSBjaGFyYWN0ZXIgcHJpbnQgb25lIHdheSBpbiBcdHQKKyUgKHdoZXJlIGl0IGNhbiBwcm9iYWJseSBiZSBvdXRwdXQgYXMtaXMpLCBhbmQgYW5vdGhlciB3YXkgaW4gb3RoZXIgZm9udHMsCislIHdoZXJlIHNvbWV0aGluZyBoYWlyaWVyIHByb2JhYmx5IG5lZWRzIHRvIGJlIGRvbmUuCislCislICMxIGlzIHdoYXQgdG8gcHJpbnQgaWYgd2UgYXJlIGluZGVlZCB1c2luZyBcdHQ7ICMyIGlzIHdoYXQgdG8gcHJpbnQKKyUgb3RoZXJ3aXNlLiAgU2luY2UgYWxsIHRoZSBDb21wdXRlciBNb2Rlcm4gdHlwZXdyaXRlciBmb250cyBoYXZlIHplcm8KKyUgaW50ZXJ3b3JkIHN0cmV0Y2ggKGFuZCBzaHJpbmspLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3QgYWxsCislIHR5cGV3cml0ZXIgZm9udHMgdG8gaGF2ZSB0aGlzLCB3ZSBjYW4gY2hlY2sgdGhhdCBmb250IHBhcmFtZXRlci4KKyUKK1xkZWZcaWZ1c2luZ3R0IzEjMntcaWZkaW0gXGZvbnRkaW1lbjNcZm9udD0wcHQgIzFcZWxzZSAjMlxmaX0KKworJSBTYW1lIGFzIGFib3ZlLCBidXQgY2hlY2sgZm9yIGl0YWxpYyBmb250LiAgQWN0dWFsbHkgdGhpcyBhbHNvIGNhdGNoZXMKKyUgbm9uLWl0YWxpYyBzbGFudGVkIGZvbnRzIHNpbmNlIGl0IGlzIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tCislIGl0YWxpYyBmb250cy4gIEJ1dCBzaW5jZSB0aGlzIGlzIG9ubHkgdXNlZCBieSAkIGFuZCBpdCB1c2VzIFxzbCBhbnl3YXkKKyUgdGhpcyBpcyBub3QgYSBwcm9ibGVtLgorXGRlZlxpZnVzaW5naXQjMSMye1xpZmRpbSBcZm9udGRpbWVuMVxmb250PjBwdCAjMVxlbHNlICMyXGZpfQorCislIFR1cm4gb2ZmIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMgZXhjZXB0IEAKKyUgKGFuZCB0aG9zZSB3aGljaCB0aGUgdXNlciBjYW4gdXNlIGFzIGlmIHRoZXkgd2VyZSBvcmRpbmFyeSkuCislIE1vc3Qgb2YgdGhlc2Ugd2Ugc2ltcGx5IHByaW50IGZyb20gdGhlIFx0dCBmb250LCBidXQgZm9yIHNvbWUsIHdlIGNhbgorJSB1c2UgbWF0aCBvciBvdGhlciB2YXJpYW50cyB0aGF0IGxvb2sgYmV0dGVyIGluIG5vcm1hbCB0ZXh0LgorCitcY2F0Y29kZWBcIj1cYWN0aXZlCitcZGVmXGFjdGl2ZWRvdWJsZXF1b3Rle3tcdHRcY2hhcjM0fX0KK1xsZXQiPVxhY3RpdmVkb3VibGVxdW90ZQorXGNhdGNvZGVgXH49XGFjdGl2ZQorXGRlZn57e1x0dFxjaGFyMTI2fX0KK1xjaGFyZGVmXGhhdD1gXF4KK1xjYXRjb2RlYFxePVxhY3RpdmUKK1xkZWZee3tcdHQgXGhhdH19CisKK1xjYXRjb2RlYFxfPVxhY3RpdmUKK1xkZWZfe1xpZnVzaW5ndHRcbm9ybWFsdW5kZXJzY29yZVxffQorXGxldFxyZWFsdW5kZXI9XworJSBTdWJyb3V0aW5lIGZvciB0aGUgcHJldmlvdXMgbWFjcm8uCitcZGVmXF97XGxlYXZldm1vZGUgXGtlcm4uMDdlbSBcdmJveHtcaHJ1bGUgd2lkdGguM2VtIGhlaWdodC4xZXh9XGtlcm4gLjA3ZW0gfQorCitcY2F0Y29kZWBcfD1cYWN0aXZlCitcZGVmfHt7XHR0XGNoYXIxMjR9fQorXGNoYXJkZWYgXGxlc3M9YFw8CitcY2F0Y29kZWBcPD1cYWN0aXZlCitcZGVmPHt7XHR0IFxsZXNzfX0KK1xjaGFyZGVmIFxndHI9YFw+CitcY2F0Y29kZWBcPj1cYWN0aXZlCitcZGVmPnt7XHR0IFxndHJ9fQorXGNhdGNvZGVgXCs9XGFjdGl2ZQorXGRlZit7e1x0dCBcY2hhciA0M319CitcY2F0Y29kZWBcJD1cYWN0aXZlCitcZGVmJHtcaWZ1c2luZ2l0e3tcc2xcJH19XG5vcm1hbGRvbGxhcn0lJCBmb250LWxvY2sgZml4CisKKyUgSWYgYSAuZm10IGZpbGUgaXMgYmVpbmcgdXNlZCwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiBhIGZpbGUKKyUgbmFtZSBjYW5ub3QgYmUgYWN0aXZlIHVudGlsIHdlIGhhdmUgcGFyc2VkIHRoZSBjb21tYW5kIGxpbmUuCislIFNvIHR1cm4gdGhlbSBvZmYgYWdhaW4sIGFuZCBoYXZlIFxldmVyeWpvYiAob3IgQHNldGZpbGVuYW1lKSB0dXJuIHRoZW0gb24uCislIFxvdGhlcmlmeWFjdGl2ZSBpcyBjYWxsZWQgbmVhciB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KK1xkZWZcb3RoZXJpZnlhY3RpdmV7XGNhdGNvZGVgKz1cb3RoZXIgXGNhdGNvZGVgXF89XG90aGVyfQorCislIFVzZWQgc29tZXRpbWVzIHRvIHR1cm4gb2ZmIChlZmZlY3RpdmVseSkgdGhlIGFjdGl2ZSBjaGFyYWN0ZXJzIGV2ZW4gYWZ0ZXIKKyUgcGFyc2luZyB0aGVtLgorXGRlZlx0dXJub2ZmYWN0aXZleyUKKyAgXG5vcm1hbHR1cm5vZmZhY3RpdmUKKyAgXG90aGVyYmFja3NsYXNoCit9CisKK1xjYXRjb2RlYFxAPTAKKworJSBcYmFja3NsYXNoY3VyZm9udCBvdXRwdXRzIG9uZSBiYWNrc2xhc2ggY2hhcmFjdGVyIGluIGN1cnJlbnQgZm9udCwKKyUgYXMgaW4gXGNoYXJgXFwuCitcZ2xvYmFsXGNoYXJkZWZcYmFja3NsYXNoY3VyZm9udD1gXFwKK1xnbG9iYWxcbGV0XHJhd2JhY2tzbGFzaHh4PVxiYWNrc2xhc2hjdXJmb250ICAlIGxldCBleGlzdGluZyAuPz9zIGZpbGVzIHdvcmsKKworJSBccmVhbGJhY2tzbGFzaCBpcyBhbiBhY3R1YWwgY2hhcmFjdGVyIGBcJyB3aXRoIGNhdGNvZGUgb3RoZXIsIGFuZAorJSBcZG91YmxlYmFja3NsYXNoIGlzIHR3byBvZiB0aGVtIChmb3IgdGhlIHBkZiBvdXRsaW5lcykuCit7XGNhdGNvZGVgXFw9XG90aGVyIEBnZGVmQHJlYWxiYWNrc2xhc2h7XH0gQGdkZWZAZG91YmxlYmFja3NsYXNoe1xcfX0KKworJSBJbiB0ZXhpbmZvLCBiYWNrc2xhc2ggaXMgYW4gYWN0aXZlIGNoYXJhY3RlcjsgaXQgcHJpbnRzIHRoZSBiYWNrc2xhc2gKKyUgaW4gZml4ZWQgd2lkdGggZm9udC4KK1xjYXRjb2RlYFxcPVxhY3RpdmUKK0BkZWZAbm9ybWFsYmFja3NsYXNoe3tAdHRAYmFja3NsYXNoY3VyZm9udH19CislIE9uIHN0YXJ0dXAsIEBmaXhiYWNrc2xhc2ggYXNzaWduczoKKyUgIEBsZXQgXCA9IEBub3JtYWxiYWNrc2xhc2gKKworJSBccmF3YmFja3NsYXNoIGRlZmluZXMgYW4gYWN0aXZlIFwgdG8gZG8gXGJhY2tzbGFzaGN1cmZvbnQuCislIFxvdGhlcmJhY2tzbGFzaCBkZWZpbmVzIGFuIGFjdGl2ZSBcIHRvIGJlIGEgbGl0ZXJhbCBgXCcgY2hhcmFjdGVyIHdpdGgKKyUgY2F0Y29kZSBvdGhlci4KK0BnZGVmQHJhd2JhY2tzbGFzaHtAbGV0XD1AYmFja3NsYXNoY3VyZm9udH0KK0BnZGVmQG90aGVyYmFja3NsYXNoe0BsZXRcPUByZWFsYmFja3NsYXNofQorCislIFNhbWUgYXMgQHR1cm5vZmZhY3RpdmUgZXhjZXB0IG91dHB1dHMgXCBhcyB7XHR0XGNoYXJgXFx9IGluc3RlYWQgb2YKKyUgdGhlIGxpdGVyYWwgY2hhcmFjdGVyIGBcJy4KKyUgCitAZGVmQG5vcm1hbHR1cm5vZmZhY3RpdmV7JQorICBAbGV0XD1Abm9ybWFsYmFja3NsYXNoCisgIEBsZXQiPUBub3JtYWxkb3VibGVxdW90ZQorICBAbGV0fj1Abm9ybWFsdGlsZGUKKyAgQGxldF49QG5vcm1hbGNhcmV0CisgIEBsZXRfPUBub3JtYWx1bmRlcnNjb3JlCisgIEBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgorICBAbGV0PD1Abm9ybWFsbGVzcworICBAbGV0Pj1Abm9ybWFsZ3JlYXRlcgorICBAbGV0Kz1Abm9ybWFscGx1cworICBAbGV0JD1Abm9ybWFsZG9sbGFyICUkIGZvbnQtbG9jayBmaXgKKyAgQHVuc2Vwc3BhY2VzCit9CisKKyUgTWFrZSBfIGFuZCArIFxvdGhlciBjaGFyYWN0ZXJzLCB0ZW1wb3JhcmlseS4KKyUgVGhpcyBpcyBjYW5jZWxlZCBieSBAZml4YmFja3NsYXNoLgorQG90aGVyaWZ5YWN0aXZlCisKKyUgSWYgYSAuZm10IGZpbGUgaXMgYmVpbmcgdXNlZCwgd2UgZG9uJ3Qgd2FudCB0aGUgYFxpbnB1dCB0ZXhpbmZvJyB0byBzaG93IHVwLgorJSBUaGF0IGlzIHdoYXQgXGVhdGlucHV0IGlzIGZvcjsgYWZ0ZXIgdGhhdCwgdGhlIGBcJyBzaG91bGQgcmV2ZXJ0IHRvIHByaW50aW5nCislIGEgYmFja3NsYXNoLgorJQorQGdkZWZAZWF0aW5wdXQgaW5wdXQgdGV4aW5mb3tAZml4YmFja3NsYXNofQorQGdsb2JhbEBsZXRcID0gQGVhdGlucHV0CisKKyUgT24gdGhlIG90aGVyIGhhbmQsIHBlcmhhcHMgdGhlIGZpbGUgZGlkIG5vdCBoYXZlIGEgYFxpbnB1dCB0ZXhpbmZvJy4gVGhlbgorJSB0aGUgZmlyc3QgYFwnIGluIHRoZSBmaWxlIHdvdWxkIGNhdXNlIGFuIGVycm9yLiBUaGlzIG1hY3JvIHRyaWVzIHRvIGZpeAorJSB0aGF0LCBhc3N1bWluZyBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBgXCcgY291bGQgcGxhdXNpYmx5IG9jY3VyLgorJSBBbHNvIHR1cm4gYmFjayBvbiBhY3RpdmUgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiB0aGUgaW5wdXQKKyUgZmlsZSBuYW1lLCBpbiBjYXNlIG5vdCB1c2luZyBhIHByZS1kdW1wZWQgZm9ybWF0LgorJQorQGdkZWZAZml4YmFja3NsYXNoeyUKKyAgQGlmeFxAZWF0aW5wdXQgQGxldFwgPSBAbm9ybWFsYmFja3NsYXNoIEBmaQorICBAY2F0Y29kZWArPUBhY3RpdmUKKyAgQGNhdGNvZGVgQF89QGFjdGl2ZQorfQorCislIFNheSBAZm9vLCBub3QgXGZvbywgaW4gZXJyb3IgbWVzc2FnZXMuCitAZXNjYXBlY2hhciA9IGBAQAorCislIFRoZXNlIGxvb2sgb2sgaW4gYWxsIGZvbnRzLCBzbyBqdXN0IG1ha2UgdGhlbSBub3Qgc3BlY2lhbC4KK0BjYXRjb2RlYEAmID0gQG90aGVyCitAY2F0Y29kZWBAIyA9IEBvdGhlcgorQGNhdGNvZGVgQCUgPSBAb3RoZXIKKworCitAYyBMb2NhbCB2YXJpYWJsZXM6CitAYyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCitAYyBwYWdlLWRlbGltaXRlcjogIl5cXFxcbWVzc2FnZSIKK0BjIHRpbWUtc3RhbXAtc3RhcnQ6ICJkZWZcXFxcdGV4aW5mb3ZlcnNpb257IgorQGMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCitAYyB0aW1lLXN0YW1wLWVuZDogIn0iCitAYyBFbmQ6CisKK0BjIHZpbTpzdz0yOgorCitAaWdub3JlCisgICBhcmNoLXRhZzogZTFiMzZlMzItYzk2ZS00MTM1LWE0MWEtMGIyZWZhMmVhMTE1CitAZW5kIGlnbm9yZQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9lMmZzcHJvZ3Muc3BlYy5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZTJmc3Byb2dzLnNwZWMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjMjNhNwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvZTJmc3Byb2dzLnNwZWMuaW4KQEAgLTAsMCArMSwyNDEgQEAKKyVkZWZpbmUJX3Jvb3Rfc2JpbmRpcgkvc2JpbgorJWRlZmluZQlfcm9vdF9saWJkaXIJLyV7X2xpYn0KKyVkZWZpbmUJX3Jvb3RfbG9jYWxlZGlyCS91c3Ivc2hhcmUvbG9jYWxlCislZGVmaW5lCV9yb290X2V0Y2RpcgkvZXRjCisKK1N1bW1hcnk6IFV0aWxpdGllcyBmb3IgbWFuYWdpbmcgZXh0Mi9leHQzL2V4dDQgZmlsZXN5c3RlbXMKK05hbWU6IGUyZnNwcm9ncworVmVyc2lvbjogQEUyRlNQUk9HU19QS0dWRVJACitSZWxlYXNlOiAwCitMaWNlbnNlOiBHUEx2MgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9CYXNlCitTb3VyY2U6ICBmdHA6Ly9kb3dubG9hZC5zb3VyY2Vmb3JnZS5uZXQvcHViL3NvdXJjZWZvcmdlL2UyZnNwcm9ncy9lMmZzcHJvZ3MtJXt2ZXJzaW9ufS50YXIuZ3oKK1VybDogaHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQvCitQcmVyZXE6IC9zYmluL2xkY29uZmlnCitCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tcm9vdAorCislZGVzY3JpcHRpb24KK1RoZSBlMmZzcHJvZ3MgcGFja2FnZSBjb250YWlucyBhIG51bWJlciBvZiB1dGlsaXRpZXMgZm9yIGNyZWF0aW5nLAorY2hlY2tpbmcsIG1vZGlmeWluZywgYW5kIGNvcnJlY3RpbmcgYW55IGluY29uc2lzdGVuY2llcyBpbiBleHQyLCBleHQzLAorYW5kIGV4dDQgZmlsZXN5c3RlbXMuICBFMmZzcHJvZ3MgY29udGFpbnMgZTJmc2NrICh1c2VkIHRvIHJlcGFpcgorZmlsZXN5c3RlbSBpbmNvbnNpc3RlbmNpZXMgYWZ0ZXIgYW4gdW5jbGVhbiBzaHV0ZG93biksIG1rZTJmcyAodXNlZCB0bworaW5pdGlhbGl6ZSBhIHBhcnRpdGlvbiB0byBjb250YWluIGFuIGVtcHR5IGV4dDIgZmlsZXN5c3RlbSksIGRlYnVnZnMKKyh1c2VkIHRvIGV4YW1pbmUgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiBhIGZpbGVzeXN0ZW0sIHRvIG1hbnVhbGx5CityZXBhaXIgYSBjb3JydXB0ZWQgZmlsZXN5c3RlbSBvciB0byBjcmVhdGUgdGVzdCBjYXNlcyBmb3IgZTJmc2NrKSwKK3R1bmUyZnMgKHVzZWQgdG8gbW9kaWZ5IGZpbGVzeXN0ZW0gcGFyYW1ldGVycyksIHJlc2l6ZTJmcyB0byBncm93IGFuZAorc2hyaW5rIHVubW91bnRlZCBleHQyIGZpbGVzeXN0ZW1zLCBhbmQgbW9zdCBvZiB0aGUgb3RoZXIgY29yZSBleHQyZnMKK2ZpbGVzeXN0ZW0gdXRpbGl0aWVzLgorCitZb3Ugc2hvdWxkIGluc3RhbGwgdGhlIGUyZnNwcm9ncyBwYWNrYWdlIGlmIHlvdSBhcmUgdXNpbmcgYW55IGV4dDIsCitleHQzLCBvciBleHQ0IGZpbGVzeXN0ZW1zIChpZiB5b3UncmUgbm90IHN1cmUsIHlvdSBwcm9iYWJseSBzaG91bGQKK2luc3RhbGwgdGhpcyBwYWNrYWdlKS4gIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgaXQgKGV2ZW4gaWYgeW91Citkb24ndCB1c2UgZXh0Mi9leHQzL2V4dDQpIGZvciB0aGUgbGlidXVpZCBhbmQgbGliYmxraWQgbGlicmFyaWVzIGFuZAorZnNjayB0b29sIHRoYXQgYXJlIGluY2x1ZGVkIGhlcmUuCisKKyVwYWNrYWdlIGRldmVsCitTdW1tYXJ5OiBFeHQyIGZpbGVzeXN0ZW0tc3BlY2lmaWMgc3RhdGljIGxpYnJhcmllcyBhbmQgaGVhZGVycy4KK0dyb3VwOiBEZXZlbG9wbWVudC9MaWJyYXJpZXMKK1JlcXVpcmVzOiBlMmZzcHJvZ3MgPSAle3ZlcnNpb259CitQcmVyZXE6IC9zYmluL2luc3RhbGwtaW5mbworCislZGVzY3JpcHRpb24gZGV2ZWwKK0UyZnNwcm9ncy1kZXZlbCBjb250YWlucyB0aGUgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMgbmVlZGVkIHRvCitkZXZlbG9wIGV4dDIsIGV4dDMsIG9yIGV4dDQgZmlsZXN5c3RlbS1zcGVjaWZpYyBwcm9ncmFtcy4KKworWW91IHNob3VsZCBpbnN0YWxsIGUyZnNwcm9ncy1kZXZlbCBpZiB5b3Ugd2FudCB0byBkZXZlbG9wCitleHQyLiBleHQzLiBvciBleHQ0IGZpbGVzeXN0ZW0tc3BlY2lmaWMgcHJvZ3JhbXMuICBJZiB5b3UgaW5zdGFsbAorZTJmc3Byb2dzLWRldmVsLCB5b3UnbGwgYWxzbyB3YW50IHRvIGluc3RhbGwgZTJmc3Byb2dzLgorCislcGFja2FnZSAtbiB1dWlkZAorU3VtbWFyeTogaGVscGVyIGRhZW1vbiB0byBndWFyYW50ZWUgdW5pcXVlbmVzcyBvZiB0aW1lLWJhc2VkIFVVSURzCitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L0RhZW1vbnMKK0xpY2Vuc2U6IEdQTHYyCitSZXF1aXJlczogZTJmc3Byb2dzID0gJXt2ZXJzaW9ufQorUmVxdWlyZXMocHJlKTogc2hhZG93LXV0aWxzCisKKyVkZXNjcmlwdGlvbiAtbiB1dWlkZAorVGhlIHV1aWRkIHBhY2thZ2UgY29udGFpbnMgYSB1c2Vyc3BhY2UgZGFlbW9uICh1dWlkZCkgd2hpY2ggZ3VhcmFudGVlcwordW5pcXVlbmVzcyBvZiB0aW1lLWJhc2VkIFVVSUQgZ2VuZXJhdGlvbiBldmVuIGF0IHZlcnkgaGlnaCByYXRlcyBvbgorU01QIHN5c3RlbXMuCisKKyVwcmVwCislc2V0dXAKKworJWJ1aWxkCislY29uZmlndXJlIC0tZW5hYmxlLWVsZi1zaGxpYnMgLS1lbmFibGUtbmxzIFwKKwklez9leHRyYV9jb25maWdfZmxhZ3M6JWV4dHJhX2NvbmZpZ19mbGFnc30KK21ha2UKK21ha2UgY2hlY2sKKworJWluc3RhbGwKK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKK2V4cG9ydCBQQVRIPS9zYmluOiRQQVRICittYWtlIGluc3RhbGwgaW5zdGFsbC1saWJzIERFU1RESVI9IiRSUE1fQlVJTERfUk9PVCIgXAorCXJvb3Rfc2JpbmRpcj0le19yb290X3NiaW5kaXJ9IHJvb3RfbGliZGlyPSV7X3Jvb3RfbGliZGlyfQorL3NiaW4vbGRjb25maWcgLW4gJHtSUE1fQlVJTERfUk9PVH0le19saWJkaXJ9CisKKyMgQWRkIGEgZGlyIHRoYXQgdXVpZGQgbmVlZHMgdGhhdCB0aGUgTWFrZWZpbGVzIGRvbid0IGNyZWF0ZQoraW5zdGFsbCAtZCAkUlBNX0JVSUxEX1JPT1QvdmFyL2xpYi9saWJ1dWlkCisKKyVmaW5kX2xhbmcgJXtuYW1lfQorCislY2xlYW4KK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKKworJXBvc3QgLXAgL3NiaW4vbGRjb25maWcKKworJXBvc3R1biAtcCAvc2Jpbi9sZGNvbmZpZworCislcG9zdCBkZXZlbAoraWYgWyAteCAvc2Jpbi9pbnN0YWxsLWluZm8gLWEgLWYgJXtfaW5mb2Rpcn0vbGliZXh0MmZzLmluZm8uZ3ogXTsgdGhlbgorICAgIC9zYmluL2luc3RhbGwtaW5mbyAle19pbmZvZGlyfS9saWJleHQyZnMuaW5mby5neiAle19pbmZvZGlyfS9kaXIKK2ZpCitleGl0IDAKKworJXBvc3R1biBkZXZlbAoraWYgWyAkMSA9IDAgLWEgLXggL3NiaW4vaW5zdGFsbC1pbmZvIC1hIC1mICV7X2luZm9kaXJ9L2xpYmV4dDJmcy5pbmZvLmd6IF07IHRoZW4KKyAgIC9zYmluL2luc3RhbGwtaW5mbyAtLWRlbGV0ZSAle19pbmZvZGlyfS9saWJleHQyZnMuaW5mby5neiAle19pbmZvZGlyfS9kaXIKK2ZpCitleGl0IDAKKworJXByZSAtbiB1dWlkZAorZ2V0ZW50IGdyb3VwIHV1aWRkID4vZGV2L251bGwgfHwgZ3JvdXBhZGQgLXIgdXVpZGQKK2dldGVudCBwYXNzd2QgdXVpZGQgPi9kZXYvbnVsbCB8fCBcCit1c2VyYWRkIC1yIC1nIHV1aWRkIC1kIC92YXIvbGliL2xpYnV1aWQgLXMgL3NiaW4vbm9sb2dpbiBcCisgICAgLWMgIlVVSUQgZ2VuZXJhdG9yIGhlbHBlciBkYWVtb24iIHV1aWRkCitleGl0IDAKKworJWZpbGVzIC1mICV7bmFtZX0ubGFuZworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIFJFQURNRSBSRUxFQVNFLU5PVEVTCisKKyV7X3Jvb3Rfc2JpbmRpcn0vYmFkYmxvY2tzCisle19yb290X3NiaW5kaXJ9L2Jsa2lkCisle19yb290X3NiaW5kaXJ9L2RlYnVnZnMKKyV7X3Jvb3Rfc2JpbmRpcn0vZHVtcGUyZnMKKyV7X3Jvb3Rfc2JpbmRpcn0vZTJmc2NrCisle19yb290X3NiaW5kaXJ9L2UyaW1hZ2UKKyV7X3Jvb3Rfc2JpbmRpcn0vZTJsYWJlbAorJXtfcm9vdF9zYmluZGlyfS9lMnVuZG8KKyV7X3Jvb3Rfc2JpbmRpcn0vZmluZGZzCisle19yb290X3NiaW5kaXJ9L2ZzY2sKKyV7X3Jvb3Rfc2JpbmRpcn0vZnNjay5leHQyCisle19yb290X3NiaW5kaXJ9L2ZzY2suZXh0MworJXtfcm9vdF9zYmluZGlyfS9mc2NrLmV4dDQKKyV7X3Jvb3Rfc2JpbmRpcn0vZnNjay5leHQ0ZGV2Cisle19yb290X3NiaW5kaXJ9L2xvZ3NhdmUKKyV7X3Jvb3Rfc2JpbmRpcn0vbWtlMmZzCisle19yb290X2V0Y2Rpcn0vbWtlMmZzLmNvbmYKKyV7X3Jvb3Rfc2JpbmRpcn0vbWtmcy5leHQyCisle19yb290X3NiaW5kaXJ9L21rZnMuZXh0MworJXtfcm9vdF9zYmluZGlyfS9ta2ZzLmV4dDQKKyV7X3Jvb3Rfc2JpbmRpcn0vbWtmcy5leHQ0ZGV2Cisle19yb290X3NiaW5kaXJ9L3Jlc2l6ZTJmcworJXtfcm9vdF9zYmluZGlyfS90dW5lMmZzCisle19zYmluZGlyfS9maWxlZnJhZworJXtfc2JpbmRpcn0vbWtsb3N0K2ZvdW5kCisle19zYmluZGlyfS9lMmZyZWVmcmFnCisKKyV7X3Jvb3RfbGliZGlyfS9saWJibGtpZC5zby4qCisle19yb290X2xpYmRpcn0vbGliY29tX2Vyci5zby4qCisle19yb290X2xpYmRpcn0vbGliZTJwLnNvLioKKyV7X3Jvb3RfbGliZGlyfS9saWJleHQyZnMuc28uKgorJXtfcm9vdF9saWJkaXJ9L2xpYnNzLnNvLioKKyV7X3Jvb3RfbGliZGlyfS9saWJ1dWlkLnNvLioKKworJXtfbGliZGlyfS9lMmluaXRyZF9oZWxwZXIKKworJXtfYmluZGlyfS9jaGF0dHIKKyV7X2JpbmRpcn0vbHNhdHRyCisle19iaW5kaXJ9L3V1aWRnZW4KKyV7X21hbmRpcn0vbWFuMS9jaGF0dHIuMSoKKyV7X21hbmRpcn0vbWFuMS9sc2F0dHIuMSoKKyV7X21hbmRpcn0vbWFuMS91dWlkZ2VuLjEqCisKKyV7X21hbmRpcn0vbWFuNS9lMmZzY2suY29uZi41KgorJXtfbWFuZGlyfS9tYW41L21rZTJmcy5jb25mLjUqCisKKyV7X21hbmRpcn0vbWFuOC9iYWRibG9ja3MuOCoKKyV7X21hbmRpcn0vbWFuOC9ibGtpZC44KgorJXtfbWFuZGlyfS9tYW44L2RlYnVnZnMuOCoKKyV7X21hbmRpcn0vbWFuOC9kdW1wZTJmcy44KgorJXtfbWFuZGlyfS9tYW44L2UyZnNjay44KgorJXtfbWFuZGlyfS9tYW44L2ZpbmRmcy44KgorJXtfbWFuZGlyfS9tYW44L2ZzY2suZXh0Mi44KgorJXtfbWFuZGlyfS9tYW44L2ZzY2suZXh0My44KgorJXtfbWFuZGlyfS9tYW44L2ZzY2suZXh0NC44KgorJXtfbWFuZGlyfS9tYW44L2ZzY2suZXh0NGRldi44KgorJXtfbWFuZGlyfS9tYW44L2UyaW1hZ2UuOCoKKyV7X21hbmRpcn0vbWFuOC9lMmxhYmVsLjgqCisle19tYW5kaXJ9L21hbjgvZTJ1bmRvLjgqCisle19tYW5kaXJ9L21hbjgvZnNjay44KgorJXtfbWFuZGlyfS9tYW44L2xvZ3NhdmUuOCoKKyV7X21hbmRpcn0vbWFuOC9ta2UyZnMuOCoKKyV7X21hbmRpcn0vbWFuOC9ta2ZzLmV4dDIuOCoKKyV7X21hbmRpcn0vbWFuOC9ta2ZzLmV4dDMuOCoKKyV7X21hbmRpcn0vbWFuOC9ta2ZzLmV4dDQuOCoKKyV7X21hbmRpcn0vbWFuOC9ta2ZzLmV4dDRkZXYuOCoKKyV7X21hbmRpcn0vbWFuOC9ta2xvc3QrZm91bmQuOCoKKyV7X21hbmRpcn0vbWFuOC9yZXNpemUyZnMuOCoKKyV7X21hbmRpcn0vbWFuOC90dW5lMmZzLjgqCisle19tYW5kaXJ9L21hbjgvZmlsZWZyYWcuOCoKKyV7X21hbmRpcn0vbWFuOC9lMmZyZWVmcmFnLjgqCisKKyVmaWxlcyBkZXZlbAorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19pbmZvZGlyfS9saWJleHQyZnMuaW5mbyoKKyV7X2JpbmRpcn0vY29tcGlsZV9ldAorJXtfYmluZGlyfS9ta19jbWRzCisKKyV7X2xpYmRpcn0vbGliYmxraWQuYQorJXtfbGliZGlyfS9saWJibGtpZC5zbworJXtfbGliZGlyfS9saWJjb21fZXJyLmEKKyV7X2xpYmRpcn0vbGliY29tX2Vyci5zbworJXtfbGliZGlyfS9saWJlMnAuYQorJXtfbGliZGlyfS9saWJlMnAuc28KKyV7X2xpYmRpcn0vbGliZXh0MmZzLmEKKyV7X2xpYmRpcn0vbGliZXh0MmZzLnNvCisle19saWJkaXJ9L2xpYnNzLmEKKyV7X2xpYmRpcn0vbGlic3Muc28KKyV7X2xpYmRpcn0vbGlidXVpZC5hCisle19saWJkaXJ9L2xpYnV1aWQuc28KKworJXtfbGliZGlyfS9wa2djb25maWcvYmxraWQucGMKKyV7X2xpYmRpcn0vcGtnY29uZmlnL2NvbV9lcnIucGMKKyV7X2xpYmRpcn0vcGtnY29uZmlnL2UycC5wYworJXtfbGliZGlyfS9wa2djb25maWcvZXh0MmZzLnBjCisle19saWJkaXJ9L3BrZ2NvbmZpZy9zcy5wYworJXtfbGliZGlyfS9wa2djb25maWcvdXVpZC5wYworCisle19kYXRhZGlyfS9ldAorJXtfZGF0YWRpcn0vc3MKKyV7X2luY2x1ZGVkaXJ9L2Jsa2lkCisle19pbmNsdWRlZGlyfS9lMnAKKyV7X2luY2x1ZGVkaXJ9L2V0Cisle19pbmNsdWRlZGlyfS9leHQyZnMKKyV7X2luY2x1ZGVkaXJ9L3NzCisle19pbmNsdWRlZGlyfS91dWlkCisle19tYW5kaXJ9L21hbjEvY29tcGlsZV9ldC4xKgorJXtfbWFuZGlyfS9tYW4xL21rX2NtZHMuMSoKKyV7X21hbmRpcn0vbWFuMy9jb21fZXJyLjMqCisle19tYW5kaXJ9L21hbjMvbGliYmxraWQuMyoKKyV7X21hbmRpcn0vbWFuMy91dWlkLjMqCisle19tYW5kaXJ9L21hbjMvdXVpZF9jbGVhci4zKgorJXtfbWFuZGlyfS9tYW4zL3V1aWRfY29tcGFyZS4zKgorJXtfbWFuZGlyfS9tYW4zL3V1aWRfY29weS4zKgorJXtfbWFuZGlyfS9tYW4zL3V1aWRfZ2VuZXJhdGUuMyoKKyV7X21hbmRpcn0vbWFuMy91dWlkX2dlbmVyYXRlX3JhbmRvbS4zKgorJXtfbWFuZGlyfS9tYW4zL3V1aWRfZ2VuZXJhdGVfdGltZS4zKgorJXtfbWFuZGlyfS9tYW4zL3V1aWRfaXNfbnVsbC4zKgorJXtfbWFuZGlyfS9tYW4zL3V1aWRfcGFyc2UuMyoKKyV7X21hbmRpcn0vbWFuMy91dWlkX3RpbWUuMyoKKyV7X21hbmRpcn0vbWFuMy91dWlkX3VucGFyc2UuMyoKKworJWZpbGVzIC1uIHV1aWRkCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyMgaWYgeW91IHdhbnQgdG8gcnVuIHZpYSBpbml0CisjIC9ldGMvaW5pdC5kL3V1aWRkCisle19tYW5kaXJ9L21hbjgvdXVpZGQuOCoKKyVhdHRyKDY3NTUsIHV1aWRkLCB1dWlkZCkgJXtfc2JpbmRpcn0vdXVpZGQKKyVkaXIgJWF0dHIoMjc3NSwgdXVpZGQsIHV1aWRkKSAvdmFyL2xpYi9saWJ1dWlkCisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW5zdGFsbC11dGlscy9jb21waWxlX21hbnBhZ2VzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnN0YWxsLXV0aWxzL2NvbXBpbGVfbWFucGFnZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmJkYgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW5zdGFsbC11dGlscy9jb21waWxlX21hbnBhZ2VzCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorCitNQU44PSJkZWJ1Z2ZzIGJhZGJsb2NrcyBlMmZzY2sgbWtlMmZzIGR1bXBlMmZzIG1rbG9zdCtmb3VuZCBcCisJZnNjayB0dW5lMmZzIgorTUFOMT0ibHNhdHRyIGNoYXR0ciIKKworZm9yIGkgaW4gJE1BTjgKK2RvCisJbWFuIC1TIDggJGkgPiAvZGV2L251bGwKK2RvbmUKKworCitmb3IgaSBpbiAkTUFOMQorZG8KKwltYW4gLVMgMSAkaSA+IC9kZXYvbnVsbAorZG9uZQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW5zdGFsbC11dGlscy9jb252ZnN0YWIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2luc3RhbGwtdXRpbHMvY29udmZzdGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTYwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2luc3RhbGwtdXRpbHMvY29udmZzdGFiCkBAIC0wLDAgKzEsNzggQEAKKyMhL2Jpbi9zaAorIyAgTWFrZSAvZXRjL2ZzdGFiIHN0YW5kYXJkIGNvbXBsaWFudC4KKyMgIE0uV2VsbGVyIChlb3dtb2JAZXhwLW1hdGgudW5pLWVzc2VuLmRlKSAxMy4xMS4xOTk0LgorIyAgVGhpcyBzY3JpcHQgaXMgcHVibGljIGRvbWFpbi4gU3RpbGwgaWYgb25seSBzbGlnaHRseQorIyAgbW9kaWZpZWQgYSBjcmVkaXQgdG8gbWUgbWlnaHQgYmUgbmljZS4KKworUk9PVF9QQVNTPTEJCSMgUGFzcyBmb3Igcm9vdCBmaWxlIHN5c3RlbQorTk9OX1JPT1RfUEFTUz0yCQkjIFBhc3MgZm9yIG5vbiByb290IGZpbGUgc3lzdGVtcworREVGX0ZMQUdTPSJkZWZhdWx0cyIJIyBEZWZhdWx0IGZpbGVzeXNmbGFncworREVGX0RVTVA9MAkJIyBEZWZhdWx0IGR1bXBmcmVxLgorCQord2hpbGUgcmVhZCBMSU5FCitkbworICBzZXQgLS0gJExJTkUKKyAgaWYgWyAkIyAhPSAwIF0KKyAgdGhlbgorICAgIGNhc2UgJDEgaW4KKyAgICAgIFwjKiB8ICEqICkKKwllY2hvICIkTElORSIKKwkjICBBY3R1YWxseSB0aGVyZSBhcmUgbm8gY29tbWVudHMgYWxsb3dlZCBpbiAvZXRjL2ZzdGFiCisJZWNobyAiV2FybmluZzogY29tbWVudCBpbiAvZXRjL2ZzdGFiIGRldGVjdGVkLiIgPiYyCisJZWNobyAiUGxlYXNlIHJlbW92ZSBpdCBieSBoYW5kLiIgPiYyCisJOzsKKyAgICAgICogKQorCWlmIFsgJCMgLWd0IDYgXSB8fCBbICQjIC1sdCAzIF0KKwl0aGVuCisJICBlY2hvICJEb24ndCBoYXZlIGEgY2x1ZSBhYm91dCBcIiRMSU5FXCIuIiA+JjIKKwkgIGVjaG8gIiRMSU5FIgorCWVsc2UKKwkgIGNhc2UgJDIgaW4KKwkgICAgLyApCisJICAgICAgUEFTUz0kUk9PVF9QQVNTCisJICAgICAgOzsKKwkgICAgbm9uZSApCisJICAgICAgUEFTUz0wCisJICAgICAgOzsKKwkgICAgKiApCisJICAgICAgUEFTUz0kTk9OX1JPT1RfUEFTUworCSAgICAgIDs7CisJICBlc2FjCisJICBEVU1QPSRERUZfRFVNUAorCSAgY2FzZSAkMyBpbgorCSAgICBpZ25vcmUgfCBpc285NjYwIHwgbXNkb3MgfCBocGZzIHwgc3lzdiB8IFwKKwkJICB4ZW5peCB8IGNvaGVyZW50IHwgbmZzIHwgcHJvYyB8IHN3IHwgc3dhcCApCisJICAgICAgRFVNUD0wOworCSAgICAgIFBBU1M9MDsKKwkgICAgICA7OworCSAgZXNhYworCSAgY2FzZSAkIyBpbgorCSAgICAzICkKKwkgICAgICBlY2hvICIkTElORQkkREVGX0ZMQUdTCSREVU1QCSRQQVNTIgorCSAgICAgIDs7CisJICAgIDQgKQorCSAgICAgIGVjaG8gIiRMSU5FCSREVU1QCSRQQVNTIgorCSAgICAgIDs7CisJICAgIDUgKQorCSAgICAgIGVjaG8gIiRMSU5FCSRQQVNTIgorCSAgICAgIDs7CisJICAgIDYpCisJICAgICAgZWNobyAiJExJTkUiCisJICAgICAgOzsKKwkgIGVzYWMKKwlmaQorCTs7CisgICAgZXNhYworICBlbHNlCisgICAgZWNobyAiV2FybmluZzogT25lIGVtcHR5IGxpbmUgcmVtb3ZlZC4iID4mMgorICBmaQorZG9uZSA8L2V0Yy9mc3RhYiA+L3RtcC9uZXdmc3RhYi4kJAorbXYgLWYgL2V0Yy9mc3RhYiAvZXRjL2ZzdGFiLmJhaworbXYgLWYgL3RtcC9uZXdmc3RhYi4kJCAvZXRjL2ZzdGFiCitpZiBbICQ/ICE9IDAgXQordGhlbgorICBlY2hvICJJbnN0YWxsYXRpb24gb2YgcGF0Y2hlZCAvZXRjL2ZzdGFiIGZhaWxlZC4iCisgIGVjaG8gIkl0IHdvdWxkIGhhdmUgYmVlbjoiCisgIGNhdCAvdG1wL25ld2ZzdGFiLiQkCisgIHJtIC1mIC90bXAvbmV3ZnN0YWIuJCQKK2ZpCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2luc3RhbGwtdXRpbHMvcmVtb3ZlX3ByZWZvcm1hdF9tYW5wYWdlcyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW5zdGFsbC11dGlscy9yZW1vdmVfcHJlZm9ybWF0X21hbnBhZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZGZmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2luc3RhbGwtdXRpbHMvcmVtb3ZlX3ByZWZvcm1hdF9tYW5wYWdlcwpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKworUFJFRk9STUFUX1JPT1Q9L3Vzci9tYW4vcHJlZm9ybWF0CitDT01QSUxFRF9ST09UPS91c3IvbWFuCisKK01BTjg9ImRlYnVnZnMuOCBiYWRibG9ja3MuOCBlMmZzY2suOCBta2UyZnMuOCBkdW1wZTJmcy44IG1rbG9zdCtmb3VuZC44IFwKKwlmc2NrLjggdHVuZTJmcy44IGUybGFiZWwuOCIKK01BTjE9ImxzYXR0ci4xIGNoYXR0ci4xIgorCitmb3IgaSBpbiAkTUFOOAorZG8KKwlybSAtZiAkUFJFRk9STUFUX1JPT1QvY2F0OC8kaSAkQ09NUElMRURfUk9PVC9jYXQ4LyRpIFwKKwkJJFBSRUZPUk1BVF9ST09UL2NhdDgvJGkuZ3ogJENPTVBJTEVEX1JPT1QvY2F0OC8kaS5negorZG9uZQorCisKK2ZvciBpIGluICRNQU4xCitkbworCXJtIC1mICRQUkVGT1JNQVRfUk9PVC9jYXQxLyRpICRDT01QSUxFRF9ST09UL2NhdDEvJGkgXAorCQkkUFJFRk9STUFUX1JPT1QvY2F0MS8kaS5neiAkQ09NUElMRURfUk9PVC9jYXQxLyRpLmd6Citkb25lCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvTWFrZWZpbGUuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmNmY2MgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDUyNCBAQAorIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGxpYnJhcnkgb2YgR05VIGdldHRleHQKKyMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjIFVTQS4KKworUEFDS0FHRSA9IEBQQUNLQUdFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorCitTSEVMTCA9IC9iaW4vc2gKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IC4uCitWUEFUSCA9ICQoc3JjZGlyKQorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK3RyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorbGliZGlyID0gQGxpYmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCitnZXR0ZXh0c3JjZGlyID0gJChkYXRhZGlyKS9nZXR0ZXh0L2ludGwKK2FsaWFzcGF0aCA9ICQobG9jYWxlZGlyKQorc3ViZGlyID0gaW50bAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQoTUtJTlNUQUxMRElSUykKKworQFNFVF9NQUtFQAorCitAaWZHTlVtYWtlQCBWID0KK0BpZkdOVW1ha2VAIGlmZXEgKCQoc3RyaXAgJChWKSksKQorQGlmR05VbWFrZUAgIyAgRSA9IEBlY2hvCitAaWZHTlVtYWtlQCAjICBRID0gQAorQGlmR05VbWFrZUAgICAgRSA9IEBFQAorQGlmR05VbWFrZUAgICAgUSA9IEBRQAorQGlmR05VbWFrZUAgZWxzZQorQGlmR05VbWFrZUAgICAgRSA9IEBcIworQGlmR05VbWFrZUAgICAgUSA9CitAaWZHTlVtYWtlQCBlbmRpZgorCitAaWZOb3RHTlVtYWtlQCBFID0gQEVACitAaWZOb3RHTlVtYWtlQCBRID0gQFFACisKK2wgPSBASU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVhACisKK0FSID0gYXIKK0NDID0gQENDQAorTElCVE9PTCA9IEBMSUJUT09MQAorUkFOTElCID0gQFJBTkxJQkAKK1lBQ0MgPSBASU5UTEJJU09OQCAteSAtZAorWUZMQUdTID0gLS1uYW1lLXByZWZpeD1fX2dldHRleHQKKworREVGUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLURMT0NBTEVfQUxJQVNfUEFUSD1cIiQoYWxpYXNwYXRoKVwiIFwKKy1ETElCRElSPVwiJChsaWJkaXIpXCIgLURJTl9MSUJJTlRMIFwKKy1ERU5BQkxFX1JFTE9DQVRBQkxFPTEgLURJTl9MSUJSQVJZIC1ESU5TVEFMTERJUj1cIiQobGliZGlyKVwiIC1ETk9fWE1BTExPQyBcCistRHNldF9yZWxvY2F0aW9uX3ByZWZpeD1saWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBcCistRHJlbG9jYXRlPWxpYmludGxfcmVsb2NhdGUgXAorLURERVBFTkRTX09OX0xJQklDT05WPTEgQERFRlNACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NGTEFHUyA9IEBDRkxBR1NACitMREZMQUdTID0gQExERkxBR1NACitMSUJTID0gQExJQlNACisKK0NPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCisKK0hFQURFUlMgPSBcCisgIGdtby5oIFwKKyAgZ2V0dGV4dFAuaCBcCisgIGhhc2gtc3RyaW5nLmggXAorICBsb2FkaW5mby5oIFwKKyAgcGx1cmFsLWV4cC5oIFwKKyAgZXZhbC1wbHVyYWwuaCBcCisgIGxvY2FsY2hhcnNldC5oIFwKKyAgcmVsb2NhdGFibGUuaCBcCisgIHhzaXplLmggXAorICBwcmludGYtYXJncy5oIHByaW50Zi1hcmdzLmMgXAorICBwcmludGYtcGFyc2UuaCB3cHJpbnRmLXBhcnNlLmggcHJpbnRmLXBhcnNlLmMgXAorICB2YXNucHJpbnRmLmggdmFzbndwcmludGYuaCB2YXNucHJpbnRmLmMgXAorICBvczJjb21wYXQuaCBcCisgIGxpYmdudWludGwuaC5pbgorU09VUkNFUyA9IFwKKyAgYmluZHRleHRkb20uYyBcCisgIGRjZ2V0dGV4dC5jIFwKKyAgZGdldHRleHQuYyBcCisgIGdldHRleHQuYyBcCisgIGZpbmRkb21haW4uYyBcCisgIGxvYWRtc2djYXQuYyBcCisgIGxvY2FsZWFsaWFzLmMgXAorICB0ZXh0ZG9tYWluLmMgXAorICBsMTBuZmxpc3QuYyBcCisgIGV4cGxvZGVuYW1lLmMgXAorICBkY2lnZXR0ZXh0LmMgXAorICBkY25nZXR0ZXh0LmMgXAorICBkbmdldHRleHQuYyBcCisgIG5nZXR0ZXh0LmMgXAorICBwbHVyYWwueSBcCisgIHBsdXJhbC1leHAuYyBcCisgIGxvY2FsY2hhcnNldC5jIFwKKyAgcmVsb2NhdGFibGUuYyBcCisgIGxvY2FsZW5hbWUuYyBcCisgIGxvZy5jIFwKKyAgcHJpbnRmLmMgXAorICBvc2RlcC5jIFwKKyAgb3MyY29tcGF0LmMgXAorICBpbnRsLWNvbXBhdC5jCitPQkpFQ1RTID0gXAorICBiaW5kdGV4dGRvbS4kbG8gXAorICBkY2dldHRleHQuJGxvIFwKKyAgZGdldHRleHQuJGxvIFwKKyAgZ2V0dGV4dC4kbG8gXAorICBmaW5kZG9tYWluLiRsbyBcCisgIGxvYWRtc2djYXQuJGxvIFwKKyAgbG9jYWxlYWxpYXMuJGxvIFwKKyAgdGV4dGRvbWFpbi4kbG8gXAorICBsMTBuZmxpc3QuJGxvIFwKKyAgZXhwbG9kZW5hbWUuJGxvIFwKKyAgZGNpZ2V0dGV4dC4kbG8gXAorICBkY25nZXR0ZXh0LiRsbyBcCisgIGRuZ2V0dGV4dC4kbG8gXAorICBuZ2V0dGV4dC4kbG8gXAorICBwbHVyYWwuJGxvIFwKKyAgcGx1cmFsLWV4cC4kbG8gXAorICBsb2NhbGNoYXJzZXQuJGxvIFwKKyAgcmVsb2NhdGFibGUuJGxvIFwKKyAgbG9jYWxlbmFtZS4kbG8gXAorICBsb2cuJGxvIFwKKyAgcHJpbnRmLiRsbyBcCisgIG9zZGVwLiRsbyBcCisgIGludGwtY29tcGF0LiRsbworRElTVEZJTEVTLmNvbW1vbiA9IE1ha2VmaWxlLmluIFwKK2NvbmZpZy5jaGFyc2V0IGxvY2FsZS5hbGlhcyByZWYtYWRkLnNpbiByZWYtZGVsLnNpbiAkKEhFQURFUlMpICQoU09VUkNFUykKK0RJU1RGSUxFUy5nZW5lcmF0ZWQgPSBwbHVyYWwuYworRElTVEZJTEVTLm5vcm1hbCA9IFZFUlNJT04KK0RJU1RGSUxFUy5nZXR0ZXh0ID0gQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSBsaWJpbnRsLmdsaWJjIFwKK2xpYmdudWludGwuaF92bXMgTWFrZWZpbGUudm1zIFwKK2xpYmdudWludGwuaC5tc3ZjLXN0YXRpYyBsaWJnbnVpbnRsLmgubXN2Yy1zaGFyZWQgUkVBRE1FLndvZTMyIE1ha2VmaWxlLm1zdmMKK0RJU1RGSUxFUy5vYnNvbGV0ZSA9IHhvcGVuLW1zZy5zZWQgbGludXgtbXNnLnNlZCBwbzJ0Ymwuc2VkLmluIGNhdC1jb21wYXQuYyBcCitDT1BZSU5HLkxJQi0yIGdldHRleHQuaCBsaWJnZXR0ZXh0LmggcGx1cmFsLWV2YWwuYyBsaWJnbnVpbnRsLmgKKworYWxsOiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQAorYWxsLXllczogbGliaW50bC4kbGEgbGliaW50bC5oIGNoYXJzZXQuYWxpYXMgcmVmLWFkZC5zZWQgcmVmLWRlbC5zZWQKK2FsbC1ubzogYWxsLW5vLUBCVUlMRF9JTkNMVURFRF9MSUJJTlRMQAorYWxsLW5vLXllczogbGliZ251aW50bC4kbGEKK2FsbC1uby1ubzoKKworbGliaW50bC5hIGxpYmdudWludGwuYTogJChPQkpFQ1RTKQorCSQoUSkgcm0gLWYgJEAKKwkkKEUpICIJQVIgJEAiCisJJChRKSAkKEFSKSBjcnUgJEAgJChPQkpFQ1RTKQorCSQoRSkgIglSQU5MSUIgJEAiCisJJChRKSAkKFJBTkxJQikgJEAKKworbGliaW50bC5sYSBsaWJnbnVpbnRsLmxhOiAkKE9CSkVDVFMpCisJJChMSUJUT09MKSAtLW1vZGU9bGluayBcCisJICAkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIFwKKwkgICQoT0JKRUNUUykgQExUTElCSUNPTlZAICQoTElCUykgLWxjIFwKKwkgIC12ZXJzaW9uLWluZm8gJChMVFZfQ1VSUkVOVCk6JChMVFZfUkVWSVNJT04pOiQoTFRWX0FHRSkgXAorCSAgLXJwYXRoICQobGliZGlyKSBcCisJICAtbm8tdW5kZWZpbmVkCisKKyMgTGlidG9vbCdzIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGliaW50bC4KKyMgQmVmb3JlIG1ha2luZyBhIGdldHRleHQgcmVsZWFzZSwgdGhlIGdldHRleHQgbWFpbnRhaW5lciBtdXN0IGNoYW5nZSB0aGlzCisjIGFjY29yZGluZyB0byB0aGUgbGlidG9vbCBkb2N1bWVudGF0aW9uLCBzZWN0aW9uICJMaWJyYXJ5IGludGVyZmFjZSB2ZXJzaW9ucyIuCisjIE1haW50YWluZXJzIG9mIG90aGVyIHBhY2thZ2VzIHRoYXQgaW5jbHVkZSB0aGUgaW50bCBkaXJlY3RvcnkgbXVzdCAqbm90KgorIyBjaGFuZ2UgdGhlc2UgdmFsdWVzLgorTFRWX0NVUlJFTlQ9NworTFRWX1JFVklTSU9OPTAKK0xUVl9BR0U9NAorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC55IC5vIC5sbyAuc2luIC5zZWQKKworLmMubzoKKwkkKEUpICIJQ0MgJDwiCisJJChRKSAkKENPTVBJTEUpICQ8CisKKy55LmM6CisJJChZQUNDKSAkKFlGTEFHUykgLS1vdXRwdXQgJEAgJDwKKwlybSAtZiAkKi5oCisKK2JpbmR0ZXh0ZG9tLmxvOiAkKHNyY2RpcikvYmluZHRleHRkb20uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvYmluZHRleHRkb20uYworZGNnZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNnZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjZ2V0dGV4dC5jCitkZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RnZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RnZXR0ZXh0LmMKK2dldHRleHQubG86ICQoc3JjZGlyKS9nZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2dldHRleHQuYworZmluZGRvbWFpbi5sbzogJChzcmNkaXIpL2ZpbmRkb21haW4uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZmluZGRvbWFpbi5jCitsb2FkbXNnY2F0LmxvOiAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2FkbXNnY2F0LmMKK2xvY2FsZWFsaWFzLmxvOiAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYwordGV4dGRvbWFpbi5sbzogJChzcmNkaXIpL3RleHRkb21haW4uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvdGV4dGRvbWFpbi5jCitsMTBuZmxpc3QubG86ICQoc3JjZGlyKS9sMTBuZmxpc3QuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbDEwbmZsaXN0LmMKK2V4cGxvZGVuYW1lLmxvOiAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYworZGNpZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjaWdldHRleHQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNpZ2V0dGV4dC5jCitkY25nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY25nZXR0ZXh0LmMKK2RuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RuZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kbmdldHRleHQuYworbmdldHRleHQubG86ICQoc3JjZGlyKS9uZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9uZ2V0dGV4dC5jCitwbHVyYWwubG86ICQoc3JjZGlyKS9wbHVyYWwuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcGx1cmFsLmMKK3BsdXJhbC1leHAubG86ICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC1leHAuYworbG9jYWxjaGFyc2V0LmxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCityZWxvY2F0YWJsZS5sbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKK2xvY2FsZW5hbWUubG86ICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZW5hbWUuYworbG9nLmxvOiAkKHNyY2RpcikvbG9nLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvZy5jCitwcmludGYubG86ICQoc3JjZGlyKS9wcmludGYuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcHJpbnRmLmMKK29zZGVwLmxvOiAkKHNyY2Rpcikvb3NkZXAuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2Rpcikvb3NkZXAuYworaW50bC1jb21wYXQubG86ICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCisKK3JlZi1hZGQuc2VkOiAkKHNyY2RpcikvcmVmLWFkZC5zaW4KKwkkKEUpICIJU0VEIHJlZi1hZGQuc2VkIgorCSQoUSkgc2VkIC1lICcvXiMvZCcgLWUgJ3MvQCcnUEFDS0FHRScnQC9AUEFDS0FHRUAvZycgJChzcmNkaXIpL3JlZi1hZGQuc2luID4gdC1yZWYtYWRkLnNlZAorCSQoUSkgbXYgdC1yZWYtYWRkLnNlZCByZWYtYWRkLnNlZAorcmVmLWRlbC5zZWQ6ICQoc3JjZGlyKS9yZWYtZGVsLnNpbgorCSQoRSkgIglTRUQgcmVmLWRlbC5zZWQiCisJJChRKSBzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWRlbC5zaW4gPiB0LXJlZi1kZWwuc2VkCisJJChRKSBtdiB0LXJlZi1kZWwuc2VkIHJlZi1kZWwuc2VkCisKK0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JLi4KKworbGliZ251aW50bC5oOiAkKHNyY2RpcikvbGliZ251aW50bC5oLmluCisJJChFKSAiCVNFRCBsaWJnbnVpbnRsLmggIgorCSQoUSkgc2VkIC1lICdzLEAnJ0hBVkVfUE9TSVhfUFJJTlRGJydALEBIQVZFX1BPU0lYX1BSSU5URkAsZycgXAorCSAgICAtZSAncyxAJydIQVZFX0FTUFJJTlRGJydALEBIQVZFX0FTUFJJTlRGQCxnJyBcCisJICAgIC1lICdzLEAnJ0hBVkVfU05QUklOVEYnJ0AsQEhBVkVfU05QUklOVEZALGcnIFwKKwkgICAgLWUgJ3MsQCcnSEFWRV9XUFJJTlRGJydALEBIQVZFX1dQUklOVEZALGcnIFwKKwkgIDwgJChzcmNkaXIpL2xpYmdudWludGwuaC5pbiA+IGxpYmdudWludGwuaCAKKworbGliaW50bC5oOiBsaWJnbnVpbnRsLmgKKwkkKEUpICIJQ1AgbGliaW50bC5oIgorCSQoUSkgY3AgbGliZ251aW50bC5oIGxpYmludGwuaAorCitjaGFyc2V0LmFsaWFzOiAkKHNyY2RpcikvY29uZmlnLmNoYXJzZXQKKwkkKEUpICIJQ09ORklHLkNIQVJTRVQgJEAiCisJJChRKSAkKFNIRUxMKSAkKHNyY2RpcikvY29uZmlnLmNoYXJzZXQgJ0Bob3N0QCcgPiB0LSRACisJJChRKSBtdiB0LSRAICRACisKK2NoZWNrOiBhbGwKKworIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCisjIHN5c3RlbSB3aGljaCBoYXMgdGhlIEdOVSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCisjIHNlcGFyYXRlIGxpYnJhcnkuCisjIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQorIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCitpbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCitpbnN0YWxsLWV4ZWM6IGFsbAorCSQoUSkgaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikgJChERVNURElSKSQoaW5jbHVkZWRpcik7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLmggJChERVNURElSKSQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCisJICAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpIGxpYmludGwuJGxhICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC4kbGE7IFwKKwkgIGlmIHRlc3QgIkBSRUxPQ0FUQUJMRUAiID0geWVzOyB0aGVuIFwKKwkgICAgZGVwZW5kZW5jaWVzPWBzZWQgLW4gLWUgJ3MsXmRlcGVuZGVuY3lfbGlicz1cKC4qXCksXDEscCcgPCAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwubGEgfCBzZWQgLWUgInMsXicsLCIgLWUgInMsJ1wkJCwsImA7IFwKKwkgICAgaWYgdGVzdCAtbiAiJCRkZXBlbmRlbmNpZXMiOyB0aGVuIFwKKwkgICAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwubGE7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJJChRKSBpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubzsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcik7IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgXAorCSAgICAkKElOU1RBTExfREFUQSkgbGliZ251aW50bC4kbGEgJChERVNURElSKSQobGliZGlyKS9saWJnbnVpbnRsLiRsYTsgXAorCSAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCisJICAkKElOU1RBTExfREFUQSkgJChERVNURElSKSQobGliZGlyKS9saWJnbnVpbnRsLnNvICQoREVTVERJUikkKGxpYmRpcikvcHJlbG9hZGFibGVfbGliaW50bC5zbzsgXAorCSAgJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJnbnVpbnRsLiRsYTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCWlmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKKwkgIHRlc3QgQEdMSUJDMjFAICE9IG5vIHx8ICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKTsgXAorCSAgdGVtcD0kKERFU1RESVIpJChsaWJkaXIpL3QtY2hhcnNldC5hbGlhczsgXAorCSAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKKwkgIGlmIHRlc3QgLWYgJChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyB0aGVuIFwKKwkgICAgb3JpZz0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKKwkgICAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICBybSAtZiAkJHRlbXA7IFwKKwkgIGVsc2UgXAorCSAgICBpZiB0ZXN0IEBHTElCQzIxQCA9IG5vOyB0aGVuIFwKKwkgICAgICBvcmlnPWNoYXJzZXQuYWxpYXM7IFwKKwkgICAgICBzZWQgLWYgcmVmLWFkZC5zZWQgJCRvcmlnID4gJCR0ZW1wOyBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKwkgICAgICBybSAtZiAkJHRlbXA7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKKwkgIHRlc3QgLWYgJChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXMgXAorCSAgICAmJiBvcmlnPSQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzIFwKKwkgICAgfHwgb3JpZz0kKHNyY2RpcikvbG9jYWxlLmFsaWFzOyBcCisJICB0ZW1wPSQoREVTVERJUikkKGxvY2FsZWRpcikvdC1sb2NhbGUuYWxpYXM7IFwKKwkgIGRlc3Q9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXM7IFwKKwkgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCisJICBybSAtZiAkJHRlbXA7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK2luc3RhbGwtZGF0YTogYWxsCisJJChRKSBpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCisJICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCisJICAkKElOU1RBTExfREFUQSkgQ2hhbmdlTG9nLmluc3QgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvQ2hhbmdlTG9nOyBcCisJICBkaXN0cz0iQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pIjsgXAorCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSBcCisJCQkgICAgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCisJICBkb25lOyBcCisJICBjaG1vZCBhK3ggJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvY29uZmlnLmNoYXJzZXQ7IFwKKwkgIGRpc3RzPSIkKERJU1RGSUxFUy5nZW5lcmF0ZWQpIjsgXAorCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRkaXIvJCRmaWxlIFwKKwkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwkgIGRpc3RzPSIkKERJU1RGSUxFUy5vYnNvbGV0ZSkiOyBcCisJICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisKK2luc3RhbGxkaXJzOgorCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAorCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKworaW5zdGFsbC1zaGxpYnM6CisKK3VuaW5zdGFsbC1zaGxpYnM6CisKK2luc3RhbGwtc2hsaWJzLXN0cmlwOgorCit1bmluc3RhbGw6CisJaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICBybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC4kbGE7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubzsgdGhlbiBcCisJICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgdGhlbiBcCisJICAgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKKwkgICAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKKwkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAorCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAorCSAgICAgIHJtIC1mICQkZGVzdDsgXAorCSAgICBlbHNlIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICBmaTsgXAorCSAgICBybSAtZiAkJHRlbXA7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyB0aGVuIFwKKwkgICAgdGVtcD0kKERFU1RESVIpJChsb2NhbGVkaXIpL3QtbG9jYWxlLmFsaWFzOyBcCisJICAgIGRlc3Q9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXM7IFwKKwkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAorCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAorCSAgICAgIHJtIC1mICQkZGVzdDsgXAorCSAgICBlbHNlIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICBmaTsgXAorCSAgICBybSAtZiAkJHRlbXA7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAorCSAgZm9yIGZpbGUgaW4gVkVSU0lPTiBDaGFuZ2VMb2cgQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCk7IGRvIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCisJICBkb25lOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKK2luZm8gZHZpIHBzIHBkZiBodG1sOgorCiskKE9CSkVDVFMpOiBsaWJnbnVpbnRsLmgKK2JpbmR0ZXh0ZG9tLiRsbyBkY2dldHRleHQuJGxvIGRjaWdldHRleHQuJGxvIGRjbmdldHRleHQuJGxvIGRnZXR0ZXh0LiRsbyBkbmdldHRleHQuJGxvIGZpbmRkb21haW4uJGxvIGdldHRleHQuJGxvIGludGwtY29tcGF0LiRsbyBsb2FkbXNnY2F0LiRsbyBsb2NhbGVhbGlhcy4kbG8gbmdldHRleHQuJGxvIHRleHRkb21haW4uJGxvOiAkKHNyY2RpcikvZ2V0dGV4dFAuaCAkKHNyY2RpcikvZ21vLmggJChzcmNkaXIpL2xvYWRpbmZvLmgKK2RjaWdldHRleHQuJGxvIGxvYWRtc2djYXQuJGxvOiAkKHNyY2RpcikvaGFzaC1zdHJpbmcuaAorZXhwbG9kZW5hbWUuJGxvIGwxMG5mbGlzdC4kbG86ICQoc3JjZGlyKS9sb2FkaW5mby5oCitkY2lnZXR0ZXh0LiRsbyBsb2FkbXNnY2F0LiRsbyBwbHVyYWwuJGxvIHBsdXJhbC1leHAuJGxvOiAkKHNyY2RpcikvcGx1cmFsLWV4cC5oCitkY2lnZXR0ZXh0LiRsbzogJChzcmNkaXIpL2V2YWwtcGx1cmFsLmgKK2xvY2FsY2hhcnNldC4kbG86ICQoc3JjZGlyKS9sb2NhbGNoYXJzZXQuaAorbG9jYWxlYWxpYXMuJGxvIGxvY2FsY2hhcnNldC4kbG8gcmVsb2NhdGFibGUuJGxvOiAkKHNyY2RpcikvcmVsb2NhdGFibGUuaAorcHJpbnRmLiRsbzogJChzcmNkaXIpL3ByaW50Zi1hcmdzLmggJChzcmNkaXIpL3ByaW50Zi1hcmdzLmMgJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5oICQoc3JjZGlyKS93cHJpbnRmLXBhcnNlLmggJChzcmNkaXIpL3hzaXplLmggJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5jICQoc3JjZGlyKS92YXNucHJpbnRmLmggJChzcmNkaXIpL3Zhc253cHJpbnRmLmggJChzcmNkaXIpL3Zhc25wcmludGYuYworCit0YWdzOiBUQUdTCisKK1RBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQorCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBldGFncyAtbyAkJGhlcmUvVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKKworY3RhZ3M6IENUQUdTCisKK0NUQUdTOiAkKEhFQURFUlMpICQoU09VUkNFUykKKwloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgY3RhZ3MgLW8gJCRoZXJlL0NUQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQorCitpZDogSUQKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKQorCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBta2lkIC1mJCRoZXJlL0lEICQoSEVBREVSUykgJChTT1VSQ0VTKQorCisKK21vc3RseWNsZWFuOgorCXJtIC1mICouYSAqLmxhICoubyAqLm9iaiAqLmxvIGNvcmUgY29yZS4qCisJcm0gLWYgbGliZ251aW50bC5oIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCisJcm0gLWYgLXIgLmxpYnMgX2xpYnMKKworY2xlYW46IG1vc3RseWNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSBJRCBUQUdTCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICBybSAtZiBDaGFuZ2VMb2cuaW5zdCAkKERJU1RGSUxFUy5ub3JtYWwpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKK21haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgorCSQoRSkgIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwkkKEUpICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworCisjIEdOVSBnZXR0ZXh0IG5lZWRzIG5vdCBjb250YWluIHRoZSBmaWxlIGBWRVJTSU9OJyBidXQgY29udGFpbnMgc29tZQorIyBvdGhlciBmaWxlcyB3aGljaCBzaG91bGQgbm90IGJlIGRpc3RyaWJ1dGVkIGluIG90aGVyIHBhY2thZ2VzLgorZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKK2Rpc3QgZGlzdGRpcjogTWFrZWZpbGUKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICA6IDsgXAorCWVsc2UgXAorCSAgaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIjsgdGhlbiBcCisJICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLmdldHRleHQpIjsgXAorCSAgZWxzZSBcCisJICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCisJICBmaTsgXAorCSAgJChNQUtFKSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCkgJCRhZGRpdGlvbmFsOyBcCisJICBmb3IgZmlsZSBpbiBDaGFuZ2VMb2cgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpICQkYWRkaXRpb25hbDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAorCSAgICBjcCAtcCAkJGRpci8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCSAgZG9uZTsgXAorCWZpCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKyMJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworIyBUaGlzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgZG9lc24ndCB3b3JrIGFueSBtb3JlIHdpdGggYXV0b2NvbmYtMi41NywKKyMgd2hlbiBBQ19DT05GSUdfRklMRVMoW2ludGwvTWFrZWZpbGU6c29tZWRpci9NYWtlZmlsZS5pbl0pIGlzIHVzZWQuCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvVkVSU0lPTiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Yjg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvVkVSU0lPTgpAQCAtMCwwICsxIEBACitHTlUgZ2V0dGV4dCBsaWJyYXJ5IGZyb20gZ2V0dGV4dC0wLjE0LjEKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9iaW5kdGV4dGRvbS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2JpbmR0ZXh0ZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NDIyNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9iaW5kdGV4dGRvbS5jCkBAIC0wLDAgKzEsMzYyIEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmluZHRleHRkb21haW4oMykgZnVuY3Rpb24KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorCisjaWZkZWYgX0xJQkMKKy8qIFdlIGhhdmUgdG8gaGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCisjIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+CisjZWxzZQorLyogUHJvdmlkZSBkdW1teSBpbXBsZW1lbnRhdGlvbiBpZiB0aGlzIGlzIG91dHNpZGUgZ2xpYmMuICAqLworIyBkZWZpbmUgX19saWJjX3J3bG9ja19kZWZpbmUoQ0xBU1MsIE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX3dybG9jayhOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja191bmxvY2soTkFNRSkKKyNlbmRpZgorCisvKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50CisgICBuYW1lcyB0aGFuIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gR05VIGxpYmMsIG90aGVyd2lzZSBwcm9ncmFtcworICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCisjaWYgIWRlZmluZWQgX0xJQkMKKyMgZGVmaW5lIF9ubF9kZWZhdWx0X2Rpcm5hbWUgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWUKKyMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKKyNlbmRpZgorCisvKiBTb21lIGNvbXBpbGVycywgbGlrZSBTdW5PUzQgY2MsIGRvbid0IGhhdmUgb2Zmc2V0b2YgaW4gPHN0ZGRlZi5oPi4gICovCisjaWZuZGVmIG9mZnNldG9mCisjIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKKyNpZmRlZiBfTElCQworZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZV9pbnRlcm5hbFtdIGF0dHJpYnV0ZV9oaWRkZW47CisjZWxzZQorIyBkZWZpbmUgSU5UVVNFKG5hbWUpIG5hbWUKKyNlbmRpZgorCisvKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucy4gICovCitleHRlcm4gc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisKKy8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLworX19saWJjX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEJJTkRURVhURE9NQUlOIF9fYmluZHRleHRkb21haW4KKyMgZGVmaW5lIEJJTkRfVEVYVERPTUFJTl9DT0RFU0VUIF9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKKyMgaWZuZGVmIHN0cmR1cAorIyAgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgQklORFRFWFRET01BSU4gbGliaW50bF9iaW5kdGV4dGRvbWFpbgorIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAorI2VuZGlmCisKKy8qIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IG5hbWUgKkRJUk5BTUVQIGFuZCB0aGUgb3V0cHV0IGNvZGVzZXQgKkNPREVTRVRQCisgICB0byBiZSB1c2VkIGZvciB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cuCisgICBJZiAqRElSTkFNRVAgb3IgKkNPREVTRVRQIGlzIE5VTEwsIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBpcyBub3QKKyAgIG1vZGlmaWVkLCBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIGlzIHJldHVybmVkLgorICAgSWYgRElSTkFNRVAgb3IgQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5laXRoZXIKKyAgIG1vZGlmaWVkIG5vciByZXR1cm5lZC4gICovCitzdGF0aWMgdm9pZAorc2V0X2JpbmRpbmdfdmFsdWVzIChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCQkgICAgY29uc3QgY2hhciAqKmRpcm5hbWVwLCBjb25zdCBjaGFyICoqY29kZXNldHApCit7CisgIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOworICBpbnQgbW9kaWZpZWQ7CisKKyAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KKyAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCB8fCBkb21haW5uYW1lWzBdID09ICdcMCcpCisgICAgeworICAgICAgaWYgKGRpcm5hbWVwKQorCSpkaXJuYW1lcCA9IE5VTEw7CisgICAgICBpZiAoY29kZXNldHApCisJKmNvZGVzZXRwID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX19saWJjX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICBtb2RpZmllZCA9IDA7CisKKyAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7CisgICAgICBpZiAoY29tcGFyZSA9PSAwKQorCS8qIFdlIGZvdW5kIGl0ISAgKi8KKwlicmVhazsKKyAgICAgIGlmIChjb21wYXJlIDwgMCkKKwl7CisJICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLworCSAgYmluZGluZyA9IE5VTEw7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChiaW5kaW5nICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGRpcm5hbWVwKQorCXsKKwkgIGNvbnN0IGNoYXIgKmRpcm5hbWUgPSAqZGlybmFtZXA7CisKKwkgIGlmIChkaXJuYW1lID09IE5VTEwpCisJICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KKwkgICAgKmRpcm5hbWVwID0gYmluZGluZy0+ZGlybmFtZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKKwkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKKwkJIG9sZCBiaW5kaW5nLiAgKi8KKwkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5kaXJuYW1lOworCSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIHJlc3VsdCkgIT0gMCkKKwkJeworCQkgIGlmIChzdHJjbXAgKGRpcm5hbWUsIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKSkgPT0gMCkKKwkJICAgIHJlc3VsdCA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKwkJICBlbHNlCisJCSAgICB7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisJCSAgICAgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7CisjZWxzZQorCQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7CisJCSAgICAgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKwkJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKwkJCW1lbWNweSAocmVzdWx0LCBkaXJuYW1lLCBsZW4pOworI2VuZGlmCisJCSAgICB9CisKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQorCQkgICAgeworCQkgICAgICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJCQlmcmVlIChiaW5kaW5nLT5kaXJuYW1lKTsKKworCQkgICAgICBiaW5kaW5nLT5kaXJuYW1lID0gcmVzdWx0OworCQkgICAgICBtb2RpZmllZCA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgICAqZGlybmFtZXAgPSByZXN1bHQ7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChjb2Rlc2V0cCkKKwl7CisJICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOworCisJICBpZiAoY29kZXNldCA9PSBOVUxMKQorCSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCisJICAgICpjb2Rlc2V0cCA9IGJpbmRpbmctPmNvZGVzZXQ7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBUaGUgZG9tYWluIGlzIGFscmVhZHkgYm91bmQuICBJZiB0aGUgbmV3IHZhbHVlIGFuZCB0aGUgb2xkCisJCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCisJCSBvbGQgYmluZGluZy4gICovCisJICAgICAgY2hhciAqcmVzdWx0ID0gYmluZGluZy0+Y29kZXNldDsKKwkgICAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgc3RyY21wIChjb2Rlc2V0LCByZXN1bHQpICE9IDApCisJCXsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKwkJICByZXN1bHQgPSBzdHJkdXAgKGNvZGVzZXQpOworI2Vsc2UKKwkJICBzaXplX3QgbGVuID0gc3RybGVuIChjb2Rlc2V0KSArIDE7CisJCSAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCisJCSAgICBtZW1jcHkgKHJlc3VsdCwgY29kZXNldCwgbGVuKTsKKyNlbmRpZgorCisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKwkJICAgIHsKKwkJICAgICAgZnJlZSAoYmluZGluZy0+Y29kZXNldCk7CisKKwkJICAgICAgYmluZGluZy0+Y29kZXNldCA9IHJlc3VsdDsKKwkJICAgICAgYmluZGluZy0+Y29kZXNldF9jbnRyKys7CisJCSAgICAgIG1vZGlmaWVkID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICAgICpjb2Rlc2V0cCA9IHJlc3VsdDsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UgaWYgKChkaXJuYW1lcCA9PSBOVUxMIHx8ICpkaXJuYW1lcCA9PSBOVUxMKQorCSAgICYmIChjb2Rlc2V0cCA9PSBOVUxMIHx8ICpjb2Rlc2V0cCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAvKiBTaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCisgICAgICBpZiAoZGlybmFtZXApCisJKmRpcm5hbWVwID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworICAgICAgaWYgKGNvZGVzZXRwKQorCSpjb2Rlc2V0cCA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCisgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7CisgICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQorCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgYmluZGluZywgZG9tYWlubmFtZSkgKyBsZW4pOworCisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3X2JpbmRpbmcgPT0gTlVMTCwgMCkpCisJZ290byBmYWlsZWQ7CisKKyAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7CisKKyAgICAgIGlmIChkaXJuYW1lcCkKKwl7CisJICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOworCisJICBpZiAoZGlybmFtZSA9PSBOVUxMKQorCSAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCisJICAgIGRpcm5hbWUgPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpID09IDApCisJCWRpcm5hbWUgPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgY2hhciAqcmVzdWx0OworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorCQkgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7CisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKKwkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7CisjZWxzZQorCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKKwkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKKwkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7CisJCSAgbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7CisjZW5kaWYKKwkJICBkaXJuYW1lID0gcmVzdWx0OworCQl9CisJICAgIH0KKwkgICpkaXJuYW1lcCA9IGRpcm5hbWU7CisJICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIGRpcm5hbWU7CisJfQorICAgICAgZWxzZQorCS8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KKwluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKworICAgICAgbmV3X2JpbmRpbmctPmNvZGVzZXRfY250ciA9IDA7CisKKyAgICAgIGlmIChjb2Rlc2V0cCkKKwl7CisJICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOworCisJICBpZiAoY29kZXNldCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqcmVzdWx0OworCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisJICAgICAgcmVzdWx0ID0gc3RyZHVwIChjb2Rlc2V0KTsKKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQorCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OworI2Vsc2UKKwkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChjb2Rlc2V0KSArIDE7CisJICAgICAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCisJCWdvdG8gZmFpbGVkX2NvZGVzZXQ7CisJICAgICAgbWVtY3B5IChyZXN1bHQsIGNvZGVzZXQsIGxlbik7CisjZW5kaWYKKwkgICAgICBjb2Rlc2V0ID0gcmVzdWx0OworCSAgICAgIG5ld19iaW5kaW5nLT5jb2Rlc2V0X2NudHIrKzsKKwkgICAgfQorCSAgKmNvZGVzZXRwID0gY29kZXNldDsKKwkgIG5ld19iaW5kaW5nLT5jb2Rlc2V0ID0gKGNoYXIgKikgY29kZXNldDsKKwl9CisgICAgICBlbHNlCisJbmV3X2JpbmRpbmctPmNvZGVzZXQgPSBOVUxMOworCisgICAgICAvKiBOb3cgZW5xdWV1ZSBpdC4gICovCisgICAgICBpZiAoX25sX2RvbWFpbl9iaW5kaW5ncyA9PSBOVUxMCisJICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kb21haW5fYmluZGluZ3MtPmRvbWFpbm5hbWUpIDwgMCkKKwl7CisJICBuZXdfYmluZGluZy0+bmV4dCA9IF9ubF9kb21haW5fYmluZGluZ3M7CisJICBfbmxfZG9tYWluX2JpbmRpbmdzID0gbmV3X2JpbmRpbmc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOworCSAgd2hpbGUgKGJpbmRpbmctPm5leHQgIT0gTlVMTAorCQkgJiYgc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5uZXh0LT5kb21haW5uYW1lKSA+IDApCisJICAgIGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0OworCisJICBuZXdfYmluZGluZy0+bmV4dCA9IGJpbmRpbmctPm5leHQ7CisJICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7CisJfQorCisgICAgICBtb2RpZmllZCA9IDE7CisKKyAgICAgIC8qIEhlcmUgd2UgZGVhbCB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLiAgKi8KKyAgICAgIGlmICgwKQorCXsKKwlmYWlsZWRfY29kZXNldDoKKwkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJICAgIGZyZWUgKG5ld19iaW5kaW5nLT5kaXJuYW1lKTsKKwlmYWlsZWRfZGlybmFtZToKKwkgIGZyZWUgKG5ld19iaW5kaW5nKTsKKwlmYWlsZWQ6CisJICBpZiAoZGlybmFtZXApCisJICAgICpkaXJuYW1lcCA9IE5VTEw7CisJICBpZiAoY29kZXNldHApCisJICAgICpjb2Rlc2V0cCA9IE5VTEw7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBtb2RpZmllZCBhbnkgYmluZGluZywgd2UgZmx1c2ggdGhlIGNhY2hlcy4gICovCisgIGlmIChtb2RpZmllZCkKKyAgICArK19ubF9tc2dfY2F0X2NudHI7CisKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKK30KKworLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCisgICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCitjaGFyICoKK0JJTkRURVhURE9NQUlOIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpkaXJuYW1lKQoreworICBzZXRfYmluZGluZ192YWx1ZXMgKGRvbWFpbm5hbWUsICZkaXJuYW1lLCBOVUxMKTsKKyAgcmV0dXJuIChjaGFyICopIGRpcm5hbWU7Cit9CisKKy8qIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiB3aGljaCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUKKyAgIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgcmV0dXJuZWQuICAqLworY2hhciAqCitCSU5EX1RFWFRET01BSU5fQ09ERVNFVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKK3sKKyAgc2V0X2JpbmRpbmdfdmFsdWVzIChkb21haW5uYW1lLCBOVUxMLCAmY29kZXNldCk7CisgIHJldHVybiAoY2hhciAqKSBjb2Rlc2V0OworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzZXMgZm9yIGZ1bmN0aW9uIG5hbWVzIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOword2Vha19hbGlhcyAoX19iaW5kX3RleHRkb21haW5fY29kZXNldCwgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvY29uZmlnLmNoYXJzZXQgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvY29uZmlnLmNoYXJzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9jb25maWcuY2hhcnNldApAQCAtMCwwICsxLDYwOCBAQAorIyEgL2Jpbi9zaAorIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHRhYmxlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbGlhc2VzLgorIworIyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjICAgVVNBLgorIworIyBUaGUgdGFibGUgY29uc2lzdHMgb2YgbGluZXMgb2YgdGhlIGZvcm0KKyMgICAgQUxJQVMgIENBTk9OSUNBTAorIworIyBBTElBUyBpcyB0aGUgKHN5c3RlbSBkZXBlbmRlbnQpIHJlc3VsdCBvZiAibmxfbGFuZ2luZm8gKENPREVTRVQpIi4KKyMgQUxJQVMgaXMgY29tcGFyZWQgaW4gYSBjYXNlIHNlbnNpdGl2ZSB3YXkuCisjCisjIENBTk9OSUNBTCBpcyB0aGUgR05VIGNhbm9uaWNhbCBuYW1lIGZvciB0aGlzIGNoYXJhY3RlciBlbmNvZGluZy4KKyMgSXQgbXVzdCBiZSBhbiBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgbGliaWNvbnYuIFN1cHBvcnQgYnkgR05VIGxpYmMgaXMKKyMgYWxzbyBkZXNpcmFibGUuIENBTk9OSUNBTCBpcyBjYXNlIGluc2Vuc2l0aXZlLiBVc3VhbGx5IGFuIHVwcGVyIGNhc2UKKyMgTUlNRSBjaGFyc2V0IG5hbWUgaXMgcHJlZmVycmVkLgorIyBUaGUgY3VycmVudCBsaXN0IG9mIEdOVSBjYW5vbmljYWwgY2hhcnNldCBuYW1lcyBpcyBhcyBmb2xsb3dzLgorIworIyAgICAgICBuYW1lICAgICAgICAgICAgICBNSU1FPyAgICAgICAgICAgICB1c2VkIGJ5IHdoaWNoIHN5c3RlbXMKKyMgICBBU0NJSSwgQU5TSV9YMy40LTE5NjggICAgICAgZ2xpYmMgc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTEgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSVNPLTg4NTktMiAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBJU08tODg1OS0zICAgICAgICAgICAgICBZICAgZ2xpYmMgc29sYXJpcworIyAgIElTTy04ODU5LTQgICAgICAgICAgICAgIFkgICBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTUgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSVNPLTg4NTktNiAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IHNvbGFyaXMKKyMgICBJU08tODg1OS03ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcworIyAgIElTTy04ODU5LTggICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcworIyAgIElTTy04ODU5LTkgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzCisjICAgSVNPLTg4NTktMTMgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgSVNPLTg4NTktMTQgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgSVNPLTg4NTktMTUgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBvc2Ygc29sYXJpcyBmcmVlYnNkCisjICAgS09JOC1SICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBLT0k4LVUgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgZnJlZWJzZCBkYXJ3aW4KKyMgICBLT0k4LVQgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMKKyMgICBDUDQzNyAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A3NzUgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODUwICAgICAgICAgICAgICAgICAgICAgICBhaXggb3NmIGRvcworIyAgIENQODUyICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg1NSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NTYgICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQODU3ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg2MSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjIgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODY0ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg2NSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjYgICAgICAgICAgICAgICAgICAgICAgIGZyZWVic2QgZGFyd2luIGRvcworIyAgIENQODY5ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg3NCAgICAgICAgICAgICAgICAgICAgICAgd29lMzIgZG9zCisjICAgQ1A5MjIgICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQOTMyICAgICAgICAgICAgICAgICAgICAgICBhaXggd29lMzIgZG9zCisjICAgQ1A5NDMgICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQOTQ5ICAgICAgICAgICAgICAgICAgICAgICBvc2Ygd29lMzIgZG9zCisjICAgQ1A5NTAgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcworIyAgIENQMTA0NiAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDExMjQgICAgICAgICAgICAgICAgICAgICAgYWl4CisjICAgQ1AxMTI1ICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQMTEyOSAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDEyNTAgICAgICAgICAgICAgICAgICAgICAgd29lMzIKKyMgICBDUDEyNTEgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyBkYXJ3aW4gd29lMzIKKyMgICBDUDEyNTIgICAgICAgICAgICAgICAgICAgICAgYWl4IHdvZTMyCisjICAgQ1AxMjUzICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjU0ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjU1ICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHdvZTMyCisjICAgQ1AxMjU2ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjU3ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgR0IyMzEyICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEVVQy1KUCAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgRVVDLUtSICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBFVUMtVFcgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcworIyAgIEJJRzUgICAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEJJRzUtSEtTQ1MgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzCisjICAgR0JLICAgICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBvc2Ygc29sYXJpcyB3b2UzMiBkb3MKKyMgICBHQjE4MDMwICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcworIyAgIFNISUZUX0pJUyAgICAgICAgICAgICAgIFkgICBocHV4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSk9IQUIgICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMgd29lMzIKKyMgICBUSVMtNjIwICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKKyMgICBWSVNDSUkgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMKKyMgICBUQ1ZONTcxMi0xICAgICAgICAgICAgICAgICAgZ2xpYmMKKyMgICBHRU9SR0lBTi1QUyAgICAgICAgICAgICAgICAgZ2xpYmMKKyMgICBIUC1ST01BTjggICAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLUFSQUJJQzggICAgICAgICAgICAgICAgICBocHV4CisjICAgSFAtR1JFRUs4ICAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBIUC1IRUJSRVc4ICAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLVRVUktJU0g4ICAgICAgICAgICAgICAgICBocHV4CisjICAgSFAtS0FOQTggICAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBERUMtS0FOSkkgICAgICAgICAgICAgICAgICAgb3NmCisjICAgREVDLUhBTllVICAgICAgICAgICAgICAgICAgIG9zZgorIyAgIFVURi04ICAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcworIworIyBOb3RlOiBOYW1lcyB3aGljaCBhcmUgbm90IG1hcmtlZCBhcyBiZWluZyBhIE1JTUUgbmFtZSBzaG91bGQgbm90IGJlIHVzZWQgaW4KKyMgSW50ZXJuZXQgcHJvdG9jb2xzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSAobWFpbCwgbmV3cywgZXRjLikuCisjCisjIE5vdGU6IEFTQ0lJIGFuZCBBTlNJX1gzLjQtMTk2OCBhcmUgc3lub255bW91cyBjYW5vbmljYWwgbmFtZXMuIEFwcGxpY2F0aW9ucworIyBtdXN0IHVuZGVyc3RhbmQgYm90aCBuYW1lcyBhbmQgdHJlYXQgdGhlbSBhcyBlcXVpdmFsZW50LgorIworIyBUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgZmlsZSBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3BlY2lmaWNhdGlvbiwKKyMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IKKyMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisKK2hvc3Q9IiQxIgorb3M9YGVjaG8gIiRob3N0IiB8IHNlZCAtZSAncy9eW14tXSotW14tXSotXCguKlwpJC9cMS8nYAorZWNobyAiIyBUaGlzIGZpbGUgY29udGFpbnMgYSB0YWJsZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYWxpYXNlcywiCitlY2hvICIjIHN1aXRhYmxlIGZvciBvcGVyYXRpbmcgc3lzdGVtICcke29zfScuIgorZWNobyAiIyBJdCB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBjb25maWcuY2hhcnNldC4iCisjIExpc3Qgb2YgcmVmZXJlbmNlcywgdXBkYXRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uOgorZWNobyAiIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICIKK2Nhc2UgIiRvcyIgaW4KKyAgICBsaW51eC1nbnVsaWJjMSopCisJIyBMaW51eCBsaWJjNSBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCWVjaG8gIkMgQVNDSUkiCisJZWNobyAiUE9TSVggQVNDSUkiCisJZm9yIGwgaW4gYWYgYWZfWkEgY2EgY2FfRVMgZGEgZGFfREsgZGUgZGVfQVQgZGVfQkUgZGVfQ0ggZGVfREUgZGVfTFUgXAorCSAgICAgICAgIGVuIGVuX0FVIGVuX0JXIGVuX0NBIGVuX0RLIGVuX0dCIGVuX0lFIGVuX05aIGVuX1VTIGVuX1pBIFwKKwkgICAgICAgICBlbl9aVyBlcyBlc19BUiBlc19CTyBlc19DTCBlc19DTyBlc19ETyBlc19FQyBlc19FUyBlc19HVCBcCisJICAgICAgICAgZXNfSE4gZXNfTVggZXNfUEEgZXNfUEUgZXNfUFkgZXNfU1YgZXNfVVMgZXNfVVkgZXNfVkUgZXQgXAorCSAgICAgICAgIGV0X0VFIGV1IGV1X0VTIGZpIGZpX0ZJIGZvIGZvX0ZPIGZyIGZyX0JFIGZyX0NBIGZyX0NIIGZyX0ZSIFwKKwkgICAgICAgICBmcl9MVSBnYSBnYV9JRSBnbCBnbF9FUyBpZCBpZF9JRCBpbiBpbl9JRCBpcyBpc19JUyBpdCBpdF9DSCBcCisJICAgICAgICAgaXRfSVQga2wga2xfR0wgbmwgbmxfQkUgbmxfTkwgbm8gbm9fTk8gcHQgcHRfQlIgcHRfUFQgc3YgXAorCSAgICAgICAgIHN2X0ZJIHN2X1NFOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktMSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTEgSVNPLTg4NTktMSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTE1IElTTy04ODU5LTE1IgorCSAgZWNobyAiJGwuaXNvLTg4NTktMTVAZXVybyBJU08tODg1OS0xNSIKKwkgIGVjaG8gIiRsQGV1cm8gSVNPLTg4NTktMTUiCisJICBlY2hvICIkbC5jcC00MzcgQ1A0MzciCisJICBlY2hvICIkbC5jcC04NTAgQ1A4NTAiCisJICBlY2hvICIkbC5jcC0xMjUyIENQMTI1MiIKKwkgIGVjaG8gIiRsLmNwLTEyNTJAZXVybyBDUDEyNTIiCisJICAjZWNobyAiJGwuYXRhcmktc3QgQVRBUkktU1QiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZworCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJICBlY2hvICIkbC51dGYtOEBldXJvIFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBjcyBjc19DWiBociBocl9IUiBodSBodV9IVSBwbCBwbF9QTCBybyByb19STyBzayBza19TSyBzbCBcCisJICAgICAgICAgc2xfU0kgc3Igc3JfQ1Mgc3JfWVU7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS0yIgorCSAgZWNobyAiJGwuaXNvLTg4NTktMiBJU08tODg1OS0yIgorCSAgZWNobyAiJGwuY3AtODUyIENQODUyIgorCSAgZWNobyAiJGwuY3AtMTI1MCBDUDEyNTAiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gbWsgbWtfTUsgcnUgcnVfUlU7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS01IgorCSAgZWNobyAiJGwuaXNvLTg4NTktNSBJU08tODg1OS01IgorCSAgZWNobyAiJGwua29pOC1yIEtPSTgtUiIKKwkgIGVjaG8gIiRsLmNwLTg2NiBDUDg2NiIKKwkgIGVjaG8gIiRsLmNwLTEyNTEgQ1AxMjUxIgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCWZvciBsIGluIGFyIGFyX1NBOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktNiIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTYgSVNPLTg4NTktNiIKKwkgIGVjaG8gIiRsLmNwLTg2NCBDUDg2NCIKKwkgICNlY2hvICIkbC5jcC04NjggQ1A4NjgiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZworCSAgZWNobyAiJGwuY3AtMTI1NiBDUDEyNTYiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gZWwgZWxfR1IgZ3IgZ3JfR1I7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS03IgorCSAgZWNobyAiJGwuaXNvLTg4NTktNyBJU08tODg1OS03IgorCSAgZWNobyAiJGwuY3AtODY5IENQODY5IgorCSAgZWNobyAiJGwuY3AtMTI1MyBDUDEyNTMiCisJICBlY2hvICIkbC5jcC0xMjUzQGV1cm8gQ1AxMjUzIgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJICBlY2hvICIkbC51dGYtOEBldXJvIFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBoZSBoZV9JTCBpdyBpd19JTDsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTgiCisJICBlY2hvICIkbC5pc28tODg1OS04IElTTy04ODU5LTgiCisJICBlY2hvICIkbC5jcC04NjIgQ1A4NjIiCisJICBlY2hvICIkbC5jcC0xMjU1IENQMTI1NSIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiB0ciB0cl9UUjsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTkiCisJICBlY2hvICIkbC5pc28tODg1OS05IElTTy04ODU5LTkiCisJICBlY2hvICIkbC5jcC04NTcgQ1A4NTciCisJICBlY2hvICIkbC5jcC0xMjU0IENQMTI1NCIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBsdCBsdF9MVCBsdiBsdl9MVjsgZG8KKwkgICNlY2hvICIkbCBCQUxUSUMiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZywgd3JvbmcgZW5jb2RpbmcgbmFtZQorCSAgZWNobyAiJGwgSVNPLTg4NTktMTMiCisJZG9uZQorCWZvciBsIGluIHJ1X1VBIHVrIHVrX1VBOyBkbworCSAgZWNobyAiJGwgS09JOC1VIgorCWRvbmUKKwlmb3IgbCBpbiB6aCB6aF9DTjsgZG8KKwkgICNlY2hvICIkbCBHQl8yMzEyLTgwIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKKwkgIGVjaG8gIiRsIEdCMjMxMiIKKwlkb25lCisJZm9yIGwgaW4gamEgamFfSlAgamFfSlAuRVVDOyBkbworCSAgZWNobyAiJGwgRVVDLUpQIgorCWRvbmUKKwlmb3IgbCBpbiBrbyBrb19LUjsgZG8KKwkgIGVjaG8gIiRsIEVVQy1LUiIKKwlkb25lCisJZm9yIGwgaW4gdGggdGhfVEg7IGRvCisJICBlY2hvICIkbCBUSVMtNjIwIgorCWRvbmUKKwlmb3IgbCBpbiBmYSBmYV9JUjsgZG8KKwkgICNlY2hvICIkbCBJU0lSSS0zMzQyIiAjIGEgYnJva2VuIGVuY29kaW5nCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJOzsKKyAgICBsaW51eCogfCAqLWdudSopCisJIyBXaXRoIGdsaWJjLTIuMSBvciBuZXdlciwgd2UgZG9uJ3QgbmVlZCBhbnkgY2Fub25pY2FsaXphdGlvbiwKKwkjIGJlY2F1c2UgZ2xpYmMgaGFzIGljb252IGFuZCBib3RoIGdsaWJjIGFuZCBsaWJpY29udiBzdXBwb3J0IGFsbAorCSMgR05VIGNhbm9uaWNhbCBuYW1lcyBkaXJlY3RseS4gVGhlcmVmb3JlLCB0aGUgTWFrZWZpbGUgZG9lcyBub3QKKwkjIG5lZWQgdG8gaW5zdGFsbCB0aGUgYWxpYXMgZmlsZSBhdCBhbGwuCisJIyBUaGUgZm9sbG93aW5nIGFwcGxpZXMgb25seSB0byBnbGliYy0yLjAueCBhbmQgb2xkZXIgbGliY3MuCisJZWNobyAiSVNPXzY0Ni5JUlY6MTk4MyBBU0NJSSIKKwk7OworICAgIGFpeCopCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS02IElTTy04ODU5LTYiCisJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisJZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCisJZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCisJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwllY2hvICJJQk0tODUwIENQODUwIgorCWVjaG8gIklCTS04NTYgQ1A4NTYiCisJZWNobyAiSUJNLTkyMSBJU08tODg1OS0xMyIKKwllY2hvICJJQk0tOTIyIENQOTIyIgorCWVjaG8gIklCTS05MzIgQ1A5MzIiCisJZWNobyAiSUJNLTk0MyBDUDk0MyIKKwllY2hvICJJQk0tMTA0NiBDUDEwNDYiCisJZWNobyAiSUJNLTExMjQgQ1AxMTI0IgorCWVjaG8gIklCTS0xMTI5IENQMTEyOSIKKwllY2hvICJJQk0tMTI1MiBDUDEyNTIiCisJZWNobyAiSUJNLWV1Y0NOIEdCMjMxMiIKKwllY2hvICJJQk0tZXVjSlAgRVVDLUpQIgorCWVjaG8gIklCTS1ldWNLUiBFVUMtS1IiCisJZWNobyAiSUJNLWV1Y1RXIEVVQy1UVyIKKwllY2hvICJiaWc1IEJJRzUiCisJZWNobyAiR0JLIEdCSyIKKwllY2hvICJUSVMtNjIwIFRJUy02MjAiCisJZWNobyAiVVRGLTggVVRGLTgiCisJOzsKKyAgICBocHV4KikKKwllY2hvICJpc284ODU5MSBJU08tODg1OS0xIgorCWVjaG8gImlzbzg4NTkyIElTTy04ODU5LTIiCisJZWNobyAiaXNvODg1OTUgSVNPLTg4NTktNSIKKwllY2hvICJpc284ODU5NiBJU08tODg1OS02IgorCWVjaG8gImlzbzg4NTk3IElTTy04ODU5LTciCisJZWNobyAiaXNvODg1OTggSVNPLTg4NTktOCIKKwllY2hvICJpc284ODU5OSBJU08tODg1OS05IgorCWVjaG8gImlzbzg4NTkxNSBJU08tODg1OS0xNSIKKwllY2hvICJyb21hbjggSFAtUk9NQU44IgorCWVjaG8gImFyYWJpYzggSFAtQVJBQklDOCIKKwllY2hvICJncmVlazggSFAtR1JFRUs4IgorCWVjaG8gImhlYnJldzggSFAtSEVCUkVXOCIKKwllY2hvICJ0dXJraXNoOCBIUC1UVVJLSVNIOCIKKwllY2hvICJrYW5hOCBIUC1LQU5BOCIKKwllY2hvICJ0aXM2MjAgVElTLTYyMCIKKwllY2hvICJiaWc1IEJJRzUiCisJZWNobyAiZXVjSlAgRVVDLUpQIgorCWVjaG8gImV1Y0tSIEVVQy1LUiIKKwllY2hvICJldWNUVyBFVUMtVFciCisJZWNobyAiaHAxNUNOIEdCMjMxMiIKKwkjZWNobyAiY2NkYyA/IiAjIHdoYXQgaXMgdGhpcz8KKwllY2hvICJTSklTIFNISUZUX0pJUyIKKwllY2hvICJ1dGY4IFVURi04IgorCTs7CisgICAgaXJpeCopCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisJZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCisJZWNobyAiZXVjQ04gR0IyMzEyIgorCWVjaG8gImV1Y0pQIEVVQy1KUCIKKwllY2hvICJldWNLUiBFVUMtS1IiCisJZWNobyAiZXVjVFcgRVVDLVRXIgorCTs7CisgICAgb3NmKikKKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKwllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKKwllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKKwllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKKwllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKKwllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKwllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgorCWVjaG8gImNwODUwIENQODUwIgorCWVjaG8gImJpZzUgQklHNSIKKwllY2hvICJkZWNoYW55dSBERUMtSEFOWVUiCisJZWNobyAiZGVjaGFuemkgR0IyMzEyIgorCWVjaG8gImRlY2thbmppIERFQy1LQU5KSSIKKwllY2hvICJkZWNrb3JlYW4gRVVDLUtSIgorCWVjaG8gImV1Y0pQIEVVQy1KUCIKKwllY2hvICJldWNLUiBFVUMtS1IiCisJZWNobyAiZXVjVFcgRVVDLVRXIgorCWVjaG8gIkdCSyBHQksiCisJZWNobyAiS1NDNTYwMSBDUDk0OSIKKwllY2hvICJzZGVja2FuamkgRVVDLUpQIgorCWVjaG8gIlNKSVMgU0hJRlRfSklTIgorCWVjaG8gIlRBQ1RJUyBUSVMtNjIwIgorCWVjaG8gIlVURi04IFVURi04IgorCTs7CisgICAgc29sYXJpcyopCisJZWNobyAiNjQ2IEFTQ0lJIgorCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgorCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorCWVjaG8gIklTTzg4NTktMyBJU08tODg1OS0zIgorCWVjaG8gIklTTzg4NTktNCBJU08tODg1OS00IgorCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgorCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgorCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgorCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgorCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCisJZWNobyAia29pOC1yIEtPSTgtUiIKKwllY2hvICJhbnNpLTEyNTEgQ1AxMjUxIgorCWVjaG8gIkJJRzUgQklHNSIKKwllY2hvICJCaWc1LUhLU0NTIEJJRzUtSEtTQ1MiCisJZWNobyAiZ2IyMzEyIEdCMjMxMiIKKwllY2hvICJHQksgR0JLIgorCWVjaG8gIkdCMTgwMzAgR0IxODAzMCIKKwllY2hvICJjbnMxMTY0MyBFVUMtVFciCisJZWNobyAiNTYwMSBFVUMtS1IiCisJZWNobyAia29fS1Iuam9oYXA5MiBKT0hBQiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiUENLIFNISUZUX0pJUyIKKwllY2hvICJUSVM2MjAuMjUzMyBUSVMtNjIwIgorCSNlY2hvICJzdW5fZXVfZ3JlZWsgPyIgIyB3aGF0IGlzIHRoaXM/CisJZWNobyAiVVRGLTggVVRGLTgiCisJOzsKKyAgICBmcmVlYnNkKiB8IG9zMiopCisJIyBGcmVlQlNEIDQuMiBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCSMgTGlrZXdpc2UgZm9yIE9TLzIuIE9TLzIgaGFzIFhGcmVlODYganVzdCBsaWtlIEZyZWVCU0QuIEp1c3QKKwkjIHJldXNlIEZyZWVCU0QncyBsb2NhbGUgZGF0YSBmb3IgT1MvMi4KKwllY2hvICJDIEFTQ0lJIgorCWVjaG8gIlVTLUFTQ0lJIEFTQ0lJIgorCWZvciBsIGluIGxhX0xOIGx0X0xOOyBkbworCSAgZWNobyAiJGwuQVNDSUkgQVNDSUkiCisJZG9uZQorCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKKwkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBsYV9MTiBcCisJICAgICAgICAgbHRfTE4gbmxfQkUgbmxfTkwgbm9fTk8gcHRfUFQgc3ZfU0U7IGRvCisJICBlY2hvICIkbC5JU09fODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5ESVNfODg1OS0xNSBJU08tODg1OS0xNSIKKwlkb25lCisJZm9yIGwgaW4gY3NfQ1ogaHJfSFIgaHVfSFUgbGFfTE4gbHRfTE4gcGxfUEwgc2xfU0k7IGRvCisJICBlY2hvICIkbC5JU09fODg1OS0yIElTTy04ODU5LTIiCisJZG9uZQorCWZvciBsIGluIGxhX0xOIGx0X0xUOyBkbworCSAgZWNobyAiJGwuSVNPXzg4NTktNCBJU08tODg1OS00IgorCWRvbmUKKwlmb3IgbCBpbiBydV9SVSBydV9TVTsgZG8KKwkgIGVjaG8gIiRsLktPSTgtUiBLT0k4LVIiCisJICBlY2hvICIkbC5JU09fODg1OS01IElTTy04ODU5LTUiCisJICBlY2hvICIkbC5DUDg2NiBDUDg2NiIKKwlkb25lCisJZWNobyAidWtfVUEuS09JOC1VIEtPSTgtVSIKKwllY2hvICJ6aF9UVy5CSUc1IEJJRzUiCisJZWNobyAiemhfVFcuQmlnNSBCSUc1IgorCWVjaG8gInpoX0NOLkVVQyBHQjIzMTIiCisJZWNobyAiamFfSlAuRVVDIEVVQy1KUCIKKwllY2hvICJqYV9KUC5TSklTIFNISUZUX0pJUyIKKwllY2hvICJqYV9KUC5TaGlmdF9KSVMgU0hJRlRfSklTIgorCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCisJOzsKKyAgICBuZXRic2QqKQorCWVjaG8gIjY0NiBBU0NJSSIKKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKwllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKKwllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKKwllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKKwllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgorCWVjaG8gImV1Y0NOIEdCMjMxMiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiZXVjS1IgRVVDLUtSIgorCWVjaG8gImV1Y1RXIEVVQy1UVyIKKwllY2hvICJCSUc1IEJJRzUiCisJZWNobyAiU0pJUyBTSElGVF9KSVMiCisJOzsKKyAgICBkYXJ3aW4qKQorCSMgRGFyd2luIDYuOCBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCWVjaG8gIkMgQVNDSUkiCisJZm9yIGwgaW4gZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgbGFfTE47IGRvCisJICBlY2hvICIkbC5VUy1BU0NJSSBBU0NJSSIKKwlkb25lCisJZm9yIGwgaW4gZGFfREsgZGVfQVQgZGVfQ0ggZGVfREUgZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgZXNfRVMgXAorCSAgICAgICAgIGZpX0ZJIGZyX0JFIGZyX0NBIGZyX0NIIGZyX0ZSIGlzX0lTIGl0X0NIIGl0X0lUIG5sX0JFIFwKKwkgICAgICAgICBubF9OTCBub19OTyBwdF9QVCBzdl9TRTsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5JU084ODU5LTEgSVNPLTg4NTktMSIKKwkgIGVjaG8gIiRsLklTTzg4NTktMTUgSVNPLTg4NTktMTUiCisJZG9uZQorCWZvciBsIGluIGxhX0xOOyBkbworCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgorCWRvbmUKKwlmb3IgbCBpbiBjc19DWiBocl9IUiBodV9IVSBsYV9MTiBwbF9QTCBzbF9TSTsgZG8KKwkgIGVjaG8gIiRsLklTTzg4NTktMiBJU08tODg1OS0yIgorCWRvbmUKKwlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KKwkgIGVjaG8gIiRsLklTTzg4NTktNCBJU08tODg1OS00IgorCWRvbmUKKwlmb3IgbCBpbiBydV9SVTsgZG8KKwkgIGVjaG8gIiRsLktPSTgtUiBLT0k4LVIiCisJICBlY2hvICIkbC5JU084ODU5LTUgSVNPLTg4NTktNSIKKwkgIGVjaG8gIiRsLkNQODY2IENQODY2IgorCWRvbmUKKwlmb3IgbCBpbiBiZ19CRzsgZG8KKwkgIGVjaG8gIiRsLkNQMTI1MSBDUDEyNTEiCisJZG9uZQorCWVjaG8gInVrX1VBLktPSTgtVSBLT0k4LVUiCisJZWNobyAiemhfVFcuQklHNSBCSUc1IgorCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKKwllY2hvICJ6aF9DTi5FVUMgR0IyMzEyIgorCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCisJZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCisJZWNobyAia29fS1IuRVVDIEVVQy1LUiIKKwk7OworICAgIGJlb3MqKQorCSMgQmVPUyBoYXMgYSBzaW5nbGUgbG9jYWxlLCBhbmQgaXQgaGFzIFVURi04IGVuY29kaW5nLgorCWVjaG8gIiogVVRGLTgiCisJOzsKKyAgICBtc2Rvc2RqZ3BwKikKKwkjIERKR1BQIDIuMDMgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwllY2hvICIjIgorCWVjaG8gIiMgVGhlIGVuY29kaW5ncyBnaXZlbiBoZXJlIG1heSBub3QgYWxsIGJlIGNvcnJlY3QuIgorCWVjaG8gIiMgSWYgeW91IGZpbmQgdGhhdCB0aGUgZW5jb2RpbmcgZ2l2ZW4gZm9yIHlvdXIgbGFuZ3VhZ2UgYW5kIgorCWVjaG8gIiMgY291bnRyeSBpcyBub3QgdGhlIG9uZSB5b3VyIERPUyBtYWNoaW5lIGFjdHVhbGx5IHVzZXMsIGp1c3QiCisJZWNobyAiIyBjb3JyZWN0IGl0IGluIHRoaXMgZmlsZSwgYW5kIHNlbmQgYSBtYWlsIHRvIgorCWVjaG8gIiMgSnVhbiBNYW51ZWwgR3VlcnJlcm8gPHN0MDAxOTA2QGhyejEuaHJ6LnR1LWRhcm1zdGFkdC5kZT4iCisJZWNobyAiIyBhbmQgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiIKKwllY2hvICIjIgorCWVjaG8gIkMgQVNDSUkiCisJIyBJU08tODg1OS0xIGxhbmd1YWdlcworCWVjaG8gImNhIENQODUwIgorCWVjaG8gImNhX0VTIENQODUwIgorCWVjaG8gImRhIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gImRhX0RLIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gImRlIENQODUwIgorCWVjaG8gImRlX0FUIENQODUwIgorCWVjaG8gImRlX0NIIENQODUwIgorCWVjaG8gImRlX0RFIENQODUwIgorCWVjaG8gImVuIENQODUwIgorCWVjaG8gImVuX0FVIENQODUwIiAjIG5vdCBDUDQzNyA/PworCWVjaG8gImVuX0NBIENQODUwIgorCWVjaG8gImVuX0dCIENQODUwIgorCWVjaG8gImVuX05aIENQNDM3IgorCWVjaG8gImVuX1VTIENQNDM3IgorCWVjaG8gImVuX1pBIENQODUwIiAjIG5vdCBDUDQzNyA/PworCWVjaG8gImVzIENQODUwIgorCWVjaG8gImVzX0FSIENQODUwIgorCWVjaG8gImVzX0JPIENQODUwIgorCWVjaG8gImVzX0NMIENQODUwIgorCWVjaG8gImVzX0NPIENQODUwIgorCWVjaG8gImVzX0NSIENQODUwIgorCWVjaG8gImVzX0NVIENQODUwIgorCWVjaG8gImVzX0RPIENQODUwIgorCWVjaG8gImVzX0VDIENQODUwIgorCWVjaG8gImVzX0VTIENQODUwIgorCWVjaG8gImVzX0dUIENQODUwIgorCWVjaG8gImVzX0hOIENQODUwIgorCWVjaG8gImVzX01YIENQODUwIgorCWVjaG8gImVzX05JIENQODUwIgorCWVjaG8gImVzX1BBIENQODUwIgorCWVjaG8gImVzX1BZIENQODUwIgorCWVjaG8gImVzX1BFIENQODUwIgorCWVjaG8gImVzX1NWIENQODUwIgorCWVjaG8gImVzX1VZIENQODUwIgorCWVjaG8gImVzX1ZFIENQODUwIgorCWVjaG8gImV0IENQODUwIgorCWVjaG8gImV0X0VFIENQODUwIgorCWVjaG8gImV1IENQODUwIgorCWVjaG8gImV1X0VTIENQODUwIgorCWVjaG8gImZpIENQODUwIgorCWVjaG8gImZpX0ZJIENQODUwIgorCWVjaG8gImZyIENQODUwIgorCWVjaG8gImZyX0JFIENQODUwIgorCWVjaG8gImZyX0NBIENQODUwIgorCWVjaG8gImZyX0NIIENQODUwIgorCWVjaG8gImZyX0ZSIENQODUwIgorCWVjaG8gImdhIENQODUwIgorCWVjaG8gImdhX0lFIENQODUwIgorCWVjaG8gImdkIENQODUwIgorCWVjaG8gImdkX0dCIENQODUwIgorCWVjaG8gImdsIENQODUwIgorCWVjaG8gImdsX0VTIENQODUwIgorCWVjaG8gImlkIENQODUwIiAgICAjIG5vdCBDUDQzNyA/PworCWVjaG8gImlkX0lEIENQODUwIiAjIG5vdCBDUDQzNyA/PworCWVjaG8gImlzIENQODYxIiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gImlzX0lTIENQODYxIiAjIG5vdCBDUDg1MCA/PworCWVjaG8gIml0IENQODUwIgorCWVjaG8gIml0X0NIIENQODUwIgorCWVjaG8gIml0X0lUIENQODUwIgorCWVjaG8gImx0IENQNzc1IgorCWVjaG8gImx0X0xUIENQNzc1IgorCWVjaG8gImx2IENQNzc1IgorCWVjaG8gImx2X0xWIENQNzc1IgorCWVjaG8gIm5iIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5iX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5sIENQODUwIgorCWVjaG8gIm5sX0JFIENQODUwIgorCWVjaG8gIm5sX05MIENQODUwIgorCWVjaG8gIm5uIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5uX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5vIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5vX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gInB0IENQODUwIgorCWVjaG8gInB0X0JSIENQODUwIgorCWVjaG8gInB0X1BUIENQODUwIgorCWVjaG8gInN2IENQODUwIgorCWVjaG8gInN2X1NFIENQODUwIgorCSMgSVNPLTg4NTktMiBsYW5ndWFnZXMKKwllY2hvICJjcyBDUDg1MiIKKwllY2hvICJjc19DWiBDUDg1MiIKKwllY2hvICJociBDUDg1MiIKKwllY2hvICJocl9IUiBDUDg1MiIKKwllY2hvICJodSBDUDg1MiIKKwllY2hvICJodV9IVSBDUDg1MiIKKwllY2hvICJwbCBDUDg1MiIKKwllY2hvICJwbF9QTCBDUDg1MiIKKwllY2hvICJybyBDUDg1MiIKKwllY2hvICJyb19STyBDUDg1MiIKKwllY2hvICJzayBDUDg1MiIKKwllY2hvICJza19TSyBDUDg1MiIKKwllY2hvICJzbCBDUDg1MiIKKwllY2hvICJzbF9TSSBDUDg1MiIKKwllY2hvICJzcSBDUDg1MiIKKwllY2hvICJzcV9BTCBDUDg1MiIKKwllY2hvICJzciBDUDg1MiIgICAgIyBDUDg1MiBvciBDUDg2NiBvciBDUDg1NSA/PworCWVjaG8gInNyX0NTIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/CisJZWNobyAic3JfWVUgQ1A4NTIiICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KKwkjIElTTy04ODU5LTMgbGFuZ3VhZ2VzCisJZWNobyAibXQgQ1A4NTAiCisJZWNobyAibXRfTVQgQ1A4NTAiCisJIyBJU08tODg1OS01IGxhbmd1YWdlcworCWVjaG8gImJlIENQODY2IgorCWVjaG8gImJlX0JFIENQODY2IgorCWVjaG8gImJnIENQODY2IiAgICAjIG5vdCBDUDg1NSA/PworCWVjaG8gImJnX0JHIENQODY2IiAjIG5vdCBDUDg1NSA/PworCWVjaG8gIm1rIENQODY2IiAgICAjIG5vdCBDUDg1NSA/PworCWVjaG8gIm1rX01LIENQODY2IiAjIG5vdCBDUDg1NSA/PworCWVjaG8gInJ1IENQODY2IgorCWVjaG8gInJ1X1JVIENQODY2IgorCWVjaG8gInVrIENQMTEyNSIKKwllY2hvICJ1a19VQSBDUDExMjUiCisJIyBJU08tODg1OS02IGxhbmd1YWdlcworCWVjaG8gImFyIENQODY0IgorCWVjaG8gImFyX0FFIENQODY0IgorCWVjaG8gImFyX0RaIENQODY0IgorCWVjaG8gImFyX0VHIENQODY0IgorCWVjaG8gImFyX0lRIENQODY0IgorCWVjaG8gImFyX0lSIENQODY0IgorCWVjaG8gImFyX0pPIENQODY0IgorCWVjaG8gImFyX0tXIENQODY0IgorCWVjaG8gImFyX01BIENQODY0IgorCWVjaG8gImFyX09NIENQODY0IgorCWVjaG8gImFyX1FBIENQODY0IgorCWVjaG8gImFyX1NBIENQODY0IgorCWVjaG8gImFyX1NZIENQODY0IgorCSMgSVNPLTg4NTktNyBsYW5ndWFnZXMKKwllY2hvICJlbCBDUDg2OSIKKwllY2hvICJlbF9HUiBDUDg2OSIKKwkjIElTTy04ODU5LTggbGFuZ3VhZ2VzCisJZWNobyAiaGUgQ1A4NjIiCisJZWNobyAiaGVfSUwgQ1A4NjIiCisJIyBJU08tODg1OS05IGxhbmd1YWdlcworCWVjaG8gInRyIENQODU3IgorCWVjaG8gInRyX1RSIENQODU3IgorCSMgSmFwYW5lc2UKKwllY2hvICJqYSBDUDkzMiIKKwllY2hvICJqYV9KUCBDUDkzMiIKKwkjIENoaW5lc2UKKwllY2hvICJ6aF9DTiBHQksiCisJZWNobyAiemhfVFcgQ1A5NTAiICMgbm90IENQOTM4ID8/CisJIyBLb3JlYW4KKwllY2hvICJrciBDUDk0OSIgICAgIyBub3QgQ1A5MzQgPz8KKwllY2hvICJrcl9LUiBDUDk0OSIgIyBub3QgQ1A5MzQgPz8KKwkjIFRoYWkKKwllY2hvICJ0aCBDUDg3NCIKKwllY2hvICJ0aF9USCBDUDg3NCIKKwkjIE90aGVyCisJZWNobyAiZW8gQ1A4NTAiCisJZWNobyAiZW9fRU8gQ1A4NTAiCisJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9kY2dldHRleHQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9kY2dldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTBhY2RlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2RjZ2V0dGV4dC5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY2dldHRleHQoMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0CisjIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorICAgbG9jYWxlLiAgKi8KK2NoYXIgKgorRENHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCwgaW50IGNhdGVnb3J5KQoreworICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIE5VTEwsIDAsIDAsIGNhdGVnb3J5KTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK0lOVERFRihfX2RjZ2V0dGV4dCkKK3dlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZGNpZ2V0dGV4dC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2RjaWdldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTY3OGNmCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2RjaWdldHRleHQuYwpAQCAtMCwwICsxLDEyMjIgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBkY2lnZXR0ZXh0IGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZuZGVmIGVycm5vCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisjaWZuZGVmIF9fc2V0X2Vycm5vCisjIGRlZmluZSBfX3NldF9lcnJubyh2YWwpIGVycm5vID0gKHZhbCkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZmRlZiBfTElCQworICAvKiBHdWVzcyB3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgc2lnbmFsIFNJR0ZQRS4KKyAgICAgU2V0IHRvIDEgb25seSBpZiB5b3Uga25vdyBmb3Igc3VyZS4gIEluIGNhc2Ugb2YgZG91YnQsIHNldCB0byAwLiAgKi8KKyMgaWYgZGVmaW5lZCBfX2FscGhhX18gfHwgZGVmaW5lZCBfX2FybV9fIHx8IGRlZmluZWQgX19pMzg2X18gXAorICAgICB8fCBkZWZpbmVkIF9fbTY4a19fIHx8IGRlZmluZWQgX19zMzkwX18KKyMgIGRlZmluZSBJTlRESVYwX1JBSVNFU19TSUdGUEUgMQorIyBlbHNlCisjICBkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFIDAKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgorCisvKiBUaHJlYWQgc2FmZXR5bmVzcy4gICovCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyNlbHNlCisvKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCisjIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsIE5BTUUpCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLCBOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja19yZGxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCisjZW5kaWYKKworLyogQWxpZ25tZW50IG9mIHR5cGVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgZGVmaW5lIGFsaWdub2YoVFlQRSkgX19hbGlnbm9mX18gKFRZUEUpCisjZWxzZQorIyBkZWZpbmUgYWxpZ25vZihUWVBFKSBcCisgICAgKChpbnQpICYoKHN0cnVjdCB7IGNoYXIgZHVtbXkxOyBUWVBFIGR1bW15MjsgfSAqKSAwKS0+ZHVtbXkyKQorI2VuZGlmCisKKy8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisgICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KKyNpZiAhZGVmaW5lZCBfTElCQworIyBkZWZpbmUgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluCisjIGRlZmluZSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4KKyMgZGVmaW5lIF9ubF9kZWZhdWx0X2Rpcm5hbWUgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWUKKyMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKKyNlbmRpZgorCisvKiBTb21lIGNvbXBpbGVycywgbGlrZSBTdW5PUzQgY2MsIGRvbid0IGhhdmUgb2Zmc2V0b2YgaW4gPHN0ZGRlZi5oPi4gICovCisjaWZuZGVmIG9mZnNldG9mCisjIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZmRlZiBfTElCQworLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCisgICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0CisgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCisjIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKKyMgaWZuZGVmIHN0cGNweQorIyAgZGVmaW5lIHN0cGNweSBfX3N0cGNweQorIyBlbmRpZgorIyBkZWZpbmUgdGZpbmQgX190ZmluZAorI2Vsc2UKKyMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKK2NoYXIgKmdldHdkICgpOworIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKKyMgZWxzZQorIyAgaWYgVk1TCisjICAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgKGdldGN3ZCkgKGJ1ZiwgbWF4LCAwKQorIyAgZWxzZQorY2hhciAqZ2V0Y3dkICgpOworIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfU1RQQ1BZCisjZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIG15X3N0cGNweShkZXN0LCBzcmMpCitzdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOworIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9NRU1QQ1BZCitzdGF0aWMgdm9pZCAqbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7CisjIGVuZGlmCisjZW5kaWYKKworLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KKyNkZWZpbmUgUEFUSF9JTkNSIDMyCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLworLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCisgICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKKyAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KKyNpZiBkZWZpbmVkIF9QT1NJWF9WRVJTSU9OIHx8IChkZWZpbmVkIEhBVkVfTElNSVRTX0ggJiYgIWRlZmluZWQgX19HTlVDX18pCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCisjIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1CisjZW5kaWYKKworI2lmICFkZWZpbmVkIFBBVEhfTUFYICYmIGRlZmluZWQgX1BDX1BBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKKyNlbmRpZgorCisvKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLworI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCAmJiAhZGVmaW5lZCBQQVRIX01BWCAmJiAhZGVmaW5lZCBNQVhQQVRITEVOCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBQQVRIX01BWCAmJiBkZWZpbmVkIE1BWFBBVEhMRU4KKyMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KKyNlbmRpZgorCisjaWZuZGVmIFBBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKKyNlbmRpZgorCisvKiBQYXRobmFtZSBzdXBwb3J0LgorICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCisgICBJU19QQVRIX1dJVEhfRElSKFApICB0ZXN0cyB3aGV0aGVyIFAgY29udGFpbnMgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KKyAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorICAgICAmJiAoUClbMV0gPT0gJzonKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKKyMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgXAorICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCisjZWxzZQorICAvKiBVbml4ICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCisjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgZm9yIHRoZSBzZWFyY2ggdHJlZSB3aGVyZSBrbm93biB0cmFuc2xhdGlvbnMKKyAgIGFyZSBzdG9yZWQuICAqLworc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QKK3sKKyAgLyogRG9tYWluIGluIHdoaWNoIHRvIHNlYXJjaC4gICovCisgIGNoYXIgKmRvbWFpbm5hbWU7CisKKyAgLyogVGhlIGNhdGVnb3J5LiAgKi8KKyAgaW50IGNhdGVnb3J5OworCisgIC8qIFN0YXRlIG9mIHRoZSBjYXRhbG9nIGNvdW50ZXIgYXQgdGhlIHBvaW50IHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KKyAgaW50IGNvdW50ZXI7CisKKyAgLyogQ2F0YWxvZyB3aGVyZSB0aGUgc3RyaW5nIHdhcyBmb3VuZC4gICovCisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKKworICAvKiBBbmQgZmluYWxseSB0aGUgdHJhbnNsYXRpb24uICAqLworICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbjsKKyAgc2l6ZV90IHRyYW5zbGF0aW9uX2xlbmd0aDsKKworICAvKiBQb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gcXVlc3Rpb24uICAqLworICBjaGFyIG1zZ2lkW1pFUk9dOworfTsKKworLyogUm9vdCBvZiB0aGUgc2VhcmNoIHRyZWUgd2l0aCBrbm93biB0cmFuc2xhdGlvbnMuICBXZSBjYW4gdXNlIHRoaXMKKyAgIG9ubHkgaWYgdGhlIHN5c3RlbSBwcm92aWRlcyB0aGUgYHRzZWFyY2gnIGZ1bmN0aW9uIGZhbWlseS4gICovCisjaWYgZGVmaW5lZCBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzZWFyY2guaD4KKworc3RhdGljIHZvaWQgKnJvb3Q7CisKKyMgaWZkZWYgX0xJQkMKKyMgIGRlZmluZSB0c2VhcmNoIF9fdHNlYXJjaAorIyBlbmRpZgorCisvKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBrbm93biB0cmFuc2xhdGlvbnMuICAqLworc3RhdGljIGludAordHJhbnNjbXAgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKyAgY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnMxOworICBjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqczI7CisgIGludCByZXN1bHQ7CisKKyAgczEgPSAoY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikgcDE7CisgIHMyID0gKGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIHAyOworCisgIHJlc3VsdCA9IHN0cmNtcCAoczEtPm1zZ2lkLCBzMi0+bXNnaWQpOworICBpZiAocmVzdWx0ID09IDApCisgICAgeworICAgICAgcmVzdWx0ID0gc3RyY21wIChzMS0+ZG9tYWlubmFtZSwgczItPmRvbWFpbm5hbWUpOworICAgICAgaWYgKHJlc3VsdCA9PSAwKQorCS8qIFdlIGNvbXBhcmUgdGhlIGNhdGVnb3J5IGxhc3QgKHRob3VnaCB0aGlzIGlzIHRoZSBjaGVhcGVzdAorCSAgIG9wZXJhdGlvbikgc2luY2UgaXQgaXMgaG9wZWZ1bGx5IGFsd2F5cyB0aGUgc2FtZSAobmFtZWx5CisJICAgTENfTUVTU0FHRVMpLiAgKi8KKwlyZXN1bHQgPSBzMS0+Y2F0ZWdvcnkgLSBzMi0+Y2F0ZWdvcnk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBJTlRWQVJERUYKKyMgZGVmaW5lIElOVFZBUkRFRihuYW1lKQorI2VuZGlmCisjaWZuZGVmIElOVFVTRQorIyBkZWZpbmUgSU5UVVNFKG5hbWUpIG5hbWUKKyNlbmRpZgorCisvKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCisgICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCitjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gYXR0cmlidXRlX2hpZGRlbiA9ICJtZXNzYWdlcyI7CisKKy8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KK2NvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW4KKyAgICAgPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKKworLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLworI2lmIGRlZmluZWQgX19FTVhfXworZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOworI2Vsc2UKK2NvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gTE9DQUxFRElSOworSU5UVkFSREVGIChfbmxfZGVmYXVsdF9kaXJuYW1lKQorI2VuZGlmCisKKy8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zIGNyZWF0ZWQgYnkgYmluZHRleHRkb21haW4oKQorICAgY2FsbHMuICAqLworc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgY2hhciAqcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaW50IG4sCisJCQkgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksCisJCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCisjIGRlZmluZSBjYXRlZ29yeV90b19uYW1lKGNhdGVnb3J5KQlfbmxfY2F0ZWdvcnlfbmFtZXNbY2F0ZWdvcnldCisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgKmNhdGVnb3J5X3RvX25hbWUgKGludCBjYXRlZ29yeSkgaW50ZXJuYWxfZnVuY3Rpb247CisjZW5kaWYKKworCisvKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKKyAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCisjaWZkZWYgSEFWRV9BTExPQ0EKKy8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLworIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLworIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KKyNlbHNlCitzdHJ1Y3QgYmxvY2tfbGlzdAoreworICB2b2lkICphZGRyZXNzOworICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKK307CisjIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCisgICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAorICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAorICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAorICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCisgICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKKyAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKKyAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAorICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAorICAgICAgZnJlZSAob2xkLT5hZGRyZXNzKTsJCQkJCQkgICAgICBcCisgICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgdW5kZWYgYWxsb2NhCisjIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCisjIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQorI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCisKKworI2lmZGVmIF9MSUJDCisvKiBMaXN0IG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIHRyYW5zbGF0aW9ucy4gICovCit0eXBlZGVmIHN0cnVjdCB0cmFuc21lbV9saXN0Cit7CisgIHN0cnVjdCB0cmFuc21lbV9saXN0ICpuZXh0OworICBjaGFyIGRhdGFbWkVST107Cit9IHRyYW5zbWVtX2Jsb2NrX3Q7CitzdGF0aWMgc3RydWN0IHRyYW5zbWVtX2xpc3QgKnRyYW5zbWVtX2xpc3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRyYW5zbWVtX2Jsb2NrX3Q7CisjZW5kaWYKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKKyNlbmRpZgorCisvKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KKyNpZmRlZiBfTElCQworX19saWJjX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKCwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKyNlbmRpZgorCisvKiBDaGVja2luZyB3aGV0aGVyIHRoZSBiaW5hcmllcyBydW5zIFNVSUQgbXVzdCBiZSBkb25lIGFuZCBnbGliYyBwcm92aWRlcworICAgZWFzaWVyIG1ldGhvZHMgdGhlcmVmb3JlIHdlIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBFTkFCTEVfU0VDVVJFIF9fbGliY19lbmFibGVfc2VjdXJlCisjIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFCisjZWxzZQorIyBpZm5kZWYgSEFWRV9HRVRVSUQKKyMgIGRlZmluZSBnZXR1aWQoKSAwCisjIGVuZGlmCisjIGlmbmRlZiBIQVZFX0dFVEdJRAorIyAgZGVmaW5lIGdldGdpZCgpIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfR0VURVVJRAorIyAgZGVmaW5lIGdldGV1aWQoKSBnZXR1aWQoKQorIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9HRVRFR0lECisjICBkZWZpbmUgZ2V0ZWdpZCgpIGdldGdpZCgpCisjIGVuZGlmCitzdGF0aWMgaW50IGVuYWJsZV9zZWN1cmU7CisjIGRlZmluZSBFTkFCTEVfU0VDVVJFIChlbmFibGVfc2VjdXJlID09IDEpCisjIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFIFwKKyAgaWYgKGVuYWJsZV9zZWN1cmUgPT0gMCkJCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIGlmIChnZXR1aWQgKCkgIT0gZ2V0ZXVpZCAoKSB8fCBnZXRnaWQgKCkgIT0gZ2V0ZWdpZCAoKSkJCSAgICAgIFwKKwllbmFibGVfc2VjdXJlID0gMTsJCQkJCQkgICAgICBcCisgICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisJZW5hYmxlX3NlY3VyZSA9IC0xOwkJCQkJCSAgICAgIFwKKyAgICB9CisjZW5kaWYKKworLyogR2V0IHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24uICAqLworI2luY2x1ZGUgImV2YWwtcGx1cmFsLmgiCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgQ0FURUdPUlkgbG9jYWxlIGFuZCwgaWYgUExVUkFMIGlzIG5vbnplcm8sIHNlYXJjaCBvdmVyIHN0cmluZworICAgZGVwZW5kaW5nIG9uIHRoZSBwbHVyYWwgZm9ybSBkZXRlcm1pbmVkIGJ5IE4uICAqLworY2hhciAqCitEQ0lHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKKwkgICAgaW50IHBsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgbiwgaW50IGNhdGVnb3J5KQoreworI2lmbmRlZiBIQVZFX0FMTE9DQQorICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7CisjZW5kaWYKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOworICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKKyAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOworICBjb25zdCBjaGFyICpjYXRlZ29yeXZhbHVlOworICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7CisgIGNoYXIgKnNpbmdsZV9sb2NhbGU7CisgIGNoYXIgKnJldHZhbDsKKyAgc2l6ZV90IHJldGxlbjsKKyAgaW50IHNhdmVkX2Vycm5vOworI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKyAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnNlYXJjaDsKKyAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKipmb3VuZHAgPSBOVUxMOworICBzaXplX3QgbXNnaWRfbGVuOworI2VuZGlmCisgIHNpemVfdCBkb21haW5uYW1lX2xlbjsKKworICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KKyAgaWYgKG1zZ2lkMSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisjaWZkZWYgX0xJQkMKKyAgaWYgKGNhdGVnb3J5IDwgMCB8fCBjYXRlZ29yeSA+PSBfX0xDX0xBU1QgfHwgY2F0ZWdvcnkgPT0gTENfQUxMKQorICAgIC8qIEJvZ3VzLiAgKi8KKyAgICByZXR1cm4gKHBsdXJhbCA9PSAwCisJICAgID8gKGNoYXIgKikgbXNnaWQxCisJICAgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLworCSAgICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7CisjZW5kaWYKKworICBfX2xpYmNfcndsb2NrX3JkbG9jayAoX25sX3N0YXRlX2xvY2spOworCisgIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKKyAgICAgQ0FURUdPUlkgaXMgbm90IExDX01FU1NBR0VTIHRoaXMgbWlnaHQgbm90IG1ha2UgbXVjaCBzZW5zZSBidXQgdGhlCisgICAgIGRlZmluaXRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisgICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIC8qIE9TLzIgc3BlY2lmaWM6IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaWJpbnRsIHZlcnNpb25zICAqLworI2lmZGVmIExDX01FU1NBR0VTX0NPTVBBVAorICBpZiAoY2F0ZWdvcnkgPT0gTENfTUVTU0FHRVNfQ09NUEFUKQorICAgIGNhdGVnb3J5ID0gTENfTUVTU0FHRVM7CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKyAgbXNnaWRfbGVuID0gc3RybGVuIChtc2dpZDEpICsgMTsKKworICAvKiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gYW1vbmcgdGhvc2Ugd2hpY2ggd2UgZm91bmQgYXQKKyAgICAgc29tZSB0aW1lLiAgKi8KKyAgc2VhcmNoID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopCisJICAgYWxsb2NhIChvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKSArIG1zZ2lkX2xlbik7CisgIG1lbWNweSAoc2VhcmNoLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOworICBzZWFyY2gtPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBkb21haW5uYW1lOworICBzZWFyY2gtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisKKyAgZm91bmRwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqKSB0ZmluZCAoc2VhcmNoLCAmcm9vdCwgdHJhbnNjbXApOworICBmcmVlYSAoc2VhcmNoKTsKKyAgaWYgKGZvdW5kcCAhPSBOVUxMICYmICgqZm91bmRwKS0+Y291bnRlciA9PSBfbmxfbXNnX2NhdF9jbnRyKQorICAgIHsKKyAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KKyAgICAgIGlmIChwbHVyYWwpCisJcmV0dmFsID0gcGx1cmFsX2xvb2t1cCAoKCpmb3VuZHApLT5kb21haW4sIG4sICgqZm91bmRwKS0+dHJhbnNsYXRpb24sCisJCQkJKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGgpOworICAgICAgZWxzZQorCXJldHZhbCA9IChjaGFyICopICgqZm91bmRwKS0+dHJhbnNsYXRpb247CisKKyAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyNlbmRpZgorCisgIC8qIFByZXNlcnZlIHRoZSBgZXJybm8nIHZhbHVlLiAgKi8KKyAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgb3Igbm90LiAgKi8KKyAgREVURVJNSU5FX1NFQ1VSRTsKKworICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLworICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKKyAgICAgIGlmIChjb21wYXJlID09IDApCisJLyogV2UgZm91bmQgaXQhICAqLworCWJyZWFrOworICAgICAgaWYgKGNvbXBhcmUgPCAwKQorCXsKKwkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCisJICBiaW5kaW5nID0gTlVMTDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKKyAgICBkaXJuYW1lID0gKGNoYXIgKikgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworICBlbHNlIGlmIChJU19BQlNPTFVURV9QQVRIIChiaW5kaW5nLT5kaXJuYW1lKSkKKyAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLworICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7CisgICAgICBzaXplX3QgcGF0aF9tYXg7CisgICAgICBjaGFyICpyZXQ7CisKKyAgICAgIHBhdGhfbWF4ID0gKHVuc2lnbmVkIGludCkgUEFUSF9NQVg7CisgICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KKworICAgICAgZm9yICg7OykKKwl7CisJICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKKwkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7CisKKwkgIF9fc2V0X2Vycm5vICgwKTsKKwkgIHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpOworCSAgaWYgKHJldCAhPSBOVUxMIHx8IGVycm5vICE9IEVSQU5HRSkKKwkgICAgYnJlYWs7CisKKwkgIHBhdGhfbWF4ICs9IHBhdGhfbWF4IC8gMjsKKwkgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKKwl9CisKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkKKwkvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCisJICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KKwlnb3RvIHJldHVybl91bnRyYW5zbGF0ZWQ7CisKKyAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKKyAgICB9CisKKyAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KKyAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOworICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOworCisgIGRvbWFpbm5hbWVfbGVuID0gc3RybGVuIChkb21haW5uYW1lKTsKKyAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQorCQkJCSArIGRvbWFpbm5hbWVfbGVuICsgNSk7CisgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgeGRvbWFpbm5hbWUpOworCisgIHN0cGNweSAobWVtcGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAorCQkgIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuKSwKKwkgICIubW8iKTsKKworICAvKiBDcmVhdGluZyB3b3JraW5nIGFyZWEuICAqLworICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7CisgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7CisKKworICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKKyAgICAgZ290IGFuIG9yZGVyZWQgbGlzdCBvZiBsYW5ndWFnZXMgdG8gY29uc2lkZXIgZm9yIHRoZSB0cmFuc2xhdGlvbi4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIE1ha2UgQ0FURUdPUllWQUxVRSBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgKi8KKyAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCisJKytjYXRlZ29yeXZhbHVlOworICAgICAgaWYgKGNhdGVnb3J5dmFsdWVbMF0gPT0gJ1wwJykKKwl7CisJICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKKwkgICAgIG5vIHZhbGlkIGVudHJ5IGhhcyBiZWVuIGZvdW5kLiAgV2Ugc29sdmUgdGhpcyBzaXR1YXRpb24KKwkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCisJICAgICB3aWxsIHRha2UgcGxhY2UuICAqLworCSAgc2luZ2xlX2xvY2FsZVswXSA9ICdDJzsKKwkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7CisJICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gIT0gJzonKQorCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7CisJICAqY3AgPSAnXDAnOworCisJICAvKiBXaGVuIHRoaXMgaXMgYSBTVUlEIGJpbmFyeSB3ZSBtdXN0IG5vdCBhbGxvdyBhY2Nlc3NpbmcgZmlsZXMKKwkgICAgIG91dHNpZGUgdGhlIGRlZGljYXRlZCBkaXJlY3Rvcmllcy4gICovCisJICBpZiAoRU5BQkxFX1NFQ1VSRSAmJiBJU19QQVRIX1dJVEhfRElSIChzaW5nbGVfbG9jYWxlKSkKKwkgICAgLyogSW5nb3JlIHRoaXMgZW50cnkuICAqLworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCisJIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLworICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCisJICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKKwkgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkuICAqLworICAgICAgZG9tYWluID0gX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBzaW5nbGVfbG9jYWxlLCB4ZG9tYWlubmFtZSwgYmluZGluZyk7CisKKyAgICAgIGlmIChkb21haW4gIT0gTlVMTCkKKwl7CisJICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbiwgYmluZGluZywgbXNnaWQxLCAmcmV0bGVuKTsKKworCSAgaWYgKHJldHZhbCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgaW50IGNudDsKKworCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKwkJeworCQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLT5zdWNjZXNzb3JbY250XSwgYmluZGluZywKKwkJCQkJIG1zZ2lkMSwgJnJldGxlbik7CisKKwkJICBpZiAocmV0dmFsICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGRvbWFpbiA9IGRvbWFpbi0+c3VjY2Vzc29yW2NudF07CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKHJldHZhbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogRm91bmQgdGhlIHRyYW5zbGF0aW9uIG9mIE1TR0lEMSBpbiBkb21haW4gRE9NQUlOOgorCQkgc3RhcnRpbmcgYXQgUkVUVkFMLCBSRVRMRU4gYnl0ZXMuICAqLworCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKyNpZiBkZWZpbmVkIEhBVkVfVFNFQVJDSCB8fCBkZWZpbmVkIF9MSUJDCisJICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMKQorCQl7CisJCSAgLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIHNlYXJjaCB0cmVlLiAgKi8KKwkJICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqbmV3cDsKKworCQkgIG5ld3AgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikKKwkJICAgIG1hbGxvYyAob2Zmc2V0b2YgKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90LCBtc2dpZCkKKwkJCSAgICArIG1zZ2lkX2xlbiArIGRvbWFpbm5hbWVfbGVuICsgMSk7CisJCSAgaWYgKG5ld3AgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgbmV3cC0+ZG9tYWlubmFtZSA9CisJCQltZW1wY3B5IChuZXdwLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOworCQkgICAgICBtZW1jcHkgKG5ld3AtPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuICsgMSk7CisJCSAgICAgIG5ld3AtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJCSAgICAgIG5ld3AtPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOworCQkgICAgICBuZXdwLT5kb21haW4gPSBkb21haW47CisJCSAgICAgIG5ld3AtPnRyYW5zbGF0aW9uID0gcmV0dmFsOworCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47CisKKwkJICAgICAgLyogSW5zZXJ0IHRoZSBlbnRyeSBpbiB0aGUgc2VhcmNoIHRyZWUuICAqLworCQkgICAgICBmb3VuZHAgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKiopCisJCQl0c2VhcmNoIChuZXdwLCAmcm9vdCwgdHJhbnNjbXApOworCQkgICAgICBpZiAoZm91bmRwID09IE5VTEwKKwkJCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKmZvdW5kcCAhPSBuZXdwLCAwKSkKKwkJCS8qIFRoZSBpbnNlcnQgZmFpbGVkLiAgKi8KKwkJCWZyZWUgKG5ld3ApOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogV2UgY2FuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkuICAqLworCQkgICgqZm91bmRwKS0+Y291bnRlciA9IF9ubF9tc2dfY2F0X2NudHI7CisJCSAgKCpmb3VuZHApLT5kb21haW4gPSBkb21haW47CisJCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbiA9IHJldHZhbDsKKwkJICAoKmZvdW5kcCktPnRyYW5zbGF0aW9uX2xlbmd0aCA9IHJldGxlbjsKKwkJfQorI2VuZGlmCisJICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKworCSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KKwkgICAgICBpZiAocGx1cmFsKQorCQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwIChkb21haW4sIG4sIHJldHZhbCwgcmV0bGVuKTsKKworCSAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7CisJICAgICAgcmV0dXJuIHJldHZhbDsKKwkgICAgfQorCX0KKyAgICB9CisKKyByZXR1cm5fdW50cmFuc2xhdGVkOgorICAvKiBSZXR1cm4gdGhlIHVudHJhbnNsYXRlZCBNU0dJRC4gICovCisgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKyNpZiAwCQkJCS8qIERvZXNuJ3Qgd29yayB3aXRoIGRpZXQgbGliYyAtLSBUWVQgKi8KKyNpZm5kZWYgX0xJQkMKKyAgaWYgKCFFTkFCTEVfU0VDVVJFKQorICAgIHsKKyAgICAgIGV4dGVybiB2b2lkIF9ubF9sb2dfdW50cmFuc2xhdGVkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwKKwkJCQkJY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkJCQkJY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCisJCQkJCWludCBwbHVyYWwpOworICAgICAgY29uc3QgY2hhciAqbG9nZmlsZW5hbWUgPSBnZXRlbnYgKCJHRVRURVhUX0xPR19VTlRSQU5TTEFURUQiKTsKKworICAgICAgaWYgKGxvZ2ZpbGVuYW1lICE9IE5VTEwgJiYgbG9nZmlsZW5hbWVbMF0gIT0gJ1wwJykKKwlfbmxfbG9nX3VudHJhbnNsYXRlZCAobG9nZmlsZW5hbWUsIGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBwbHVyYWwpOworICAgIH0KKyNlbmRpZgorI2VuZGlmCisgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7CisgIHJldHVybiAocGx1cmFsID09IDAKKwkgID8gKGNoYXIgKikgbXNnaWQxCisJICAvKiBVc2UgdGhlIEdlcm1hbmljIHBsdXJhbCBydWxlLiAgKi8KKwkgIDogbiA9PSAxID8gKGNoYXIgKikgbXNnaWQxIDogKGNoYXIgKikgbXNnaWQyKTsKK30KKworCitjaGFyICoKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorCSAgICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICptc2dpZCwKKwkgICAgICBzaXplX3QgKmxlbmd0aHApCit7CisgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47CisgIG5sc191aW50MzIgbnN0cmluZ3M7CisgIHNpemVfdCBhY3Q7CisgIGNoYXIgKnJlc3VsdDsKKyAgc2l6ZV90IHJlc3VsdGxlbjsKKworICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgPT0gMCkKKyAgICBfbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nKTsKKworICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7CisKKyAgbnN0cmluZ3MgPSBkb21haW4tPm5zdHJpbmdzOworCisgIC8qIExvY2F0ZSB0aGUgTVNHSUQgYW5kIGl0cyB0cmFuc2xhdGlvbi4gICovCisgIGlmIChkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCisgICAgeworICAgICAgLyogVXNlIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KKyAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7CisgICAgICBubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKKyAgICAgIG5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKKyAgICAgIG5sc191aW50MzIgaW5jciA9IDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIG5sc191aW50MzIgbnN0ciA9CisJICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOworCisJICBpZiAobnN0ciA9PSAwKQorCSAgICAvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KKwkgICAgcmV0dXJuIE5VTEw7CisKKwkgIG5zdHItLTsKKworCSAgLyogQ29tcGFyZSBtc2dpZCB3aXRoIHRoZSBvcmlnaW5hbCBzdHJpbmcgYXQgaW5kZXggbnN0ci4KKwkgICAgIFdlIGNvbXBhcmUgdGhlIGxlbmd0aHMgd2l0aCA+PSwgbm90ID09LCBiZWNhdXNlIHBsdXJhbCBlbnRyaWVzCisJICAgICBhcmUgcmVwcmVzZW50ZWQgYnkgc3RyaW5ncyB3aXRoIGFuIGVtYmVkZGVkIE5VTC4gICovCisJICBpZiAobnN0ciA8IG5zdHJpbmdzCisJICAgICAgPyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyXS5sZW5ndGgpID49IGxlbgorCQkmJiAoc3RyY21wIChtc2dpZCwKKwkJCSAgICBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQkJICAgICAgZG9tYWluLT5vcmlnX3RhYltuc3RyXS5vZmZzZXQpKQorCQkgICAgPT0gMCkKKwkgICAgICA6IGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiW25zdHIgLSBuc3RyaW5nc10ubGVuZ3RoID4gbGVuCisJCSYmIChzdHJjbXAgKG1zZ2lkLAorCQkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiW25zdHIgLSBuc3RyaW5nc10ucG9pbnRlcikKKwkJICAgID09IDApKQorCSAgICB7CisJICAgICAgYWN0ID0gbnN0cjsKKwkgICAgICBnb3RvIGZvdW5kOworCSAgICB9CisKKwkgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQorCSAgICBpZHggLT0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyOworCSAgZWxzZQorCSAgICBpZHggKz0gaW5jcjsKKwl9CisgICAgICAvKiBOT1RSRUFDSEVEICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVHJ5IHRoZSBkZWZhdWx0IG1ldGhvZDogIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHNvcnRlZCBhcnJheSBvZgorCSBtZXNzYWdlcy4gICovCisgICAgICBzaXplX3QgdG9wLCBib3R0b207CisKKyAgICAgIGJvdHRvbSA9IDA7CisgICAgICB0b3AgPSBuc3RyaW5nczsKKyAgICAgIHdoaWxlIChib3R0b20gPCB0b3ApCisJeworCSAgaW50IGNtcF92YWw7CisKKwkgIGFjdCA9IChib3R0b20gKyB0b3ApIC8gMjsKKwkgIGNtcF92YWwgPSBzdHJjbXAgKG1zZ2lkLCAoZG9tYWluLT5kYXRhCisJCQkJICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJCSBkb21haW4tPm9yaWdfdGFiW2FjdF0ub2Zmc2V0KSkpOworCSAgaWYgKGNtcF92YWwgPCAwKQorCSAgICB0b3AgPSBhY3Q7CisJICBlbHNlIGlmIChjbXBfdmFsID4gMCkKKwkgICAgYm90dG9tID0gYWN0ICsgMTsKKwkgIGVsc2UKKwkgICAgZ290byBmb3VuZDsKKwl9CisgICAgICAvKiBObyB0cmFuc2xhdGlvbiB3YXMgZm91bmQuICAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgZm91bmQ6CisgIC8qIFRoZSB0cmFuc2xhdGlvbiB3YXMgZm91bmQgYXQgaW5kZXggQUNULiAgSWYgd2UgaGF2ZSB0byBjb252ZXJ0IHRoZQorICAgICBzdHJpbmcgdG8gdXNlIGEgZGlmZmVyZW50IGNoYXJhY3RlciBzZXQsIHRoaXMgaXMgdGhlIHRpbWUuICAqLworICBpZiAoYWN0IDwgbnN0cmluZ3MpCisgICAgeworICAgICAgcmVzdWx0ID0gKGNoYXIgKikKKwkoZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ub2Zmc2V0KSk7CisgICAgICByZXN1bHRsZW4gPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbYWN0XS5sZW5ndGgpICsgMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXN1bHQgPSAoY2hhciAqKSBkb21haW4tPnRyYW5zX3N5c2RlcF90YWJbYWN0IC0gbnN0cmluZ3NdLnBvaW50ZXI7CisgICAgICByZXN1bHRsZW4gPSBkb21haW4tPnRyYW5zX3N5c2RlcF90YWJbYWN0IC0gbnN0cmluZ3NdLmxlbmd0aDsKKyAgICB9CisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IEhBVkVfSUNPTlYKKyAgaWYgKGRvbWFpbi0+Y29kZXNldF9jbnRyCisgICAgICAhPSAoZG9tYWluYmluZGluZyAhPSBOVUxMID8gZG9tYWluYmluZGluZy0+Y29kZXNldF9jbnRyIDogMCkpCisgICAgeworICAgICAgLyogVGhlIGRvbWFpbidzIGNvZGVzZXQgaGFzIGNoYW5nZWQgdGhyb3VnaCBiaW5kX3RleHRkb21haW5fY29kZXNldCgpCisJIHNpbmNlIHRoZSBtZXNzYWdlIGNhdGFsb2cgd2FzIGluaXRpYWxpemVkIG9yIGxhc3QgYWNjZXNzZWQuICBXZQorCSBoYXZlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgY29udmVydGVyLiAgKi8KKyAgICAgIF9ubF9mcmVlX2RvbWFpbl9jb252IChkb21haW4pOworICAgICAgX25sX2luaXRfZG9tYWluX2NvbnYgKGRvbWFpbl9maWxlLCBkb21haW4sIGRvbWFpbmJpbmRpbmcpOworICAgIH0KKworICBpZiAoCisjIGlmZGVmIF9MSUJDCisgICAgICBkb21haW4tPmNvbnYgIT0gKF9fZ2NvbnZfdCkgLTEKKyMgZWxzZQorIyAgaWYgSEFWRV9JQ09OVgorICAgICAgZG9tYWluLT5jb252ICE9IChpY29udl90KSAtMQorIyAgZW5kaWYKKyMgZW5kaWYKKyAgICAgICkKKyAgICB7CisgICAgICAvKiBXZSBhcmUgc3VwcG9zZWQgdG8gZG8gYSBjb252ZXJzaW9uLiAgRmlyc3QgYWxsb2NhdGUgYW4KKwkgYXBwcm9wcmlhdGUgdGFibGUgd2l0aCB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIHRhYmxlCisJIG9mIHRyYW5zbGF0aW9ucyBpbiB0aGUgZmlsZSwgd2hlcmUgd2UgY2FuIHB1dCB0aGUgcG9pbnRlcnMKKwkgdG8gdGhlIGNvbnZlcnRlZCBzdHJpbmdzIGluLgorCSBUaGVyZSBpcyBhIHNsaWdodCBjb21wbGljYXRpb24gd2l0aCBwbHVyYWwgZW50cmllcy4gIFRoZXkKKwkgYXJlIHJlcHJlc2VudGVkIGJ5IGNvbnNlY3V0aXZlIE5VTCB0ZXJtaW5hdGVkIHN0cmluZ3MuICBXZQorCSBoYW5kbGUgdGhpcyBjYXNlIGJ5IGNvbnZlcnRpbmcgUkVTVUxUTEVOIGJ5dGVzLCBpbmNsdWRpbmcKKwkgTlVMcy4gICovCisKKyAgICAgIGlmIChkb21haW4tPmNvbnZfdGFiID09IE5VTEwKKwkgICYmICgoZG9tYWluLT5jb252X3RhYiA9CisJCSAoY2hhciAqKikgY2FsbG9jIChuc3RyaW5ncyArIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncywKKwkJCQkgICBzaXplb2YgKGNoYXIgKikpKQorCSAgICAgID09IE5VTEwpKQorCS8qIE1hcmsgdGhhdCB3ZSBkaWRuJ3Qgc3VjY2VlZCBhbGxvY2F0aW5nIGEgdGFibGUuICAqLworCWRvbWFpbi0+Y29udl90YWIgPSAoY2hhciAqKikgLTE7CisKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChkb21haW4tPmNvbnZfdGFiID09IChjaGFyICoqKSAtMSwgMCkpCisJLyogTm90aGluZyB3ZSBjYW4gZG8sIG5vIG1vcmUgbWVtb3J5LiAgKi8KKwlnb3RvIGNvbnZlcnRlZDsKKworICAgICAgaWYgKGRvbWFpbi0+Y29udl90YWJbYWN0XSA9PSBOVUxMKQorCXsKKwkgIC8qIFdlIGhhdmVuJ3QgdXNlZCB0aGlzIHN0cmluZyBzbyBmYXIsIHNvIGl0IGlzIG5vdAorCSAgICAgdHJhbnNsYXRlZCB5ZXQuICBEbyB0aGlzIG5vdy4gICovCisJICAvKiBXZSB1c2UgYSBiaXQgbW9yZSBlZmZpY2llbnQgbWVtb3J5IGhhbmRsaW5nLgorCSAgICAgV2UgYWxsb2NhdGUgYWx3YXlzIGxhcmdlciBibG9ja3Mgd2hpY2ggZ2V0IHVzZWQgb3ZlcgorCSAgICAgdGltZS4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbWFueSBzbWFsbCBhbGxvY2F0aW9ucy4gICAqLworCSAgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spCisjIGRlZmluZSBJTklUSUFMX0JMT0NLX1NJWkUJNDA4MAorCSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgKmZyZWVtZW07CisJICBzdGF0aWMgc2l6ZV90IGZyZWVtZW1fc2l6ZTsKKworCSAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWY7CisJICB1bnNpZ25lZCBjaGFyICpvdXRidWY7CisJICBpbnQgbWFsbG9jX2NvdW50OworIyBpZm5kZWYgX0xJQkMKKwkgIHRyYW5zbWVtX2Jsb2NrX3QgKnRyYW5zbWVtX2xpc3QgPSBOVUxMOworIyBlbmRpZgorCisJICBfX2xpYmNfbG9ja19sb2NrIChsb2NrKTsKKworCSAgaW5idWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByZXN1bHQ7CisJICBvdXRidWYgPSBmcmVlbWVtICsgc2l6ZW9mIChzaXplX3QpOworCisJICBtYWxsb2NfY291bnQgPSAwOworCSAgd2hpbGUgKDEpCisJICAgIHsKKwkgICAgICB0cmFuc21lbV9ibG9ja190ICpuZXdtZW07CisjIGlmZGVmIF9MSUJDCisJICAgICAgc2l6ZV90IG5vbl9yZXZlcnNpYmxlOworCSAgICAgIGludCByZXM7CisKKwkgICAgICBpZiAoZnJlZW1lbV9zaXplIDwgc2l6ZW9mIChzaXplX3QpKQorCQlnb3RvIHJlc2l6ZV9mcmVlbWVtOworCisJICAgICAgcmVzID0gX19nY29udiAoZG9tYWluLT5jb252LAorCQkJICAgICAmaW5idWYsIGluYnVmICsgcmVzdWx0bGVuLAorCQkJICAgICAmb3V0YnVmLAorCQkJICAgICBvdXRidWYgKyBmcmVlbWVtX3NpemUgLSBzaXplb2YgKHNpemVfdCksCisJCQkgICAgICZub25fcmV2ZXJzaWJsZSk7CisKKwkgICAgICBpZiAocmVzID09IF9fR0NPTlZfT0sgfHwgcmVzID09IF9fR0NPTlZfRU1QVFlfSU5QVVQpCisJCWJyZWFrOworCisJICAgICAgaWYgKHJlcyAhPSBfX0dDT05WX0ZVTExfT1VUUFVUKQorCQl7CisJCSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKKwkJICBnb3RvIGNvbnZlcnRlZDsKKwkJfQorCisJICAgICAgaW5idWYgPSByZXN1bHQ7CisjIGVsc2UKKyMgIGlmIEhBVkVfSUNPTlYKKwkgICAgICBjb25zdCBjaGFyICppbnB0ciA9IChjb25zdCBjaGFyICopIGluYnVmOworCSAgICAgIHNpemVfdCBpbmxlZnQgPSByZXN1bHRsZW47CisJICAgICAgY2hhciAqb3V0cHRyID0gKGNoYXIgKikgb3V0YnVmOworCSAgICAgIHNpemVfdCBvdXRsZWZ0OworCisJICAgICAgaWYgKGZyZWVtZW1fc2l6ZSA8IHNpemVvZiAoc2l6ZV90KSkKKwkJZ290byByZXNpemVfZnJlZW1lbTsKKworCSAgICAgIG91dGxlZnQgPSBmcmVlbWVtX3NpemUgLSBzaXplb2YgKHNpemVfdCk7CisJICAgICAgaWYgKGljb252IChkb21haW4tPmNvbnYsCisJCQkgKElDT05WX0NPTlNUIGNoYXIgKiopICZpbnB0ciwgJmlubGVmdCwKKwkJCSAmb3V0cHRyLCAmb3V0bGVmdCkKKwkJICAhPSAoc2l6ZV90KSAoLTEpKQorCQl7CisJCSAgb3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKikgb3V0cHRyOworCQkgIGJyZWFrOworCQl9CisJICAgICAgaWYgKGVycm5vICE9IEUyQklHKQorCQl7CisJCSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKKwkJICBnb3RvIGNvbnZlcnRlZDsKKwkJfQorIyAgZW5kaWYKKyMgZW5kaWYKKworCSAgICByZXNpemVfZnJlZW1lbToKKwkgICAgICAvKiBXZSBtdXN0IGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBvciByZXNpemUgdGhlIG9sZCBvbmUuICAqLworCSAgICAgIGlmIChtYWxsb2NfY291bnQgPiAwKQorCQl7CisJCSAgKyttYWxsb2NfY291bnQ7CisJCSAgZnJlZW1lbV9zaXplID0gbWFsbG9jX2NvdW50ICogSU5JVElBTF9CTE9DS19TSVpFOworCQkgIG5ld21lbSA9ICh0cmFuc21lbV9ibG9ja190ICopIHJlYWxsb2MgKHRyYW5zbWVtX2xpc3QsCisJCQkJCQkJIGZyZWVtZW1fc2l6ZSk7CisjIGlmZGVmIF9MSUJDCisJCSAgaWYgKG5ld21lbSAhPSBOVUxMKQorCQkgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqb2xkID0gdHJhbnNtZW1fbGlzdDsKKworCQkgICAgICB0cmFuc21lbV9saXN0ID0gdHJhbnNtZW1fbGlzdC0+bmV4dDsKKwkJICAgICAgZnJlZSAob2xkKTsKKwkJICAgIH0KKyMgZW5kaWYKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIG1hbGxvY19jb3VudCA9IDE7CisJCSAgZnJlZW1lbV9zaXplID0gSU5JVElBTF9CTE9DS19TSVpFOworCQkgIG5ld21lbSA9ICh0cmFuc21lbV9ibG9ja190ICopIG1hbGxvYyAoZnJlZW1lbV9zaXplKTsKKwkJfQorCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChuZXdtZW0gPT0gTlVMTCwgMCkpCisJCXsKKwkJICBmcmVlbWVtID0gTlVMTDsKKwkJICBmcmVlbWVtX3NpemUgPSAwOworCQkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisJCSAgZ290byBjb252ZXJ0ZWQ7CisJCX0KKworIyBpZmRlZiBfTElCQworCSAgICAgIC8qIEFkZCB0aGUgYmxvY2sgdG8gdGhlIGxpc3Qgb2YgYmxvY2tzIHdlIGhhdmUgdG8gZnJlZQorICAgICAgICAgICAgICAgICBhdCBzb21lIHBvaW50LiAgKi8KKwkgICAgICBuZXdtZW0tPm5leHQgPSB0cmFuc21lbV9saXN0OworCSAgICAgIHRyYW5zbWVtX2xpc3QgPSBuZXdtZW07CisKKwkgICAgICBmcmVlbWVtID0gbmV3bWVtLT5kYXRhOworCSAgICAgIGZyZWVtZW1fc2l6ZSAtPSBvZmZzZXRvZiAoc3RydWN0IHRyYW5zbWVtX2xpc3QsIGRhdGEpOworIyBlbHNlCisJICAgICAgdHJhbnNtZW1fbGlzdCA9IG5ld21lbTsKKwkgICAgICBmcmVlbWVtID0gbmV3bWVtOworIyBlbmRpZgorCisJICAgICAgb3V0YnVmID0gZnJlZW1lbSArIHNpemVvZiAoc2l6ZV90KTsKKwkgICAgfQorCisJICAvKiBXZSBoYXZlIG5vdyBpbiBvdXIgYnVmZmVyIGEgY29udmVydGVkIHN0cmluZy4gIFB1dCB0aGlzCisJICAgICBpbnRvIHRoZSB0YWJsZSBvZiBjb252ZXJzaW9ucy4gICovCisJICAqKHNpemVfdCAqKSBmcmVlbWVtID0gb3V0YnVmIC0gZnJlZW1lbSAtIHNpemVvZiAoc2l6ZV90KTsKKwkgIGRvbWFpbi0+Y29udl90YWJbYWN0XSA9IChjaGFyICopIGZyZWVtZW07CisJICAvKiBTaHJpbmsgZnJlZW1lbSwgYnV0IGtlZXAgaXQgYWxpZ25lZC4gICovCisJICBmcmVlbWVtX3NpemUgLT0gb3V0YnVmIC0gZnJlZW1lbTsKKwkgIGZyZWVtZW0gPSBvdXRidWY7CisJICBmcmVlbWVtICs9IGZyZWVtZW1fc2l6ZSAmIChhbGlnbm9mIChzaXplX3QpIC0gMSk7CisJICBmcmVlbWVtX3NpemUgPSBmcmVlbWVtX3NpemUgJiB+IChhbGlnbm9mIChzaXplX3QpIC0gMSk7CisKKwkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisJfQorCisgICAgICAvKiBOb3cgZG9tYWluLT5jb252X3RhYlthY3RdIGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBvZiBhbGwKKwkgdGhlIHBsdXJhbCB2YXJpYW50cy4gICovCisgICAgICByZXN1bHQgPSBkb21haW4tPmNvbnZfdGFiW2FjdF0gKyBzaXplb2YgKHNpemVfdCk7CisgICAgICByZXN1bHRsZW4gPSAqKHNpemVfdCAqKSBkb21haW4tPmNvbnZfdGFiW2FjdF07CisgICAgfQorCisgY29udmVydGVkOgorICAvKiBUaGUgcmVzdWx0IHN0cmluZyBpcyBjb252ZXJ0ZWQuICAqLworCisjZW5kaWYgLyogX0xJQkMgfHwgSEFWRV9JQ09OViAqLworCisgICpsZW5ndGhwID0gcmVzdWx0bGVuOworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIExvb2sgdXAgYSBwbHVyYWwgdmFyaWFudC4gICovCitzdGF0aWMgY2hhciAqCitpbnRlcm5hbF9mdW5jdGlvbgorcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGludCBuLAorCSAgICAgICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbiwgc2l6ZV90IHRyYW5zbGF0aW9uX2xlbikKK3sKKyAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbmRhdGEgPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluLT5kYXRhOworICB1bnNpZ25lZCBsb25nIGludCBpbmRleDsKKyAgY29uc3QgY2hhciAqcDsKKworICBpbmRleCA9IHBsdXJhbF9ldmFsIChkb21haW5kYXRhLT5wbHVyYWwsIG4pOworICBpZiAoaW5kZXggPj0gZG9tYWluZGF0YS0+bnBsdXJhbHMpCisgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSXQgbWVhbnMgdGhlIHBsdXJhbCBleHByZXNzaW9uIGFuZCB0aGUKKyAgICAgICBnaXZlbiBtYXhpbXVtIHZhbHVlIGRvIG5vdCBtYXRjaC4gICovCisgICAgaW5kZXggPSAwOworCisgIC8qIFNraXAgSU5ERVggc3RyaW5ncyBhdCBUUkFOU0xBVElPTi4gICovCisgIHAgPSB0cmFuc2xhdGlvbjsKKyAgd2hpbGUgKGluZGV4LS0gPiAwKQorICAgIHsKKyNpZmRlZiBfTElCQworICAgICAgcCA9IF9fcmF3bWVtY2hyIChwLCAnXDAnKTsKKyNlbHNlCisgICAgICBwID0gc3RyY2hyIChwLCAnXDAnKTsKKyNlbmRpZgorICAgICAgLyogQW5kIHNraXAgb3ZlciB0aGUgTlVMIGJ5dGUuICAqLworICAgICAgcCsrOworCisgICAgICBpZiAocCA+PSB0cmFuc2xhdGlvbiArIHRyYW5zbGF0aW9uX2xlbikKKwkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBJdCBtZWFucyB0aGUgcGx1cmFsIGV4cHJlc3Npb24KKwkgICBldmFsdWF0ZWQgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHZhcmlhbnRzCisJICAgYXZhaWxhYmxlIGZvciBNU0dJRDEuICAqLworCXJldHVybiAoY2hhciAqKSB0cmFuc2xhdGlvbjsKKyAgICB9CisgIHJldHVybiAoY2hhciAqKSBwOworfQorCisjaWZuZGVmIF9MSUJDCisvKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGxvY2FsZSBDQVRFR09SWS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitpbnRlcm5hbF9mdW5jdGlvbgorY2F0ZWdvcnlfdG9fbmFtZSAoaW50IGNhdGVnb3J5KQoreworICBjb25zdCBjaGFyICpyZXR2YWw7CisKKyAgc3dpdGNoIChjYXRlZ29yeSkKKyAgeworI2lmZGVmIExDX0NPTExBVEUKKyAgY2FzZSBMQ19DT0xMQVRFOgorICAgIHJldHZhbCA9ICJMQ19DT0xMQVRFIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX0NUWVBFCisgIGNhc2UgTENfQ1RZUEU6CisgICAgcmV0dmFsID0gIkxDX0NUWVBFIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX01PTkVUQVJZCisgIGNhc2UgTENfTU9ORVRBUlk6CisgICAgcmV0dmFsID0gIkxDX01PTkVUQVJZIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX05VTUVSSUMKKyAgY2FzZSBMQ19OVU1FUklDOgorICAgIHJldHZhbCA9ICJMQ19OVU1FUklDIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX1RJTUUKKyAgY2FzZSBMQ19USU1FOgorICAgIHJldHZhbCA9ICJMQ19USU1FIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX01FU1NBR0VTCisgIGNhc2UgTENfTUVTU0FHRVM6CisgICAgcmV0dmFsID0gIkxDX01FU1NBR0VTIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX1JFU1BPTlNFCisgIGNhc2UgTENfUkVTUE9OU0U6CisgICAgcmV0dmFsID0gIkxDX1JFU1BPTlNFIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX0FMTAorICBjYXNlIExDX0FMTDoKKyAgICAvKiBUaGlzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlIGJ1dCBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGFueSBvdGhlcgorICAgICAgIHZhbHVlLiAgKi8KKyAgICByZXR2YWwgPSAiTENfQUxMIjsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIC8qIElmIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgZm9yIGEgZGVmYXVsdCB2YWx1ZSBsZXQgbWUga25vdy4gICovCisgICAgcmV0dmFsID0gIkxDX1hYWCI7CisgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qIEd1ZXNzIHZhbHVlIG9mIGN1cnJlbnQgbG9jYWxlIGZyb20gdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitpbnRlcm5hbF9mdW5jdGlvbgorZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQoreworICBjb25zdCBjaGFyICpsYW5ndWFnZTsKKyAgY29uc3QgY2hhciAqcmV0dmFsOworCisgIC8qIFRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50CisgICAgIHZhcmlhYmxlLiAgQnV0IHdlIGRvbid0IHVzZSB0aGUgdmFsdWUgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICBsb2NhbGUgaXMgdGhlIEMgbG9jYWxlLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLworICBsYW5ndWFnZSA9IGdldGVudiAoIkxBTkdVQUdFIik7CisgIGlmIChsYW5ndWFnZSAhPSBOVUxMICYmIGxhbmd1YWdlWzBdID09ICdcMCcpCisgICAgbGFuZ3VhZ2UgPSBOVUxMOworCisgIC8qIFdlIGhhdmUgdG8gcHJvY2VlZCB3aXRoIHRoZSBQT1NJWCBtZXRob2RzIG9mIGxvb2tpbmcgdG8gYExDX0FMTCcsCisgICAgIGBMQ194eHgnLCBhbmQgYExBTkcnLiAgT24gc29tZSBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlCisgICAgIGBzZXRsb2NhbGUnIGZ1bmN0aW9uIGl0c2VsZi4gICovCisjaWZkZWYgX0xJQkMKKyAgcmV0dmFsID0gX19jdXJyZW50X2xvY2FsZV9uYW1lIChjYXRlZ29yeSk7CisjZWxzZQorICByZXR2YWwgPSBfbmxfbG9jYWxlX25hbWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOworI2VuZGlmCisKKyAgLyogSWdub3JlIExBTkdVQUdFIGlmIHRoZSBsb2NhbGUgaXMgc2V0IHRvICJDIiBiZWNhdXNlCisgICAgIDEuICJDIiBsb2NhbGUgdXN1YWxseSB1c2VzIHRoZSBBU0NJSSBlbmNvZGluZywgYW5kIG1vc3QgaW50ZXJuYXRpb25hbAorCW1lc3NhZ2VzIHVzZSBub24tQVNDSUkgY2hhcmFjdGVycy4gVGhlc2UgY2hhcmFjdGVycyBnZXQgZGlzcGxheWVkCisJYXMgcXVlc3Rpb24gbWFya3MgKGlmIHVzaW5nIGdsaWJjJ3MgaWNvbnYoKSkgb3IgYXMgaW52YWxpZCA4LWJpdAorCWNoYXJhY3RlcnMgKGJlY2F1c2Ugb3RoZXIgaWNvbnYoKXMgcmVmdXNlIHRvIGNvbnZlcnQgbW9zdCBub24tQVNDSUkKKwljaGFyYWN0ZXJzIHRvIEFTQ0lJKS4gSW4gYW55IGNhc2UsIHRoZSBvdXRwdXQgaXMgdWdseS4KKyAgICAgMi4gVGhlIHByZWNpc2Ugb3V0cHV0IG9mIHNvbWUgcHJvZ3JhbXMgaW4gdGhlICJDIiBsb2NhbGUgaXMgc3BlY2lmaWVkCisJYnkgUE9TSVggYW5kIHNob3VsZCBub3QgZGVwZW5kIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBsaWtlCisJIkxBTkdVQUdFIi4gIFdlIGFsbG93IHN1Y2ggcHJvZ3JhbXMgdG8gdXNlIGdldHRleHQoKS4gICovCisgIHJldHVybiBsYW5ndWFnZSAhPSBOVUxMICYmIHN0cmNtcCAocmV0dmFsLCAiQyIpICE9IDAgPyBsYW5ndWFnZSA6IHJldHZhbDsKK30KKworLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisKKy8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCisgICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcworICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKKyAgIHRvIGJlIGRlZmluZWQuICAqLworI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKK3N0YXRpYyBjaGFyICoKK3N0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQoreworICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisgICAgLyogRG8gbm90aGluZy4gKi8gOworICByZXR1cm4gZGVzdCAtIDE7Cit9CisjZW5kaWYKKworI2lmICFfTElCQyAmJiAhSEFWRV9NRU1QQ1BZCitzdGF0aWMgdm9pZCAqCittZW1wY3B5ICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIG1lbWNweSAoZGVzdCwgc3JjLCBuKSArIG4pOworfQorI2VuZGlmCisKKworI2lmZGVmIF9MSUJDCisvKiBJZiB3ZSB3YW50IHRvIGZyZWUgYWxsIHJlc291cmNlcyB3ZSBoYXZlIHRvIGRvIHNvbWUgd29yayBhdAorICAgcHJvZ3JhbSdzIGVuZC4gICovCitsaWJjX2ZyZWVyZXNfZm4gKGZyZWVfbWVtKQoreworICB2b2lkICpvbGQ7CisKKyAgd2hpbGUgKF9ubF9kb21haW5fYmluZGluZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGluZyAqb2xkcCA9IF9ubF9kb21haW5fYmluZGluZ3M7CisgICAgICBfbmxfZG9tYWluX2JpbmRpbmdzID0gX25sX2RvbWFpbl9iaW5kaW5ncy0+bmV4dDsKKyAgICAgIGlmIChvbGRwLT5kaXJuYW1lICE9IElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKSkKKwkvKiBZZXMsIHRoaXMgaXMgYSBwb2ludGVyIGNvbXBhcmlzb24uICAqLworCWZyZWUgKG9sZHAtPmRpcm5hbWUpOworICAgICAgZnJlZSAob2xkcC0+Y29kZXNldCk7CisgICAgICBmcmVlIChvbGRwKTsKKyAgICB9CisKKyAgaWYgKF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQorICAgIC8qIFllcywgYWdhaW4gYSBwb2ludGVyIGNvbXBhcmlzb24uICAqLworICAgIGZyZWUgKChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluKTsKKworICAvKiBSZW1vdmUgdGhlIHNlYXJjaCB0cmVlIHdpdGggdGhlIGtub3duIHRyYW5zbGF0aW9ucy4gICovCisgIF9fdGRlc3Ryb3kgKHJvb3QsIGZyZWUpOworICByb290ID0gTlVMTDsKKworICB3aGlsZSAodHJhbnNtZW1fbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG9sZCA9IHRyYW5zbWVtX2xpc3Q7CisgICAgICB0cmFuc21lbV9saXN0ID0gdHJhbnNtZW1fbGlzdC0+bmV4dDsKKyAgICAgIGZyZWUgKG9sZCk7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZGNuZ2V0dGV4dC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2RjbmdldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGEzZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2RjbmdldHRleHQuYwpAQCAtMCwwICsxLDU3IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGNuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0CisjIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAorI2Vsc2UKKyMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0CisjIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorICAgbG9jYWxlLiAgKi8KK2NoYXIgKgorRENOR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4sCisJICAgIGludCBjYXRlZ29yeSkKK3sKKyAgcmV0dXJuIERDSUdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCAxLCBuLCBjYXRlZ29yeSk7Cit9CisKKyNpZmRlZiBfTElCQworLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCit3ZWFrX2FsaWFzIChfX2RjbmdldHRleHQsIGRjbmdldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZGdldHRleHQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9kZ2V0dGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGIwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZGdldHRleHQuYwpAQCAtMCwwICsxLDU4IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGdldHRleHQoMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAorIyBkZWZpbmUgRENHRVRURVhUIElOVFVTRShfX2RjZ2V0dGV4dCkKKyNlbHNlCisjIGRlZmluZSBER0VUVEVYVCBsaWJpbnRsX2RnZXR0ZXh0CisjIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBvZiB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KK2NoYXIgKgorREdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkKQoreworICByZXR1cm4gRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19kZ2V0dGV4dCwgZGdldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZG5nZXR0ZXh0LmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZG5nZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxNTYzNwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9kbmdldHRleHQuYwpAQCAtMCwwICsxLDU5IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZG5nZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEROR0VUVEVYVCBfX2RuZ2V0dGV4dAorIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKKyNlbHNlCisjIGRlZmluZSBETkdFVFRFWFQgbGliaW50bF9kbmdldHRleHQKKyMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZSBhbmQgc2tpcCBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUgcGx1cmFsIGZvcm0uICAqLworY2hhciAqCitETkdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHJldHVybiBEQ05HRVRURVhUIChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19kbmdldHRleHQsIGRuZ2V0dGV4dCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9ldmFsLXBsdXJhbC5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2V2YWwtcGx1cmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiZDVhZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9ldmFsLXBsdXJhbC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBQbHVyYWwgZXhwcmVzc2lvbiBldmFsdWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIFNUQVRJQworI2RlZmluZSBTVEFUSUMgc3RhdGljCisjZW5kaWYKKworLyogRXZhbHVhdGUgdGhlIHBsdXJhbCBleHByZXNzaW9uIGFuZCByZXR1cm4gYW4gaW5kZXggdmFsdWUuICAqLworU1RBVElDCit1bnNpZ25lZCBsb25nIGludAoraW50ZXJuYWxfZnVuY3Rpb24KK3BsdXJhbF9ldmFsIChzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwgdW5zaWduZWQgbG9uZyBpbnQgbikKK3sKKyAgc3dpdGNoIChwZXhwLT5uYXJncykKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgc3dpdGNoIChwZXhwLT5vcGVyYXRpb24pCisJeworCWNhc2UgdmFyOgorCSAgcmV0dXJuIG47CisJY2FzZSBudW06CisJICByZXR1cm4gcGV4cC0+dmFsLm51bTsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgeworCS8qIHBleHAtPm9wZXJhdGlvbiBtdXN0IGJlIGxub3QuICAqLworCXVuc2lnbmVkIGxvbmcgaW50IGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7CisJcmV0dXJuICEgYXJnOworICAgICAgfQorICAgIGNhc2UgMjoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIGludCBsZWZ0YXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKKwlpZiAocGV4cC0+b3BlcmF0aW9uID09IGxvcikKKwkgIHJldHVybiBsZWZ0YXJnIHx8IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7CisJZWxzZSBpZiAocGV4cC0+b3BlcmF0aW9uID09IGxhbmQpCisJICByZXR1cm4gbGVmdGFyZyAmJiBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworCWVsc2UKKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBpbnQgcmlnaHRhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworCisJICAgIHN3aXRjaCAocGV4cC0+b3BlcmF0aW9uKQorCSAgICAgIHsKKwkgICAgICBjYXNlIG11bHQ6CisJCXJldHVybiBsZWZ0YXJnICogcmlnaHRhcmc7CisJICAgICAgY2FzZSBkaXZpZGU6CisjaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQorCQlpZiAocmlnaHRhcmcgPT0gMCkKKwkJICByYWlzZSAoU0lHRlBFKTsKKyNlbmRpZgorCQlyZXR1cm4gbGVmdGFyZyAvIHJpZ2h0YXJnOworCSAgICAgIGNhc2UgbW9kdWxlOgorI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKKwkJaWYgKHJpZ2h0YXJnID09IDApCisJCSAgcmFpc2UgKFNJR0ZQRSk7CisjZW5kaWYKKwkJcmV0dXJuIGxlZnRhcmcgJSByaWdodGFyZzsKKwkgICAgICBjYXNlIHBsdXM6CisJCXJldHVybiBsZWZ0YXJnICsgcmlnaHRhcmc7CisJICAgICAgY2FzZSBtaW51czoKKwkJcmV0dXJuIGxlZnRhcmcgLSByaWdodGFyZzsKKwkgICAgICBjYXNlIGxlc3NfdGhhbjoKKwkJcmV0dXJuIGxlZnRhcmcgPCByaWdodGFyZzsKKwkgICAgICBjYXNlIGdyZWF0ZXJfdGhhbjoKKwkJcmV0dXJuIGxlZnRhcmcgPiByaWdodGFyZzsKKwkgICAgICBjYXNlIGxlc3Nfb3JfZXF1YWw6CisJCXJldHVybiBsZWZ0YXJnIDw9IHJpZ2h0YXJnOworCSAgICAgIGNhc2UgZ3JlYXRlcl9vcl9lcXVhbDoKKwkJcmV0dXJuIGxlZnRhcmcgPj0gcmlnaHRhcmc7CisJICAgICAgY2FzZSBlcXVhbDoKKwkJcmV0dXJuIGxlZnRhcmcgPT0gcmlnaHRhcmc7CisJICAgICAgY2FzZSBub3RfZXF1YWw6CisJCXJldHVybiBsZWZ0YXJnICE9IHJpZ2h0YXJnOworCSAgICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwkvKiBOT1RSRUFDSEVEICovCisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAzOgorICAgICAgeworCS8qIHBleHAtPm9wZXJhdGlvbiBtdXN0IGJlIHFtb3AuICAqLworCXVuc2lnbmVkIGxvbmcgaW50IGJvb2xhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOworCXJldHVybiBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbYm9vbGFyZyA/IDEgOiAyXSwgbik7CisgICAgICB9CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2V4cGxvZGVuYW1lLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZXhwbG9kZW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmMyNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2V4cGxvZGVuYW1lLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJsb2FkaW5mby5oIgorCisvKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KKyNpZm5kZWYgTlVMTAorIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCisjICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyMgZWxzZQorIyAgZGVmaW5lIE5VTEwgMAorIyBlbmRpZgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworY2hhciAqCitfbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgd2hpbGUgKG5hbWVbMF0gIT0gJ1wwJyAmJiBuYW1lWzBdICE9ICdfJyAmJiBuYW1lWzBdICE9ICdAJworCSAmJiBuYW1lWzBdICE9ICcrJyAmJiBuYW1lWzBdICE9ICcsJykKKyAgICArK25hbWU7CisKKyAgcmV0dXJuIChjaGFyICopIG5hbWU7Cit9CisKKworaW50CitfbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLAorCQkgIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwgY29uc3QgY2hhciAqKm1vZGlmaWVyLAorCQkgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAorCQkgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsIGNvbnN0IGNoYXIgKipzcGVjaWFsLAorCQkgIGNvbnN0IGNoYXIgKipzcG9uc29yLCBjb25zdCBjaGFyICoqcmV2aXNpb24pCit7CisgIGVudW0geyB1bmRlY2lkZWQsIHhwZywgY2VuIH0gc3ludGF4OworICBjaGFyICpjcDsKKyAgaW50IG1hc2s7CisKKyAgKm1vZGlmaWVyID0gTlVMTDsKKyAgKnRlcnJpdG9yeSA9IE5VTEw7CisgICpjb2Rlc2V0ID0gTlVMTDsKKyAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IE5VTEw7CisgICpzcGVjaWFsID0gTlVMTDsKKyAgKnNwb25zb3IgPSBOVUxMOworICAqcmV2aXNpb24gPSBOVUxMOworCisgIC8qIE5vdyB3ZSBkZXRlcm1pbmUgdGhlIHNpbmdsZSBwYXJ0cyBvZiB0aGUgbG9jYWxlIG5hbWUuICBGaXJzdAorICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycgYW5kIGBAJyBpZgorICAgICB3ZSB1c2UgWFBHNCBzdHlsZSwgYW5kIGBfJywgYCsnLCBhbmQgYCwnIGlmIHdlIHVzZSBDRU4gc3ludGF4LiAgKi8KKyAgbWFzayA9IDA7CisgIHN5bnRheCA9IHVuZGVjaWRlZDsKKyAgKmxhbmd1YWdlID0gY3AgPSBuYW1lOworICBjcCA9IF9ubF9maW5kX2xhbmd1YWdlICgqbGFuZ3VhZ2UpOworCisgIGlmICgqbGFuZ3VhZ2UgPT0gY3ApCisgICAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlOiBsYW5ndWFnZSBoYXMgdG8gYmUgc3BlY2lmaWVkLiAgVXNlCisgICAgICAgdGhpcyBlbnRyeSBhcyBpdCBpcyB3aXRob3V0IGV4cGxvZGluZy4gIFBlcmhhcHMgaXQgaXMgYW4gYWxpYXMuICAqLworICAgIGNwID0gc3RyY2hyICgqbGFuZ3VhZ2UsICdcMCcpOworICBlbHNlIGlmIChjcFswXSA9PSAnXycpCisgICAgeworICAgICAgLyogTmV4dCBpcyB0aGUgdGVycml0b3J5LiAgKi8KKyAgICAgIGNwWzBdID0gJ1wwJzsKKyAgICAgICp0ZXJyaXRvcnkgPSArK2NwOworCisgICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLicgJiYgY3BbMF0gIT0gJ0AnCisJICAgICAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKKwkrK2NwOworCisgICAgICBtYXNrIHw9IFRFUlJJVE9SWTsKKworICAgICAgaWYgKGNwWzBdID09ICcuJykKKwl7CisJICAvKiBOZXh0IGlzIHRoZSBjb2Rlc2V0LiAgKi8KKwkgIHN5bnRheCA9IHhwZzsKKwkgIGNwWzBdID0gJ1wwJzsKKwkgICpjb2Rlc2V0ID0gKytjcDsKKworCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ0AnKQorCSAgICArK2NwOworCisJICBtYXNrIHw9IFhQR19DT0RFU0VUOworCisJICBpZiAoKmNvZGVzZXQgIT0gY3AgJiYgKCpjb2Rlc2V0KVswXSAhPSAnXDAnKQorCSAgICB7CisJICAgICAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IF9ubF9ub3JtYWxpemVfY29kZXNldCAoKmNvZGVzZXQsCisJCQkJCQkJICAgY3AgLSAqY29kZXNldCk7CisJICAgICAgaWYgKHN0cmNtcCAoKmNvZGVzZXQsICpub3JtYWxpemVkX2NvZGVzZXQpID09IDApCisJCWZyZWUgKChjaGFyICopICpub3JtYWxpemVkX2NvZGVzZXQpOworCSAgICAgIGVsc2UKKwkJbWFzayB8PSBYUEdfTk9STV9DT0RFU0VUOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoY3BbMF0gPT0gJ0AnIHx8IChzeW50YXggIT0geHBnICYmIGNwWzBdID09ICcrJykpCisgICAgeworICAgICAgLyogTmV4dCBpcyB0aGUgbW9kaWZpZXIuICAqLworICAgICAgc3ludGF4ID0gY3BbMF0gPT0gJ0AnID8geHBnIDogY2VuOworICAgICAgY3BbMF0gPSAnXDAnOworICAgICAgKm1vZGlmaWVyID0gKytjcDsKKworICAgICAgd2hpbGUgKHN5bnRheCA9PSBjZW4gJiYgY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnKycKKwkgICAgICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCisJKytjcDsKKworICAgICAgbWFzayB8PSBYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0U7CisgICAgfQorCisgIGlmIChzeW50YXggIT0geHBnICYmIChjcFswXSA9PSAnKycgfHwgY3BbMF0gPT0gJywnIHx8IGNwWzBdID09ICdfJykpCisgICAgeworICAgICAgc3ludGF4ID0gY2VuOworCisgICAgICBpZiAoY3BbMF0gPT0gJysnKQorCXsKKyAJICAvKiBOZXh0IGlzIHNwZWNpYWwgYXBwbGljYXRpb24gKENFTiBzeW50YXgpLiAgKi8KKwkgIGNwWzBdID0gJ1wwJzsKKwkgICpzcGVjaWFsID0gKytjcDsKKworCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKKwkgICAgKytjcDsKKworCSAgbWFzayB8PSBDRU5fU1BFQ0lBTDsKKwl9CisKKyAgICAgIGlmIChjcFswXSA9PSAnLCcpCisJeworIAkgIC8qIE5leHQgaXMgc3BvbnNvciAoQ0VOIHN5bnRheCkuICAqLworCSAgY3BbMF0gPSAnXDAnOworCSAgKnNwb25zb3IgPSArK2NwOworCisJICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycpCisJICAgICsrY3A7CisKKwkgIG1hc2sgfD0gQ0VOX1NQT05TT1I7CisJfQorCisgICAgICBpZiAoY3BbMF0gPT0gJ18nKQorCXsKKyAJICAvKiBOZXh0IGlzIHJldmlzaW9uIChDRU4gc3ludGF4KS4gICovCisJICBjcFswXSA9ICdcMCc7CisJICAqcmV2aXNpb24gPSArK2NwOworCisJICBtYXNrIHw9IENFTl9SRVZJU0lPTjsKKwl9CisgICAgfQorCisgIC8qIEZvciBDRU4gc3ludGF4IHZhbHVlcyBpdCBtaWdodCBiZSBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUKKyAgICAgc2VwYXJhdG9yIGNoYXJhY3RlciBpbiB0aGUgZmlsZSBuYW1lLCBub3QgZm9yIFhQRyBzeW50YXguICAqLworICBpZiAoc3ludGF4ID09IHhwZykKKyAgICB7CisgICAgICBpZiAoKnRlcnJpdG9yeSAhPSBOVUxMICYmICgqdGVycml0b3J5KVswXSA9PSAnXDAnKQorCW1hc2sgJj0gflRFUlJJVE9SWTsKKworICAgICAgaWYgKCpjb2Rlc2V0ICE9IE5VTEwgJiYgKCpjb2Rlc2V0KVswXSA9PSAnXDAnKQorCW1hc2sgJj0gflhQR19DT0RFU0VUOworCisgICAgICBpZiAoKm1vZGlmaWVyICE9IE5VTEwgJiYgKCptb2RpZmllcilbMF0gPT0gJ1wwJykKKwltYXNrICY9IH5YUEdfTU9ESUZJRVI7CisgICAgfQorCisgIHJldHVybiBtYXNrOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2ZpbmRkb21haW4uYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9maW5kZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5MmE4YwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9maW5kZG9tYWluLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qIEhhbmRsZSBsaXN0IG9mIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUub3JnPiwgMTk5NS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKy8qIExpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucy4gICovCitzdGF0aWMgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2xvYWRlZF9kb21haW5zOworCisKKy8qIFJldHVybiBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmliZWQgYnkKKyAgIHRoZSBET01BSU5OQU1FIGFuZCBDQVRFR09SWSBwYXJhbWV0ZXJzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudGx5CisgICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCitzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfZmluZF9kb21haW4gKGNvbnN0IGNoYXIgKmRpcm5hbWUsIGNoYXIgKmxvY2FsZSwKKwkJIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQoreworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7CisgIGNvbnN0IGNoYXIgKmxhbmd1YWdlOworICBjb25zdCBjaGFyICptb2RpZmllcjsKKyAgY29uc3QgY2hhciAqdGVycml0b3J5OworICBjb25zdCBjaGFyICpjb2Rlc2V0OworICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQ7CisgIGNvbnN0IGNoYXIgKnNwZWNpYWw7CisgIGNvbnN0IGNoYXIgKnNwb25zb3I7CisgIGNvbnN0IGNoYXIgKnJldmlzaW9uOworICBjb25zdCBjaGFyICphbGlhc192YWx1ZTsKKyAgaW50IG1hc2s7CisKKyAgLyogTE9DQUxFIGNhbiBjb25zaXN0IG9mIHVwIHRvIGZvdXIgcmVjb2duaXplZCBwYXJ0cyBmb3IgdGhlIFhQRyBzeW50YXg6CisKKwkJbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0KKworICAgICBhbmQgc2l4IHBhcnRzIGZvciB0aGUgQ0VOIHN5bnRheDoKKworCWxhbmd1YWdlW190ZXJyaXRvcnldWythdWRpZW5jZV1bK3NwZWNpYWxdWyxbc3BvbnNvcl1bX3JldmlzaW9uXV0KKworICAgICBCZXNpZGUgdGhlIGZpcnN0IHBhcnQgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmCisgICAgIHRoZSBmdWxsIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLCB0aGUgbGVzcyBzcGVjaWZpYyBvbmUgYXJlCisgICAgIGxvb2tlZCBmb3IuICBUaGUgdmFyaW91cyBwYXJ0cyB3aWxsIGJlIHN0cmlwcGVkIG9mZiBhY2NvcmRpbmcgdG8KKyAgICAgdGhlIGZvbGxvd2luZyBvcmRlcjoKKwkJKDEpIHJldmlzaW9uCisJCSgyKSBzcG9uc29yCisJCSgzKSBzcGVjaWFsCisJCSg0KSBjb2Rlc2V0CisJCSg1KSBub3JtYWxpemVkIGNvZGVzZXQKKwkJKDYpIHRlcnJpdG9yeQorCQkoNykgYXVkaWVuY2UvbW9kaWZpZXIKKyAgICovCisKKyAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHRlc3RlZCBmb3IgdGhpcyBsb2NhbGUgZW50cnkgdGhlcmUgaGFzIHRvCisgICAgIGJlIG9uZSBkYXRhIHNldCBpbiB0aGUgbGlzdCBvZiBsb2FkZWQgZG9tYWlucy4gICovCisgIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKKwkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgMCwgbG9jYWxlLCBOVUxMLCBOVUxMLAorCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGRvbWFpbm5hbWUsIDApOworICBpZiAocmV0dmFsICE9IE5VTEwpCisgICAgeworICAgICAgLyogV2Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhpcyBsb2NhbGUuICAqLworICAgICAgaW50IGNudDsKKworICAgICAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQorCV9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLCBkb21haW5iaW5kaW5nKTsKKworICAgICAgaWYgKHJldHZhbC0+ZGF0YSAhPSBOVUxMKQorCXJldHVybiByZXR2YWw7CisKKyAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKwl7CisJICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQorCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0sIGRvbWFpbmJpbmRpbmcpOworCisJICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQorCSAgICBicmVhazsKKwl9CisgICAgICByZXR1cm4gY250ID49IDAgPyByZXR2YWwgOiBOVUxMOworICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIH0KKworICAvKiBTZWUgd2hldGhlciB0aGUgbG9jYWxlIHZhbHVlIGlzIGFuIGFsaWFzLiAgSWYgeWVzIGl0cyB2YWx1ZQorICAgICAqb3ZlcndyaXRlcyogdGhlIGFsaWFzIG5hbWUuICBObyB0ZXN0IGZvciB0aGUgb3JpZ2luYWwgdmFsdWUgaXMKKyAgICAgZG9uZS4gICovCisgIGFsaWFzX3ZhbHVlID0gX25sX2V4cGFuZF9hbGlhcyAobG9jYWxlKTsKKyAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCisgICAgeworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorICAgICAgbG9jYWxlID0gc3RyZHVwIChhbGlhc192YWx1ZSk7CisgICAgICBpZiAobG9jYWxlID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisjZWxzZQorICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYWxpYXNfdmFsdWUpICsgMTsKKyAgICAgIGxvY2FsZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKyAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgbWVtY3B5IChsb2NhbGUsIGFsaWFzX3ZhbHVlLCBsZW4pOworI2VuZGlmCisgICAgfQorCisgIC8qIE5vdyB3ZSBkZXRlcm1pbmUgdGhlIHNpbmdsZSBwYXJ0cyBvZiB0aGUgbG9jYWxlIG5hbWUuICBGaXJzdAorICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycgYW5kIGBAJyBpZgorICAgICB3ZSB1c2UgWFBHNCBzdHlsZSwgYW5kIGBfJywgYCsnLCBhbmQgYCwnIGlmIHdlIHVzZSBDRU4gc3ludGF4LiAgKi8KKyAgbWFzayA9IF9ubF9leHBsb2RlX25hbWUgKGxvY2FsZSwgJmxhbmd1YWdlLCAmbW9kaWZpZXIsICZ0ZXJyaXRvcnksCisJCQkgICAmY29kZXNldCwgJm5vcm1hbGl6ZWRfY29kZXNldCwgJnNwZWNpYWwsCisJCQkgICAmc3BvbnNvciwgJnJldmlzaW9uKTsKKworICAvKiBDcmVhdGUgYWxsIHBvc3NpYmxlIGxvY2FsZSBlbnRyaWVzIHdoaWNoIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4KKyAgICAgZ2VuZXJhbGl6YXRpb24uICAqLworICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCisJCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIG1hc2ssIGxhbmd1YWdlLCB0ZXJyaXRvcnksCisJCQkgICAgICAgY29kZXNldCwgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKKwkJCSAgICAgICBzcG9uc29yLCByZXZpc2lvbiwgZG9tYWlubmFtZSwgMSk7CisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICAvKiBUaGlzIG1lYW5zIHdlIGFyZSBvdXQgb2YgY29yZS4gICovCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQorICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLCBkb21haW5iaW5kaW5nKTsKKyAgaWYgKHJldHZhbC0+ZGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGludCBjbnQ7CisgICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCisJeworCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKKwkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLCBkb21haW5iaW5kaW5nKTsKKwkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogVGhlIHJvb20gZm9yIGFuIGFsaWFzIHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICBGcmVlIGl0IG5vdy4gICovCisgIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQorICAgIGZyZWUgKGxvY2FsZSk7CisKKyAgLyogVGhlIHNwYWNlIGZvciBub3JtYWxpemVkX2NvZGVzZXQgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdC4gICovCisgIGlmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkKKyAgICBmcmVlICgodm9pZCAqKSBub3JtYWxpemVkX2NvZGVzZXQpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworI2lmZGVmIF9MSUJDCitsaWJjX2ZyZWVyZXNfZm4gKGZyZWVfbWVtKQoreworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpydW5wID0gX25sX2xvYWRlZF9kb21haW5zOworCisgIHdoaWxlIChydW5wICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqaGVyZSA9IHJ1bnA7CisgICAgICBpZiAocnVucC0+ZGF0YSAhPSBOVUxMKQorCV9ubF91bmxvYWRfZG9tYWluICgoc3RydWN0IGxvYWRlZF9kb21haW4gKikgcnVucC0+ZGF0YSk7CisgICAgICBydW5wID0gcnVucC0+bmV4dDsKKyAgICAgIGZyZWUgKChjaGFyICopIGhlcmUtPmZpbGVuYW1lKTsKKyAgICAgIGZyZWUgKGhlcmUpOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2dldHRleHQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9nZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjNDJmYQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9nZXR0ZXh0LmMKQEAgLTAsMCArMSw2MyBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBfX25lZWRfTlVMTAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBHRVRURVhUIF9fZ2V0dGV4dAorIyBkZWZpbmUgRENHRVRURVhUIElOVFVTRShfX2RjZ2V0dGV4dCkKKyNlbHNlCisjIGRlZmluZSBHRVRURVhUIGxpYmludGxfZ2V0dGV4dAorIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCitjaGFyICoKK0dFVFRFWFQgKGNvbnN0IGNoYXIgKm1zZ2lkKQoreworICByZXR1cm4gRENHRVRURVhUIChOVUxMLCBtc2dpZCwgTENfTUVTU0FHRVMpOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19nZXR0ZXh0LCBnZXR0ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2dldHRleHRQLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZ2V0dGV4dFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY2YzNkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2dldHRleHRQLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBsaWJpbnRsIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0dFVFRFWFRQX0gKKyNkZWZpbmUgX0dFVFRFWFRQX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgkJLyogR2V0IHNpemVfdC4gICovCisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlICIuLi9pY29udi9nY29udl9pbnQuaCIKKyNlbHNlCisjIGlmIEhBVkVfSUNPTlYKKyMgIGluY2x1ZGUgPGljb252Lmg+CisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImxvYWRpbmZvLmgiCisKKyNpbmNsdWRlICJnbW8uaCIJCS8qIEdldCBubHNfdWludDMyLiAgKi8KKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCisjIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgorIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgorI2VuZGlmCisKKy8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKKyAgIGFsbW9zdCBhbHdheXMgdHJ1ZSBvciBhbG1vc3QgYWx3YXlzIGZhbHNlLiAgKi8KKyNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAorIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQorI2VuZGlmCisKKyNpZm5kZWYgVworIyBkZWZpbmUgVyhmbGFnLCBkYXRhKSAoKGZsYWcpID8gU1dBUCAoZGF0YSkgOiAoZGF0YSkpCisjZW5kaWYKKworCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyMgZGVmaW5lIFNXQVAoaSkgYnN3YXBfMzIgKGkpCisjZWxzZQorc3RhdGljIGlubGluZSBubHNfdWludDMyCitTV0FQIChpKQorICAgICBubHNfdWludDMyIGk7Cit7CisgIHJldHVybiAoaSA8PCAyNCkgfCAoKGkgJiAweGZmMDApIDw8IDgpIHwgKChpID4+IDgpICYgMHhmZjAwKSB8IChpID4+IDI0KTsKK30KKyNlbmRpZgorCisKKy8qIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCitzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjCit7CisgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisgIHNpemVfdCBsZW5ndGg7CisgIC8qIFBvaW50ZXIgdG8gYWRkcmVzc2VkIHN0cmluZy4gICovCisgIGNvbnN0IGNoYXIgKnBvaW50ZXI7Cit9OworCisvKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4gICovCitzdHJ1Y3QgbG9hZGVkX2RvbWFpbgoreworICAvKiBQb2ludGVyIHRvIG1lbW9yeSBjb250YWluaW5nIHRoZSAubW8gZmlsZS4gICovCisgIGNvbnN0IGNoYXIgKmRhdGE7CisgIC8qIDEgaWYgdGhlIG1lbW9yeSBpcyBtbWFwKCllZCwgMCBpZiB0aGUgbWVtb3J5IGlzIG1hbGxvYygpZWQuICAqLworICBpbnQgdXNlX21tYXA7CisgIC8qIFNpemUgb2YgbW1hcCgpZWQgbWVtb3J5LiAgKi8KKyAgc2l6ZV90IG1tYXBfc2l6ZTsKKyAgLyogMSBpZiB0aGUgLm1vIGZpbGUgdXNlcyBhIGRpZmZlcmVudCBlbmRpYW5uZXNzIHRoYW4gdGhpcyBtYWNoaW5lLiAgKi8KKyAgaW50IG11c3Rfc3dhcDsKKyAgLyogUG9pbnRlciB0byBhZGRpdGlvbmFsIG1hbGxvYygpZWQgbWVtb3J5LiAgKi8KKyAgdm9pZCAqbWFsbG9jZWQ7CisKKyAgLyogTnVtYmVyIG9mIHN0YXRpYyBzdHJpbmdzIHBhaXJzLiAgKi8KKyAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKyAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiBvcmlnaW5hbCBzdHJpbmdzIGluIHRoZSBmaWxlLiAgKi8KKyAgY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICpvcmlnX3RhYjsKKyAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLworICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKnRyYW5zX3RhYjsKKworICAvKiBOdW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIHBhaXJzLiAgKi8KKyAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zdHJpbmdzOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIG9yaWdpbmFsIHN5c2RlcCBzdHJpbmdzLiAgKi8KKyAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqb3JpZ19zeXNkZXBfdGFiOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3lzZGVwIHN0cmluZ3MuICAqLworICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICp0cmFuc19zeXNkZXBfdGFiOworCisgIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCisgIG5sc191aW50MzIgaGFzaF9zaXplOworICAvKiBQb2ludGVyIHRvIGhhc2ggdGFibGUuICAqLworICBjb25zdCBubHNfdWludDMyICpoYXNoX3RhYjsKKyAgLyogMSBpZiB0aGUgaGFzaCB0YWJsZSB1c2VzIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MgdGhhbiB0aGlzIG1hY2hpbmUuICAqLworICBpbnQgbXVzdF9zd2FwX2hhc2hfdGFiOworCisgIGludCBjb2Rlc2V0X2NudHI7CisjaWZkZWYgX0xJQkMKKyAgX19nY29udl90IGNvbnY7CisjZWxzZQorIyBpZiBIQVZFX0lDT05WCisgIGljb252X3QgY29udjsKKyMgZW5kaWYKKyNlbmRpZgorICBjaGFyICoqY29udl90YWI7CisKKyAgc3RydWN0IGV4cHJlc3Npb24gKnBsdXJhbDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbnBsdXJhbHM7Cit9OworCisvKiBXZSB3YW50IHRvIGFsbG9jYXRlIGEgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdC4gIEJ1dCBJU08gQworICAgZG9lc24ndCBhbGxvdyB6ZXJvIHNpemVkIGFycmF5cy4gICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIFpFUk8gMAorI2Vsc2UKKyMgZGVmaW5lIFpFUk8gMQorI2VuZGlmCisKKy8qIEEgc2V0IG9mIHNldHRpbmdzIGJvdW5kIHRvIGEgbWVzc2FnZSBkb21haW4uICBVc2VkIHRvIHN0b3JlIHNldHRpbmdzCisgICBmcm9tIGJpbmR0ZXh0ZG9tYWluKCkgYW5kIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkuICAqLworc3RydWN0IGJpbmRpbmcKK3sKKyAgc3RydWN0IGJpbmRpbmcgKm5leHQ7CisgIGNoYXIgKmRpcm5hbWU7CisgIGludCBjb2Rlc2V0X2NudHI7CS8qIEluY3JlbWVudGVkIGVhY2ggdGltZSBjb2Rlc2V0IGNoYW5nZXMuICAqLworICBjaGFyICpjb2Rlc2V0OworICBjaGFyIGRvbWFpbm5hbWVbWkVST107Cit9OworCisvKiBBIGNvdW50ZXIgd2hpY2ggaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHNvbWUgcHJldmlvdXMgdHJhbnNsYXRpb25zCisgICBiZWNvbWUgaW52YWxpZC4KKyAgIFRoaXMgdmFyaWFibGUgaXMgcGFydCBvZiB0aGUgZXh0ZXJuYWwgQUJJIG9mIHRoZSBHTlUgbGliaW50bC4gICovCitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisKKyNpZm5kZWYgX0xJQkMKK2NvbnN0IGNoYXIgKl9ubF9sb2NhbGVfbmFtZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpOworI2VuZGlmCisKK3N0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9maW5kX2RvbWFpbiAoY29uc3QgY2hhciAqX19kaXJuYW1lLCBjaGFyICpfX2xvY2FsZSwKKwkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkJIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOwordm9pZCBfbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluLAorCQkgICAgICBzdHJ1Y3QgYmluZGluZyAqX19kb21haW5iaW5kaW5nKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKK3ZvaWQgX25sX3VubG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfZG9tYWluICpfX2RvbWFpbikKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Citjb25zdCBjaGFyICpfbmxfaW5pdF9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW5fZmlsZSwKKwkJCQkgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpfX2RvbWFpbiwKKwkJCQkgIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOwordm9pZCBfbmxfZnJlZV9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworY2hhciAqX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKwkJICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICptc2dpZCwKKwkJICAgIHNpemVfdCAqbGVuZ3RocCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKyNpZmRlZiBfTElCQworZXh0ZXJuIGNoYXIgKl9fZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCk7CitleHRlcm4gY2hhciAqX19kZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKTsKK2V4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorCQkJICBpbnQgX19jYXRlZ29yeSk7CitleHRlcm4gY2hhciAqX19uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7CitleHRlcm4gY2hhciAqX19kbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICB1bnNpZ25lZCBsb25nIGludCBuKTsKK2V4dGVybiBjaGFyICpfX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpOworZXh0ZXJuIGNoYXIgKl9fZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICAgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCisJCQkgICBpbnQgX19jYXRlZ29yeSk7CitleHRlcm4gY2hhciAqX190ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpOworZXh0ZXJuIGNoYXIgKl9fYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpOworZXh0ZXJuIGNoYXIgKl9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkJY29uc3QgY2hhciAqX19jb2Rlc2V0KTsKKyNlbHNlCisvKiBEZWNsYXJlIHRoZSBleHBvcnRlZCBsaWJpbnRsXyogZnVuY3Rpb25zLCBpbiBhIHdheSB0aGF0IGFsbG93cyB1cyB0bworICAgY2FsbCB0aGVtIHVuZGVyIHRoZWlyIHJlYWwgbmFtZS4gICovCisjIHVuZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorIyB1bmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCitleHRlcm4gY2hhciAqbGliaW50bF9kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCQkgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCisJCQkJIGludCBfX2NhdGVnb3J5KTsKKyNlbmRpZgorCisvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKworI2VuZGlmIC8qIGdldHRleHRQLmggICovCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZ21vLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvZ21vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjOWNjMQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9nbW8uaApAQCAtMCwwICsxLDE0OSBAQAorLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IGdlbmVyYWwgZmlsZSBsYXlvdXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0dFVFRFWFRfSAorI2RlZmluZSBfR0VUVEVYVF9IIDEKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KKyNkZWZpbmUgX01BR0lDIDB4OTUwNDEyZGUKKyNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQorCisvKiBSZXZpc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSB1c2VkIC5tbyAoYmluYXJ5KSBmaWxlIGZvcm1hdC4gICovCisjZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCisjZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUl9XSVRIX1NZU0RFUF9JIDEKKworLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCisgICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCisgICBhbHRlcm5hdGl2ZSBhcHByb2FjaCBpcyB0byB1c2UgYXV0b2NvbmYncyBBQ19DSEVDS19TSVpFT0YgbWFjcm8sIGJ1dAorICAgYXMgb2YgdmVyc2lvbiBhdXRvY29uZi0yLjEzLCB0aGUgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvIGRvZXNuJ3Qgd29yaworICAgd2hlbiBjcm9zcy1jb21waWxpbmcuICAqLworCisjaWYgX19TVERDX18KKyMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgNDI5NDk2NzI5NVUKKyNlbHNlCisjIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKKyNlbmRpZgorCisvKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgorICAgVGhpcyBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBzeXN0ZW1zIEdOVSBjYXJlcyBhYm91dCBiZWNhdXNlCisgICB0aGF0IGRvZXNuJ3QgaW5jbHVkZSAxNi1iaXQgc3lzdGVtcywgYW5kIG9ubHkgbW9kZXJuIHN5c3RlbXMKKyAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCisKKyNpZm5kZWYgVUlOVF9NQVgKKyMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKKyNlbmRpZgorCisjaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwordHlwZWRlZiB1bnNpZ25lZCBubHNfdWludDMyOworI2Vsc2UKKyMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgbmxzX3VpbnQzMjsKKyMgZWxzZQorIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBubHNfdWludDMyOworIyAgZWxzZQorICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKKyAgICAgbm90IHBvcnRhYmxlIGVub3VnaC4gICovCisgICJDYW5ub3QgZGV0ZXJtaW5lIHVuc2lnbmVkIDMyLWJpdCBkYXRhIHR5cGUuIgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIEhlYWRlciBmb3IgYmluYXJ5IC5tbyBmaWxlIGZvcm1hdC4gICovCitzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKK3sKKyAgLyogVGhlIG1hZ2ljIG51bWJlci4gICovCisgIG5sc191aW50MzIgbWFnaWM7CisgIC8qIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0LiAgKi8KKyAgbmxzX3VpbnQzMiByZXZpc2lvbjsKKworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWFqb3IgcmV2aXNpb24gMCBvciAxLiAgKi8KKworICAvKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgcGFpcnMuICAqLworICBubHNfdWludDMyIG5zdHJpbmdzOworICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN0cmluZ3MuICAqLworICBubHNfdWludDMyIG9yaWdfdGFiX29mZnNldDsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MuICAqLworICBubHNfdWludDMyIHRyYW5zX3RhYl9vZmZzZXQ7CisgIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCisgIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKKyAgLyogT2Zmc2V0IG9mIGZpcnN0IGhhc2ggdGFibGUgZW50cnkuICAqLworICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKKworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWlub3IgcmV2aXNpb24gPj0gMS4gICovCisKKyAgLyogVGhlIG51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KKyAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zZWdtZW50czsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIGRlc2NyaWJpbmcgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCisgIG5sc191aW50MzIgc3lzZGVwX3NlZ21lbnRzX29mZnNldDsKKyAgLyogVGhlIG51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLworICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7CisgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLworICBubHNfdWludDMyIG9yaWdfc3lzZGVwX3RhYl9vZmZzZXQ7CisgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgdHJhbnNfc3lzZGVwX3RhYl9vZmZzZXQ7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzdGF0aWMgc3RyaW5nIGNvbnRhaW5lZCBpbiB0aGUgYmluYXJ5IC5tbyBmaWxlLiAgKi8KK3N0cnVjdCBzdHJpbmdfZGVzYworeworICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgbm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KKyAgbmxzX3VpbnQzMiBsZW5ndGg7CisgIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCisgIG5sc191aW50MzIgb2Zmc2V0OworfTsKKworLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1pbm9yIHJldmlzaW9uID49IDEuICAqLworCisvKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LiAgKi8KK3N0cnVjdCBzeXNkZXBfc2VnbWVudAoreworICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLworICBubHNfdWludDMyIGxlbmd0aDsKKyAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KKyAgbmxzX3VpbnQzMiBvZmZzZXQ7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCitzdHJ1Y3Qgc3lzZGVwX3N0cmluZworeworICAvKiBPZmZzZXQgb2Ygc3RhdGljIHN0cmluZyBzZWdtZW50cyBpbiBmaWxlLiAgKi8KKyAgbmxzX3VpbnQzMiBvZmZzZXQ7CisgIC8qIEFsdGVybmF0aW5nIHNlcXVlbmNlIG9mIHN0YXRpYyBhbmQgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4KKyAgICAgVGhlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXRpYyBzZWdtZW50LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisgIHN0cnVjdCBzZWdtZW50X3BhaXIKKyAgeworICAgIC8qIFNpemUgb2Ygc3RhdGljIHNlZ21lbnQuICAqLworICAgIG5sc191aW50MzIgc2Vnc2l6ZTsKKyAgICAvKiBSZWZlcmVuY2UgdG8gc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudCwgb3IgfjAgYXQgdGhlIGVuZC4gICovCisgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisgIH0gc2VnbWVudHNbMV07Cit9OworCisvKiBNYXJrZXIgZm9yIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnRzW10gYXJyYXkuICBUaGlzIGhhcyB0aGUgdmFsdWUgMHhGRkZGRkZGRiwKKyAgIHJlZ2FyZGxlc3Mgd2hldGhlciAnaW50JyBpcyAxNiBiaXQsIDMyIGJpdCwgb3IgNjQgYml0LiAgKi8KKyNkZWZpbmUgU0VHTUVOVFNfRU5EICgobmxzX3VpbnQzMikgfjApCisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisjZW5kaWYJLyogZ2V0dGV4dC5oICAqLwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2hhc2gtc3RyaW5nLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvaGFzaC1zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTNlM2IxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2hhc2gtc3RyaW5nLmgKQEAgLTAsMCArMSw0OCBAQAorLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogV2UgYXNzdW1lIHRvIGhhdmUgYHVuc2lnbmVkIGxvbmcgaW50JyB2YWx1ZSB3aXRoIGF0IGxlYXN0IDMyIGJpdHMuICAqLworI2RlZmluZSBIQVNIV09SREJJVFMgMzIKKworCisvKiBEZWZpbmVzIHRoZSBzbyBjYWxsZWQgYGhhc2hwancnIGZ1bmN0aW9uIGJ5IFAuSi4gV2VpbmJlcmdlcgorICAgW3NlZSBBaG8vU2V0aGkvVWxsbWFuLCBDT01QSUxFUlM6IFByaW5jaXBsZXMsIFRlY2huaXF1ZXMgYW5kIFRvb2xzLAorICAgMTk4NiwgMTk4NyBCZWxsIFRlbGVwaG9uZSBMYWJvcmF0b3JpZXMsIEluYy5dICAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGludAoraGFzaF9zdHJpbmcgKGNvbnN0IGNoYXIgKnN0cl9wYXJhbSkKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKKyAgY29uc3QgY2hhciAqc3RyID0gc3RyX3BhcmFtOworCisgIC8qIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBzdHJpbmcuICAqLworICBodmFsID0gMDsKKyAgd2hpbGUgKCpzdHIgIT0gJ1wwJykKKyAgICB7CisgICAgICBodmFsIDw8PSA0OworICAgICAgaHZhbCArPSAodW5zaWduZWQgY2hhcikgKnN0cisrOworICAgICAgZyA9IGh2YWwgJiAoKHVuc2lnbmVkIGxvbmcgaW50KSAweGYgPDwgKEhBU0hXT1JEQklUUyAtIDQpKTsKKyAgICAgIGlmIChnICE9IDApCisJeworCSAgaHZhbCBePSBnID4+IChIQVNIV09SREJJVFMgLSA4KTsKKwkgIGh2YWwgXj0gZzsKKwl9CisgICAgfQorICByZXR1cm4gaHZhbDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9pbnRsLWNvbXBhdC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2ludGwtY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmOWQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9pbnRsLWNvbXBhdC5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBpbnRsLWNvbXBhdC5jIC0gU3R1YiBmdW5jdGlvbnMgdG8gY2FsbCBnZXR0ZXh0IGZ1bmN0aW9ucyBmcm9tIEdOVSBnZXR0ZXh0CisgICBMaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAyMDAwLTIwMDMgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogVGhpcyBmaWxlIHJlZGlyZWN0cyB0aGUgZ2V0dGV4dCBmdW5jdGlvbnMgKHdpdGhvdXQgcHJlZml4KSB0byB0aG9zZQorICAgZGVmaW5lZCBpbiB0aGUgaW5jbHVkZWQgR05VIGxpYmludGwgbGlicmFyeSAod2l0aCAibGliaW50bF8iIHByZWZpeCkuCisgICBJdCBpcyBjb21waWxlZCBpbnRvIGxpYmludGwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgQU1fR05VX0dFVFRFWFQgdGVzdAorICAgb2YgZ2V0dGV4dCA8PSAwLjExLjIgd29yayB3aXRoIHRoZSBsaWJpbnRsIGxpYnJhcnkgPj0gMC4xMS4zIHdoaWNoCisgICBoYXMgdGhlIHJlZGlyZWN0aW9ucyBwcmltYXJpbHkgaW4gdGhlIDxsaWJpbnRsLmg+IGluY2x1ZGUgZmlsZS4KKyAgIEl0IGlzIGFsc28gY29tcGlsZWQgaW50byBsaWJnbnVpbnRsIHNvIHRoYXQgbGliZ251aW50bC5zbyBjYW4gYmUgdXNlZAorICAgYXMgTERfUFJFTE9BRGFibGUgbGlicmFyeSBvbiBnbGliYyBzeXN0ZW1zLCB0byBwcm92aWRlIHRoZSBleHRyYQorICAgZmVhdHVyZXMgdGhhdCB0aGUgZnVuY3Rpb25zIGluIHRoZSBsaWJjIGRvbid0IGhhdmUgKG5hbWVseSwgbG9nZ2luZykuICAqLworCisKKyN1bmRlZiBnZXR0ZXh0CisjdW5kZWYgZGdldHRleHQKKyN1bmRlZiBkY2dldHRleHQKKyN1bmRlZiBuZ2V0dGV4dAorI3VuZGVmIGRuZ2V0dGV4dAorI3VuZGVmIGRjbmdldHRleHQKKyN1bmRlZiB0ZXh0ZG9tYWluCisjdW5kZWYgYmluZHRleHRkb21haW4KKyN1bmRlZiBiaW5kX3RleHRkb21haW5fY29kZXNldAorCisKKy8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKKyAgIHRoZSBmdW5jdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlCisgICBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW4gYW55IGNhc2UuICAqLworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCisjIGRlZmluZSBETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZWxzZQorIyBkZWZpbmUgRExMX0VYUE9SVEVECisjZW5kaWYKKworCitETExfRVhQT1JURUQKK2NoYXIgKgorZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQpCit7CisgIHJldHVybiBsaWJpbnRsX2dldHRleHQgKG1zZ2lkKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorZGdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkKQoreworICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkY2dldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkLCBpbnQgY2F0ZWdvcnkpCit7CisgIHJldHVybiBsaWJpbnRsX2RjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorbmdldHRleHQgKGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICByZXR1cm4gbGliaW50bF9uZ2V0dGV4dCAobXNnaWQxLCBtc2dpZDIsIG4pOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHJldHVybiBsaWJpbnRsX2RuZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4pOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkY25nZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKwkgICAgaW50IGNhdGVnb3J5KQoreworICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgY2F0ZWdvcnkpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCit0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpkb21haW5uYW1lKQoreworICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChkb21haW5uYW1lKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmRpcm5hbWUpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmNvZGVzZXQpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChkb21haW5uYW1lLCBjb2Rlc2V0KTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sMTBuZmxpc3QuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sMTBuZmxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzkzZWNiCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2wxMG5mbGlzdC5jCkBAIC0wLDAgKzEsNDIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc3RwY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFCTEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9BUkdaX0gKKyMgaW5jbHVkZSA8YXJnei5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxvYWRpbmZvLmgiCisKKy8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLworI2lmbmRlZiBOVUxMCisjIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KKyMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQorIyBlbHNlCisjICBkZWZpbmUgTlVMTCAwCisjIGVuZGlmCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAorICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworIyBpZm5kZWYgc3RwY3B5CisjICBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIEhBVkVfU1RQQ1BZCisjZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIG15X3N0cGNweShkZXN0LCBzcmMpCitzdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIFBhdGhuYW1lIHN1cHBvcnQuCisgICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgIElTX0FCU09MVVRFX1BBVEgoUCkgIHRlc3RzIHdoZXRoZXIgUCBpcyBhbiBhYnNvbHV0ZSBwYXRoLiAgSWYgaXQgaXMgbm90LAorICAgICAgICAgICAgICAgICAgICAgICAgaXQgbWF5IGJlIGNvbmNhdGVuYXRlZCB0byBhIGRpcmVjdG9yeSBwYXRobmFtZS4KKyAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorICAgICAmJiAoUClbMV0gPT0gJzonKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKKyNlbHNlCisgIC8qIFVuaXggKi8KKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCisjIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIElTU0xBU0ggKChQKVswXSkKKyNlbmRpZgorCisvKiBEZWZpbmUgZnVuY3Rpb24gd2hpY2ggYXJlIHVzdWFsbHkgbm90IGF2YWlsYWJsZS4gICovCisKKyNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9DT1VOVAorLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCitzdGF0aWMgc2l6ZV90Cithcmd6X2NvdW50X18gKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pCit7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7CisgICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKKyAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgcmV0dXJuIGNvdW50OworfQorIyB1bmRlZiBfX2FyZ3pfY291bnQKKyMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQorI2Vsc2UKKyMgaWZkZWYgX0xJQkMKKyMgIGRlZmluZSBfX2FyZ3pfY291bnQoYXJneiwgbGVuKSBJTlRVU0UoX19hcmd6X2NvdW50KSAoYXJneiwgbGVuKQorIyBlbmRpZgorI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfQ09VTlQgKi8KKworI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQorLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncworICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLworc3RhdGljIHZvaWQKK2FyZ3pfc3RyaW5naWZ5X18gKGNoYXIgKmFyZ3osIHNpemVfdCBsZW4sIGludCBzZXApCit7CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7CisgICAgICBhcmd6ICs9IHBhcnRfbGVuOworICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKKyAgICAgIGlmIChsZW4gPiAwKQorCSphcmd6KysgPSBzZXA7CisgICAgfQorfQorIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5CisjIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBhcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKKyNlbHNlCisjIGlmZGVmIF9MSUJDCisjICBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgXAorICBJTlRVU0UoX19hcmd6X3N0cmluZ2lmeSkgKGFyZ3osIGxlbiwgc2VwKQorIyBlbmRpZgorI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCisKKyNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCitzdGF0aWMgY2hhciAqCithcmd6X25leHRfXyAoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLCBjb25zdCBjaGFyICplbnRyeSkKK3sKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKKyAgICAgICAgZW50cnkgPSBzdHJjaHIgKGVudHJ5LCAnXDAnKSArIDE7CisKKyAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7CisgICAgfQorICBlbHNlCisgICAgaWYgKGFyZ3pfbGVuID4gMCkKKyAgICAgIHJldHVybiBhcmd6OworICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworfQorIyB1bmRlZiBfX2FyZ3pfbmV4dAorIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCisjZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9ORVhUICovCisKKworLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3AgKGludCB4KQoreworICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCisgIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKKyAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOworICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7CisgIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7CisKKyAgcmV0dXJuIHg7Cit9CisKKworc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCitfbmxfbWFrZV9sMTBuZmxpc3QgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAorCQkgICAgY29uc3QgY2hhciAqZGlybGlzdCwgc2l6ZV90IGRpcmxpc3RfbGVuLAorCQkgICAgaW50IG1hc2ssIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCisJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LCBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCisJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKKwkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSkKK3sKKyAgY2hhciAqYWJzX2ZpbGVuYW1lOworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbGFzdHA7CisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKKyAgY2hhciAqY3A7CisgIHNpemVfdCBkaXJsaXN0X2NvdW50OworICBzaXplX3QgZW50cmllczsKKyAgaW50IGNudDsKKworICAvKiBJZiBMQU5HVUFHRSBjb250YWlucyBhbiBhYnNvbHV0ZSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbiwgd2UgaWdub3JlCisgICAgIERJUkxJU1QuICAqLworICBpZiAoSVNfQUJTT0xVVEVfUEFUSCAobGFuZ3VhZ2UpKQorICAgIGRpcmxpc3RfbGVuID0gMDsKKworICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuICAqLworICBhYnNfZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcmxpc3RfbGVuCisJCQkJICArIHN0cmxlbiAobGFuZ3VhZ2UpCisJCQkJICArICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMAorCQkJCSAgICAgPyBzdHJsZW4gKHRlcnJpdG9yeSkgKyAxIDogMCkKKwkJCQkgICsgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKKwkJCQkgICAgID8gc3RybGVuIChjb2Rlc2V0KSArIDEgOiAwKQorCQkJCSAgKyAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwCisJCQkJICAgICA/IHN0cmxlbiAobm9ybWFsaXplZF9jb2Rlc2V0KSArIDEgOiAwKQorCQkJCSAgKyAoKChtYXNrICYgWFBHX01PRElGSUVSKSAhPSAwCisJCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fQVVESUVOQ0UpICE9IDApCisJCQkJICAgICA/IHN0cmxlbiAobW9kaWZpZXIpICsgMSA6IDApCisJCQkJICArICgobWFzayAmIENFTl9TUEVDSUFMKSAhPSAwCisJCQkJICAgICA/IHN0cmxlbiAoc3BlY2lhbCkgKyAxIDogMCkKKwkJCQkgICsgKCgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCisJCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCisJCQkJICAgICA/ICgxICsgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKKwkJCQkJICAgICA/IHN0cmxlbiAoc3BvbnNvcikgOiAwKQorCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAorCQkJCQkgICA/IHN0cmxlbiAocmV2aXNpb24pICsgMSA6IDApKSA6IDApCisJCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOworCisgIGlmIChhYnNfZmlsZW5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBDb25zdHJ1Y3QgZmlsZSBuYW1lLiAgKi8KKyAgY3AgPSBhYnNfZmlsZW5hbWU7CisgIGlmIChkaXJsaXN0X2xlbiA+IDApCisgICAgeworICAgICAgbWVtY3B5IChjcCwgZGlybGlzdCwgZGlybGlzdF9sZW4pOworICAgICAgX19hcmd6X3N0cmluZ2lmeSAoY3AsIGRpcmxpc3RfbGVuLCBQQVRIX1NFUEFSQVRPUik7CisgICAgICBjcCArPSBkaXJsaXN0X2xlbjsKKyAgICAgIGNwWy0xXSA9ICcvJzsKKyAgICB9CisKKyAgY3AgPSBzdHBjcHkgKGNwLCBsYW5ndWFnZSk7CisKKyAgaWYgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwKQorICAgIHsKKyAgICAgICpjcCsrID0gJ18nOworICAgICAgY3AgPSBzdHBjcHkgKGNwLCB0ZXJyaXRvcnkpOworICAgIH0KKyAgaWYgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDApCisgICAgeworICAgICAgKmNwKysgPSAnLic7CisgICAgICBjcCA9IHN0cGNweSAoY3AsIGNvZGVzZXQpOworICAgIH0KKyAgaWYgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICcuJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgbm9ybWFsaXplZF9jb2Rlc2V0KTsKKyAgICB9CisgIGlmICgobWFzayAmIChYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY29tcG9uZW50IGNhbiBiZSBwYXJ0IG9mIGJvdGggc3ludGFjZXMgYnV0IGhhcyBkaWZmZXJlbnQKKwkgbGVhZGluZyBjaGFyYWN0ZXJzLiAgRm9yIENFTiB3ZSB1c2UgYCsnLCBlbHNlIGBAJy4gICovCisgICAgICAqY3ArKyA9IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwID8gJysnIDogJ0AnOworICAgICAgY3AgPSBzdHBjcHkgKGNwLCBtb2RpZmllcik7CisgICAgfQorICBpZiAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICcrJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgc3BlY2lhbCk7CisgICAgfQorICBpZiAoKG1hc2sgJiAoQ0VOX1NQT05TT1IgfCBDRU5fUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICpjcCsrID0gJywnOworICAgICAgaWYgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDApCisJY3AgPSBzdHBjcHkgKGNwLCBzcG9uc29yKTsKKyAgICAgIGlmICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKKwl7CisJICAqY3ArKyA9ICdfJzsKKwkgIGNwID0gc3RwY3B5IChjcCwgcmV2aXNpb24pOworCX0KKyAgICB9CisKKyAgKmNwKysgPSAnLyc7CisgIHN0cGNweSAoY3AsIGZpbGVuYW1lKTsKKworICAvKiBMb29rIGluIGxpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucyB3aGV0aGVyIGl0IGlzIGFscmVhZHkKKyAgICAgYXZhaWxhYmxlLiAgKi8KKyAgbGFzdHAgPSBsMTBuZmlsZV9saXN0OworICBmb3IgKHJldHZhbCA9ICpsMTBuZmlsZV9saXN0OyByZXR2YWwgIT0gTlVMTDsgcmV0dmFsID0gcmV0dmFsLT5uZXh0KQorICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCisgICAgICB7CisJaW50IGNvbXBhcmUgPSBzdHJjbXAgKHJldHZhbC0+ZmlsZW5hbWUsIGFic19maWxlbmFtZSk7CisJaWYgKGNvbXBhcmUgPT0gMCkKKwkgIC8qIFdlIGZvdW5kIGl0ISAgKi8KKwkgIGJyZWFrOworCWlmIChjb21wYXJlIDwgMCkKKwkgIHsKKwkgICAgLyogSXQncyBub3QgaW4gdGhlIGxpc3QuICAqLworCSAgICByZXR2YWwgPSBOVUxMOworCSAgICBicmVhazsKKwkgIH0KKworCWxhc3RwID0gJnJldHZhbC0+bmV4dDsKKyAgICAgIH0KKworICBpZiAocmV0dmFsICE9IE5VTEwgfHwgZG9fYWxsb2NhdGUgPT0gMCkKKyAgICB7CisgICAgICBmcmVlIChhYnNfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgZGlybGlzdF9jb3VudCA9IChkaXJsaXN0X2xlbiA+IDAgPyBfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSA6IDEpOworCisgIC8qIEFsbG9jYXRlIGEgbmV3IGxvYWRlZF9sMTBuZmlsZS4gICovCisgIHJldHZhbCA9CisgICAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikKKyAgICBtYWxsb2MgKHNpemVvZiAoKnJldHZhbCkKKwkgICAgKyAoKChkaXJsaXN0X2NvdW50IDw8IHBvcCAobWFzaykpICsgKGRpcmxpc3RfY291bnQgPiAxID8gMSA6IDApKQorCSAgICAgICAqIHNpemVvZiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKSkpOworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dmFsLT5maWxlbmFtZSA9IGFic19maWxlbmFtZTsKKworICAvKiBXZSBzZXQgcmV0dmFsLT5kYXRhIHRvIE5VTEwgaGVyZTsgaXQgaXMgZmlsbGVkIGluIGxhdGVyLgorICAgICBTZXR0aW5nIHJldHZhbC0+ZGVjaWRlZCB0byAxIGhlcmUgbWVhbnMgdGhhdCByZXR2YWwgZG9lcyBub3QKKyAgICAgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZSAoZGlybGlzdF9jb3VudCA+IDEpIG9yIGlzIG5vdCB3b3J0aAorICAgICBsb29raW5nIHVwIChpZiBhbiB1bm5vcm1hbGl6ZWQgY29kZXNldCB3YXMgc3BlY2lmaWVkKS4gICovCisgIHJldHZhbC0+ZGVjaWRlZCA9IChkaXJsaXN0X2NvdW50ID4gMQorCQkgICAgIHx8ICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCisJCQkgJiYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKSk7CisgIHJldHZhbC0+ZGF0YSA9IE5VTEw7CisKKyAgcmV0dmFsLT5uZXh0ID0gKmxhc3RwOworICAqbGFzdHAgPSByZXR2YWw7CisKKyAgZW50cmllcyA9IDA7CisgIC8qIFJlY3Vyc2UgdG8gZmlsbCB0aGUgaW5oZXJpdGFuY2UgbGlzdCBvZiBSRVRWQUwuCisgICAgIElmIHRoZSBESVJMSVNUIGlzIGEgcmVhbCBsaXN0IChpLmUuIERJUkxJU1RfQ09VTlQgPiAxKSwgdGhlIFJFVFZBTAorICAgICBlbnRyeSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcmVhbCBmaWxlOyByZXR2YWwtPmZpbGVuYW1lIGNvbnRhaW5zCisgICAgIGNvbG9ucy4gIEluIHRoaXMgY2FzZSB3ZSBsb29wIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgRElSTElTVCBhbmQKKyAgICAgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5IE1BU0suCisgICAgIElmIHRoZSBESVJMSVNUIGlzIGEgc2luZ2xlIGRpcmVjdG9yeSBvciBlbnRpcmVseSByZWR1bmRhbnQgKGkuZS4KKyAgICAgRElSTElTVF9DT1VOVCA9PSAxKSwgd2UgbG9vcCBhY3Jvc3MgYWxsIGJpdCBwYXR0ZXJucyBkb21pbmF0ZWQgYnkKKyAgICAgTUFTSywgZXhjbHVkaW5nIE1BU0sgaXRzZWxmLgorICAgICBJbiBlaXRoZXIgY2FzZSwgd2UgbG9vcCBkb3duIGZyb20gTUFTSyB0byAwLiAgVGhpcyBoYXMgdGhlIGVmZmVjdAorICAgICB0aGF0IHRoZSBleHRyYSBiaXRzIGluIHRoZSBsb2NhbGUgbmFtZSBhcmUgZHJvcHBlZCBpbiB0aGlzIG9yZGVyOgorICAgICBmaXJzdCB0aGUgbW9kaWZpZXIsIHRoZW4gdGhlIHRlcnJpdG9yeSwgdGhlbiB0aGUgY29kZXNldCwgdGhlbiB0aGUKKyAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LiAgKi8KKyAgZm9yIChjbnQgPSBkaXJsaXN0X2NvdW50ID4gMSA/IG1hc2sgOiBtYXNrIC0gMTsgY250ID49IDA7IC0tY250KQorICAgIGlmICgoY250ICYgfm1hc2spID09IDAKKwkmJiAoKGNudCAmIENFTl9TUEVDSUZJQykgPT0gMCB8fCAoY250ICYgWFBHX1NQRUNJRklDKSA9PSAwKQorCSYmICgoY250ICYgWFBHX0NPREVTRVQpID09IDAgfHwgKGNudCAmIFhQR19OT1JNX0NPREVTRVQpID09IDApKQorICAgICAgeworCWlmIChkaXJsaXN0X2NvdW50ID4gMSkKKwkgIHsKKwkgICAgLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCisJICAgIGNoYXIgKmRpciA9IE5VTEw7CisKKwkgICAgd2hpbGUgKChkaXIgPSBfX2FyZ3pfbmV4dCAoKGNoYXIgKikgZGlybGlzdCwgZGlybGlzdF9sZW4sIGRpcikpCisJCSAgICE9IE5VTEwpCisJICAgICAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQorCQk9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLAorCQkJCSAgICAgIGNudCwgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKKwkJCQkgICAgICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAorCQkJCSAgICAgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7CisJICB9CisJZWxzZQorCSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQorCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlybGlzdCwgZGlybGlzdF9sZW4sCisJCQkJICBjbnQsIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCisJCQkJICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAorCQkJCSAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCAxKTsKKyAgICAgIH0KKyAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllc10gPSBOVUxMOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIE5vcm1hbGl6ZSBjb2Rlc2V0IG5hbWUuICBUaGVyZSBpcyBubyBzdGFuZGFyZCBmb3IgdGhlIGNvZGVzZXQKKyAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCisgICBuYW1lcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBoYXMgdG8gYmUKKyAgIGZyZWVkIGJ5IHRoZSBjYWxsZXIuICAqLworY29uc3QgY2hhciAqCitfbmxfbm9ybWFsaXplX2NvZGVzZXQgKGNvbnN0IGNoYXIgKmNvZGVzZXQsIHNpemVfdCBuYW1lX2xlbikKK3sKKyAgaW50IGxlbiA9IDA7CisgIGludCBvbmx5X2RpZ2l0ID0gMTsKKyAgY2hhciAqcmV0dmFsOworICBjaGFyICp3cDsKKyAgc2l6ZV90IGNudDsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKKyAgICBpZiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCisgICAgICB7CisJKytsZW47CisKKwlpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCisJICBvbmx5X2RpZ2l0ID0gMDsKKyAgICAgIH0KKworICByZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKChvbmx5X2RpZ2l0ID8gMyA6IDApICsgbGVuICsgMSk7CisKKyAgaWYgKHJldHZhbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvbmx5X2RpZ2l0KQorCXdwID0gc3RwY3B5IChyZXR2YWwsICJpc28iKTsKKyAgICAgIGVsc2UKKwl3cCA9IHJldHZhbDsKKworICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCisJaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorCSAgKndwKysgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKTsKKwllbHNlIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKKwkgICp3cCsrID0gY29kZXNldFtjbnRdOworCisgICAgICAqd3AgPSAnXDAnOworICAgIH0KKworICByZXR1cm4gKGNvbnN0IGNoYXIgKikgcmV0dmFsOworfQorCisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisvKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQorICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKKyAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCisgICB0byBiZSBkZWZpbmVkLiAgKi8KKyNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqCitzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorICAgIC8qIERvIG5vdGhpbmcuICovIDsKKyAgcmV0dXJuIGRlc3QgLSAxOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbGliZ2V0dGV4dC5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2xpYmdldHRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTkyOTYwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2xpYmdldHRleHQuaApAQCAtMCwwICsxLDE4MiBAQAorLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEJlY2F1c2Ugb24gc29tZSBzeXN0ZW1zIChlLmcuIFNvbGFyaXMpIHdlIHNvbWV0aW1lcyBoYXZlIHRvIGluY2x1ZGUKKyAgIHRoZSBzeXN0ZW1zIGxpYmludGwuaCBhcyB3ZWxsIGFzIHRoaXMgZmlsZSB3ZSBoYXZlIG1vcmUgY29tcGxleAorICAgaW5jbHVkZSBwcm90ZWN0aW9uIGFib3ZlLiAgQnV0IHRoZSBzeXN0ZW1zIGhlYWRlciBtaWdodCBwZXJoYXBzIGFsc28KKyAgIGRlZmluZSBfTElCSU5UTF9IIGFuZCB0aGVyZWZvcmUgd2UgaGF2ZSB0byBwcm90ZWN0IHRoZSBkZWZpbml0aW9uIGhlcmUuICAqLworCisjaWYgIWRlZmluZWQgX0xJQklOVExfSCB8fCAhZGVmaW5lZCBfTElCR0VUVEVYVF9ICisjaWZuZGVmIF9MSUJJTlRMX0gKKyMgZGVmaW5lIF9MSUJJTlRMX0gJMQorI2VuZGlmCisjZGVmaW5lIF9MSUJHRVRURVhUX0gJMQorCisvKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKKyAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLworI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmIEhBVkVfTE9DQUxFX0gKKyMgaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworI2lmbmRlZiBQQVJBTVMKKyMgaWYgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCisjIGVsc2UKKyMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyMgaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX0dOVUNfXworIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjIGVsc2UKKyMgIGRlZmluZSBOVUxMICgwKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhSEFWRV9MQ19NRVNTQUdFUworLyogVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGdldHRleHQoKSBhbmQgZGdldHRleHQoKQorICAgZnVuY3Rpb24uICBCdXQgc29tZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGlzIGRlZmluZWQuICBEZWZpbmUgaXQKKyAgIHRvIGEgZGVmYXVsdCB2YWx1ZS4gICovCisjIGRlZmluZSBMQ19NRVNTQUdFUyAoLTEpCisjZW5kaWYKKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIGdldHRleHQtdXNpbmctY2F0Z2V0cyBpbnRlcmZhY2UuICBEZXJpdmVkIGZyb20KKyAgIEppbSBNZXllcmluZydzIGxpYmludGwuaC4gICovCitzdHJ1Y3QgX21zZ19lbnQKK3sKKyAgY29uc3QgY2hhciAqX21zZzsKKyAgaW50IF9tc2dfbnVtYmVyOworfTsKKworCisjaWYgSEFWRV9DQVRHRVRTCisvKiBUaGVzZSB0d28gdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIHRoZSBhdXRvbWF0aWNhbGx5IGJ5IHBvLXRvLXRibC5zZWQKKyAgIGdlbmVyYXRlZCBmaWxlIGBjYXQtaWQtdGJsLmMnLiAgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXTsKK2V4dGVybiBpbnQgX21zZ190YmxfbGVuZ3RoOworI2VuZGlmCisKKworLyogRm9yIGF1dG9tYXRpY2FsIGV4dHJhY3Rpb24gb2YgbWVzc2FnZXMgc29tZXRpbWVzIG5vIHJlYWwKKyAgIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4gIEluc3RlYWQgdGhlIHN0cmluZyBpdHNlbGYgaXMgdGhlIHJlc3VsdC4gICovCisjZGVmaW5lIGdldHRleHRfbm9vcChTdHIpIChTdHIpCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAorICAgdGV4dCkuICAqLworZXh0ZXJuIGNoYXIgKmdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOworZXh0ZXJuIGNoYXIgKmdldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7CisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KK2V4dGVybiBjaGFyICpkZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKK2V4dGVybiBjaGFyICpkZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgY29uc3QgY2hhciAqX19tc2dpZCkpOworCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKKyAgIGxvY2FsZS4gICovCitleHRlcm4gY2hhciAqZGNnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKKwkJCQlpbnQgX19jYXRlZ29yeSkpOworZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgIGNvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7CisKKworLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCisgICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCitleHRlcm4gY2hhciAqdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKK2V4dGVybiBjaGFyICp0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7CisKKy8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAorICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLworZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOworZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKKworI2lmIEVOQUJMRV9OTFMKKworLyogU29sYXJpcyAyLjMgaGFzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGJ1dCBkY2dldHRleHQgaXMgbWlzc2luZy4KKyAgIFNvIHdlIG9taXQgdGhpcyBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLiAgQlRXLCBTb2xhcmlzIDIuNAorICAgaGFzIGRjZ2V0dGV4dC4gICovCisjIGlmICFIQVZFX0NBVEdFVFMgJiYgKCFIQVZFX0dFVFRFWFQgfHwgSEFWRV9EQ0dFVFRFWFQpCisKKyMgIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKQkJCQkJCSAgICAgIFwKKyAgICAgZGdldHRleHQgKE5VTEwsIE1zZ2lkKQorCisjICBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpCQkJCQkgICAgICBcCisgICAgIGRjZ2V0dGV4dCAoRG9tYWlubmFtZSwgTXNnaWQsIExDX01FU1NBR0VTKQorCisjICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNworLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBsb2FkbXNnY2F0LmMuICBXZSBuZWVkIGEgc2lnbiwKKyAgIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbAorICAgdHJhbnNsYXRpb25zLiAgKi8KK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKworIyAgIGRlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KQkJCSAgICAgIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgIGNoYXIgKl9fcmVzdWx0OwkJCQkJCQkgICAgICBcCisgICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoTXNnaWQpKQkJCQkJICAgICAgXAorICAgICAgIHsJCQkJCQkJCSAgICAgIFwKKwkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKKwkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCisJIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKKwkgICB7CQkJCQkJCQkgICAgICBcCisJICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKKwkgICAgICAgZGNnZXR0ZXh0X18gKERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSk7CQkgICAgICBcCisJICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCisJICAgfQkJCQkJCQkJICAgICAgXAorCSBfX3Jlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgICBfX3Jlc3VsdCA9IGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAorICAgICBfX3Jlc3VsdDsJCQkJCQkJCSAgICAgIFwKKyAgICB9KSkKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbHNlCisKKyMgZGVmaW5lIGdldHRleHQoTXNnaWQpIChNc2dpZCkKKyMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoTXNnaWQpCisjIGRlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KSAoTXNnaWQpCisjIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbm5hbWUpICgoY2hhciAqKSBEb21haW5uYW1lKQorIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgKChjaGFyICopIERpcm5hbWUpCisKKyNlbmRpZgorCisvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbGliZ251aW50bC5oLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2xpYmdudWludGwuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmU3ZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2xpYmdudWludGwuaC5pbgpAQCAtMCwwICsxLDM4MyBAQAorLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfTElCSU5UTF9ICisjZGVmaW5lIF9MSUJJTlRMX0gJMQorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKy8qIFRoZSBMQ19NRVNTQUdFUyBsb2NhbGUgY2F0ZWdvcnkgaXMgdGhlIGNhdGVnb3J5IHVzZWQgYnkgdGhlIGZ1bmN0aW9ucworICAgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpLiAgSXQgaXMgc3BlY2lmaWVkIGluIFBPU0lYLCBidXQgbm90IGluIEFOU0kgQy4KKyAgIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBkZWZpbmUgaXQsIHVzZSBhbiBhcmJpdHJhcnkgdmFsdWUgaW5zdGVhZC4KKyAgIE9uIFNvbGFyaXMsIDxsb2NhbGUuaD4gZGVmaW5lcyBfX0xPQ0FMRV9IIChvciBfTE9DQUxFX0ggaW4gU29sYXJpcyAyLjUpCisgICB0aGVuIGluY2x1ZGVzIDxsaWJpbnRsLmg+IChpLmUuIHRoaXMgZmlsZSEpIGFuZCB0aGVuIG9ubHkgZGVmaW5lcworICAgTENfTUVTU0FHRVMuICBUbyBhdm9pZCBhIHJlZGVmaW5pdGlvbiB3YXJuaW5nLCBkb24ndCBkZWZpbmUgTENfTUVTU0FHRVMKKyAgIGluIHRoaXMgY2FzZS4gICovCisjaWYgIWRlZmluZWQgTENfTUVTU0FHRVMgJiYgIShkZWZpbmVkIF9fTE9DQUxFX0ggfHwgKGRlZmluZWQgX0xPQ0FMRV9IICYmIGRlZmluZWQgX19zdW4pKQorIyBkZWZpbmUgTENfTUVTU0FHRVMgMTcyOQorI2VuZGlmCisKKy8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQorICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCisjZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKKworLyogUHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIGZpbGUgZm9ybWF0cy4gIFJldHVybnMgdGhlCisgICBtYXhpbXVtIG1pbm9yIHJldmlzaW9uIG51bWJlciBzdXBwb3J0ZWQgZm9yIGEgZ2l2ZW4gbWFqb3IgcmV2aXNpb24uICAqLworI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgXAorICAoKG1ham9yKSA9PSAwID8gMSA6IC0xKQorCisvKiBSZXNvbHZlIGEgcGxhdGZvcm0gc3BlY2lmaWMgY29uZmxpY3Qgb24gREpHUFAuICBHTlUgZ2V0dGV4dCB0YWtlcworICAgcHJlY2VkZW5jZSBvdmVyIF9jb25pb19nZXR0ZXh0LiAgKi8KKyNpZmRlZiBfX0RKR1BQX18KKyMgdW5kZWYgZ2V0dGV4dAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBXZSByZWRpcmVjdCB0aGUgZnVuY3Rpb25zIHRvIHRob3NlIHByZWZpeGVkIHdpdGggImxpYmludGxfIi4gIFRoaXMgaXMKKyAgIG5lY2Vzc2FyeSwgYmVjYXVzZSBzb21lIHN5c3RlbXMgZGVmaW5lIGdldHRleHQvdGV4dGRvbWFpbi8uLi4gaW4gdGhlIEMKKyAgIGxpYnJhcnkgKG5hbWVseSwgU29sYXJpcyAyLjQgYW5kIG5ld2VyLCBhbmQgR05VIGxpYmMgMi4wIGFuZCBuZXdlcikuCisgICBJZiB3ZSB1c2VkIHRoZSB1bnByZWZpeGVkIG5hbWVzLCB0aGVyZSB3b3VsZCBiZSBjYXNlcyB3aGVyZSB0aGUKKyAgIGRlZmluaXRpb24gaW4gdGhlIEMgbGlicmFyeSB3b3VsZCBvdmVycmlkZSB0aGUgb25lIGluIHRoZSBsaWJpbnRsLnNvCisgICBzaGFyZWQgbGlicmFyeS4gIFJlY2FsbCB0aGF0IG9uIEVMRiBzeXN0ZW1zLCB0aGUgc3ltYm9scyBhcmUgbG9va2VkCisgICB1cCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICAxLiBpbiB0aGUgZXhlY3V0YWJsZSwKKyAgICAgMi4gaW4gdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSwgaW4gb3JkZXIsCisgICAgIDMuIGluIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rCisgICAgICAgIGNvbW1hbmQgbGluZSwKKyAgICAgNC4gaW4gdGhlIGRsb3BlbigpZWQgc2hhcmVkIGxpYnJhcmllcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQorICAgICAgICBkbG9wZW4oKWVkLgorICAgVGhlIGRlZmluaXRpb24gaW4gdGhlIEMgbGlicmFyeSB3b3VsZCBvdmVycmlkZSB0aGUgb25lIGluIGxpYmludGwuc28gaWYKKyAgIGVpdGhlcgorICAgICAqIC1sYyBpcyBnaXZlbiBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUgYW5kIC1saW50bCBpc24ndCwgb3IKKyAgICAgKiAtbGMgaXMgZ2l2ZW4gb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lIGJlZm9yZSAtbGludGwsIG9yCisgICAgICogbGliaW50bC5zbyBpcyBhIGRlcGVuZGVuY3kgb2YgYSBkbG9wZW4oKWVkIHNoYXJlZCBsaWJyYXJ5IGJ1dCBub3QKKyAgICAgICBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYXQgbGluayB0aW1lLgorICAgU2luY2UgU29sYXJpcyBnZXR0ZXh0KCkgYmVoYXZlcyBkaWZmZXJlbnRseSB0aGFuIEdOVSBnZXR0ZXh0KCksIHRoaXMKKyAgIHdvdWxkIGJlIHVuYWNjZXB0YWJsZS4KKworICAgVGhlIHJlZGlyZWN0aW9uIGhhcHBlbnMgYnkgZGVmYXVsdCB0aHJvdWdoIG1hY3JvcyBpbiBDLCBzbyB0aGF0ICZnZXR0ZXh0CisgICBpcyBpbmRlcGVuZGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgYnV0IHRocm91Z2ggaW5saW5lIGZ1bmN0aW9ucyBpbgorICAgQysrLCBpbiBvcmRlciBub3QgdG8gaW50ZXJmZXJlIHdpdGggdGhlIG5hbWUgbWFuZ2xpbmcgb2YgY2xhc3MgZmllbGRzIG9yCisgICBjbGFzcyBtZXRob2RzIGNhbGxlZCAnZ2V0dGV4dCcuICAqLworCisvKiBUaGUgdXNlciBjYW4gZGVmaW5lIF9JTlRMX1JFRElSRUNUX0lOTElORSBvciBfSU5UTF9SRURJUkVDVF9NQUNST1MuCisgICBJZiBoZSBkb2Vzbid0LCB3ZSBjaG9vc2UgdGhlIG1ldGhvZC4gIEEgdGhpcmQgcG9zc2libGUgbWV0aG9kIGlzCisgICBfSU5UTF9SRURJUkVDVF9BU00sIHN1cHBvcnRlZCBvbmx5IGJ5IEdDQy4gICovCisjaWYgIShkZWZpbmVkIF9JTlRMX1JFRElSRUNUX0lOTElORSB8fCBkZWZpbmVkIF9JTlRMX1JFRElSRUNUX01BQ1JPUykKKyMgaWYgX19HTlVDX18gPj0gMiAmJiAhZGVmaW5lZCBfX0FQUExFX0NDX18gJiYgIWRlZmluZWQgX19NSU5HVzMyX18gJiYgIShfX0dOVUNfXyA9PSAyICYmIGRlZmluZWQgX0FJWCkgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9BU00KKyMgZWxzZQorIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisjICBlbHNlCisjICAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorLyogQXV4aWxpYXJ5IG1hY3Jvcy4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfQVNNCisjIGRlZmluZSBfSU5UTF9BU00oY25hbWUpIF9fYXNtX18gKF9JTlRMX0FTTU5BTUUgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgI2NuYW1lKSkKKyMgZGVmaW5lIF9JTlRMX0FTTU5BTUUocHJlZml4LGNuYW1lc3RyaW5nKSBfSU5UTF9TVFJJTkdJRlkgKHByZWZpeCkgY25hbWVzdHJpbmcKKyMgZGVmaW5lIF9JTlRMX1NUUklOR0lGWShwcmVmaXgpICNwcmVmaXgKKyNlbHNlCisjIGRlZmluZSBfSU5UTF9BU00oY25hbWUpCisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCkKK3sKKyAgcmV0dXJuIGxpYmludGxfZ2V0dGV4dCAoX19tc2dpZCk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgZ2V0dGV4dCBsaWJpbnRsX2dldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2dldHRleHQpOworI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpOworc3RhdGljIGlubGluZSBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQoreworICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBkZ2V0dGV4dCBsaWJpbnRsX2RnZXR0ZXh0CisjZW5kaWYKK2V4dGVybiBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kZ2V0dGV4dCk7CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisgICBsb2NhbGUuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQkJaW50IF9fY2F0ZWdvcnkpOworc3RhdGljIGlubGluZSBjaGFyICpkY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKKwkJCSAgICAgICBpbnQgX19jYXRlZ29yeSkKK3sKKyAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQsIF9fY2F0ZWdvcnkpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGRjZ2V0dGV4dCBsaWJpbnRsX2RjZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQlpbnQgX19jYXRlZ29yeSkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGNnZXR0ZXh0KTsKKyNlbmRpZgorCisKKy8qIFNpbWlsYXIgdG8gYGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBudW1iZXIgTi4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7CitzdGF0aWMgaW5saW5lIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pCit7CisgIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChfX21zZ2lkMSwgX19tc2dpZDIsIF9fbik7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgbmdldHRleHQgbGliaW50bF9uZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfbmdldHRleHQpOworI2VuZGlmCisKKy8qIFNpbWlsYXIgdG8gYGRnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgbnVtYmVyIE4uICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAorCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24pOworc3RhdGljIGlubGluZSBjaGFyICpkbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZDEsCisJCQkgICAgICAgY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKK3sKKyAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBkbmdldHRleHQgbGliaW50bF9kbmdldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmRuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kbmdldHRleHQpOworI2VuZGlmCisKKy8qIFNpbWlsYXIgdG8gYGRjZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIG51bWJlciBOLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCQl1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQoreworICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uLCBfX2NhdGVnb3J5KTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBkY25nZXR0ZXh0IGxpYmludGxfZGNuZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY25nZXR0ZXh0KTsKKyNlbmRpZgorCisKKy8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgorICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KKyAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKQoreworICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChfX2RvbWFpbm5hbWUpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIHRleHRkb21haW4gbGliaW50bF90ZXh0ZG9tYWluCisjZW5kaWYKK2V4dGVybiBjaGFyICp0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX3RleHRkb21haW4pOworI2VuZGlmCisKKy8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAorICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkKK3sKKyAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKF9fZG9tYWlubmFtZSwgX19kaXJuYW1lKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBiaW5kdGV4dGRvbWFpbiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCisjZW5kaWYKK2V4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX2Rpcm5hbWUpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluKTsKKyNlbmRpZgorCisvKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCisgICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJCSAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQoreworICByZXR1cm4gbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoX19kb21haW5uYW1lLCBfX2NvZGVzZXQpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCk7CisjZW5kaWYKKworCisvKiBTdXBwb3J0IGZvciBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucyBpbiAqcHJpbnRmKCksIGZvbGxvd2luZyB0aGUKKyAgIFBPU0lYL1hTSSBzcGVjaWZpY2F0aW9uLgorICAgTm90ZTogVGhlc2UgcmVwbGFjZW1lbnRzIGZvciB0aGUgKnByaW50ZigpIGZ1bmN0aW9ucyBhcmUgdmlzaWJsZSBvbmx5CisgICBpbiBzb3VyY2UgZmlsZXMgdGhhdCAjaW5jbHVkZSA8bGliaW50bC5oPiBvciAjaW5jbHVkZSAiZ2V0dGV4dC5oIi4KKyAgIFBhY2thZ2VzIHRoYXQgdXNlICpwcmludGYoKSBpbiBzb3VyY2UgZmlsZXMgdGhhdCBkb24ndCByZWZlciB0byBfKCkKKyAgIG9yIGdldHRleHQoKSBidXQgZm9yIHdoaWNoIHRoZSBmb3JtYXQgc3RyaW5nIGNvdWxkIGJlIHRoZSByZXR1cm4gdmFsdWUKKyAgIG9mIF8oKSBvciBnZXR0ZXh0KCkgbmVlZCB0byBhZGQgdGhpcyAjaW5jbHVkZS4gIE9oIHdlbGwuICAqLworCisjaWYgIUBIQVZFX1BPU0lYX1BSSU5URkAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCB2YV9saXN0LiAgKi8KKyNpZiBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorIyBpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKworI3VuZGVmIGZwcmludGYKKyNkZWZpbmUgZnByaW50ZiBsaWJpbnRsX2ZwcmludGYKK2V4dGVybiBpbnQgZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7CisjdW5kZWYgdmZwcmludGYKKyNkZWZpbmUgdmZwcmludGYgbGliaW50bF92ZnByaW50ZgorZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCisjdW5kZWYgcHJpbnRmCisjZGVmaW5lIHByaW50ZiBsaWJpbnRsX3ByaW50ZgorZXh0ZXJuIGludCBwcmludGYgKGNvbnN0IGNoYXIgKiwgLi4uKTsKKyN1bmRlZiB2cHJpbnRmCisjZGVmaW5lIHZwcmludGYgbGliaW50bF92cHJpbnRmCitleHRlcm4gaW50IHZwcmludGYgKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyN1bmRlZiBzcHJpbnRmCisjZGVmaW5lIHNwcmludGYgbGliaW50bF9zcHJpbnRmCitleHRlcm4gaW50IHNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworI3VuZGVmIHZzcHJpbnRmCisjZGVmaW5lIHZzcHJpbnRmIGxpYmludGxfdnNwcmludGYKK2V4dGVybiBpbnQgdnNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworI2lmIEBIQVZFX1NOUFJJTlRGQAorCisjdW5kZWYgc25wcmludGYKKyNkZWZpbmUgc25wcmludGYgbGliaW50bF9zbnByaW50ZgorZXh0ZXJuIGludCBzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyN1bmRlZiB2c25wcmludGYKKyNkZWZpbmUgdnNucHJpbnRmIGxpYmludGxfdnNucHJpbnRmCitleHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyNlbmRpZgorCisjaWYgQEhBVkVfQVNQUklOVEZACisKKyN1bmRlZiBhc3ByaW50ZgorI2RlZmluZSBhc3ByaW50ZiBsaWJpbnRsX2FzcHJpbnRmCitleHRlcm4gaW50IGFzcHJpbnRmIChjaGFyICoqLCBjb25zdCBjaGFyICosIC4uLik7CisjdW5kZWYgdmFzcHJpbnRmCisjZGVmaW5lIHZhc3ByaW50ZiBsaWJpbnRsX3Zhc3ByaW50ZgorZXh0ZXJuIGludCB2YXNwcmludGYgKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyNlbmRpZgorCisjaWYgQEhBVkVfV1BSSU5URkAKKworI3VuZGVmIGZ3cHJpbnRmCisjZGVmaW5lIGZ3cHJpbnRmIGxpYmludGxfZndwcmludGYKK2V4dGVybiBpbnQgZndwcmludGYgKEZJTEUgKiwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOworI3VuZGVmIHZmd3ByaW50ZgorI2RlZmluZSB2ZndwcmludGYgbGliaW50bF92ZndwcmludGYKK2V4dGVybiBpbnQgdmZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7CisKKyN1bmRlZiB3cHJpbnRmCisjZGVmaW5lIHdwcmludGYgbGliaW50bF93cHJpbnRmCitleHRlcm4gaW50IHdwcmludGYgKGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKKyN1bmRlZiB2d3ByaW50ZgorI2RlZmluZSB2d3ByaW50ZiBsaWJpbnRsX3Z3cHJpbnRmCitleHRlcm4gaW50IHZ3cHJpbnRmIChjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOworCisjdW5kZWYgc3dwcmludGYKKyNkZWZpbmUgc3dwcmludGYgbGliaW50bF9zd3ByaW50ZgorZXh0ZXJuIGludCBzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKKyN1bmRlZiB2c3dwcmludGYKKyNkZWZpbmUgdnN3cHJpbnRmIGxpYmludGxfdnN3cHJpbnRmCitleHRlcm4gaW50IHZzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7CisKKyNlbmRpZgorCisjZW5kaWYKKworCisvKiBTdXBwb3J0IGZvciByZWxvY2F0YWJsZSBwYWNrYWdlcy4gICovCisKKy8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgorICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKyAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCisgICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCisgICBpbnN0ZWFkIG9mICIvIikuICAqLworI2RlZmluZSBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeAorZXh0ZXJuIHZvaWQKKyAgICAgICBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCisJCQkJICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXgpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBsaWJpbnRsLmggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2FkaW5mby5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2xvYWRpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlNWViZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2FkaW5mby5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0xPQURJTkZPX0gKKyNkZWZpbmUgX0xPQURJTkZPX0gJMQorCisvKiBEZWNsYXJhdGlvbnMgb2YgbG9jYWxlIGRlcGVuZGVudCBjYXRhbG9nIGxvb2t1cCBmdW5jdGlvbnMuCisgICBJbXBsZW1lbnRlZCBpbgorCisgICAgIGxvY2FsZWFsaWFzLmMgICAgUG9zc2libHkgcmVwbGFjZSBhIGxvY2FsZSBuYW1lIGJ5IGFub3RoZXIuCisgICAgIGV4cGxvZGVuYW1lLmMgICAgU3BsaXQgYSBsb2NhbGUgbmFtZSBpbnRvIGl0cyB2YXJpb3VzIGZpZWxkcy4KKyAgICAgbDEwbmZsaXN0LmMgICAgICBHZW5lcmF0ZSBhIGxpc3Qgb2YgZmlsZW5hbWVzIG9mIHBvc3NpYmxlIG1lc3NhZ2UgY2F0YWxvZ3MuCisgICAgIGZpbmRkb21haW4uYyAgICAgRmluZCBhbmQgb3BlbiB0aGUgcmVsZXZhbnQgbWVzc2FnZSBjYXRhbG9ncy4KKworICAgVGhlIG1haW4gZnVuY3Rpb24gX25sX2ZpbmRfZG9tYWluKCkgaW4gZmluZGRvbWFpbi5jIGlzIGRlY2xhcmVkCisgICBpbiBnZXR0ZXh0UC5oLgorICovCisKKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisjZW5kaWYKKworLyogVGVsbCB0aGUgY29tcGlsZXIgd2hlbiBhIGNvbmRpdGlvbmFsIG9yIGludGVnZXIgZXhwcmVzc2lvbiBpcworICAgYWxtb3N0IGFsd2F5cyB0cnVlIG9yIGFsbW9zdCBhbHdheXMgZmFsc2UuICAqLworI2lmbmRlZiBIQVZFX0JVSUxUSU5fRVhQRUNUCisjIGRlZmluZSBfX2J1aWx0aW5fZXhwZWN0KGV4cHIsIHZhbCkgKGV4cHIpCisjZW5kaWYKKworLyogU2VwYXJhdG9yIGluIFBBVEggbGlrZSBsaXN0cyBvZiBwYXRobmFtZXMuICAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOycKKyNlbHNlCisgIC8qIFVuaXggKi8KKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKy8qIEVuY29kaW5nIG9mIGxvY2FsZSBuYW1lIHBhcnRzLiAgKi8KKyNkZWZpbmUgQ0VOX1JFVklTSU9OCQkxCisjZGVmaW5lIENFTl9TUE9OU09SCQkyCisjZGVmaW5lIENFTl9TUEVDSUFMCQk0CisjZGVmaW5lIFhQR19OT1JNX0NPREVTRVQJOAorI2RlZmluZSBYUEdfQ09ERVNFVAkJMTYKKyNkZWZpbmUgVEVSUklUT1JZCQkzMgorI2RlZmluZSBDRU5fQVVESUVOQ0UJCTY0CisjZGVmaW5lIFhQR19NT0RJRklFUgkJMTI4CisKKyNkZWZpbmUgQ0VOX1NQRUNJRklDCShDRU5fUkVWSVNJT058Q0VOX1NQT05TT1J8Q0VOX1NQRUNJQUx8Q0VOX0FVRElFTkNFKQorI2RlZmluZSBYUEdfU1BFQ0lGSUMJKFhQR19DT0RFU0VUfFhQR19OT1JNX0NPREVTRVR8WFBHX01PRElGSUVSKQorCisKK3N0cnVjdCBsb2FkZWRfbDEwbmZpbGUKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGludCBkZWNpZGVkOworCisgIGNvbnN0IHZvaWQgKmRhdGE7CisKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbmV4dDsKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqc3VjY2Vzc29yWzFdOworfTsKKworCisvKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0CisgICBuYW1lcy4gIE5vcm1hbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbgorICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCisgICBmcmVlZCBieSB0aGUgY2FsbGVyLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpfbmxfbm9ybWFsaXplX2NvZGVzZXQgKGNvbnN0IGNoYXIgKmNvZGVzZXQsCisJCQkJCSAgc2l6ZV90IG5hbWVfbGVuKTsKKworLyogTG9va3VwIGEgbG9jYWxlIGRlcGVuZGVudCBmaWxlLgorICAgKkwxME5GSUxFX0xJU1QgZGVub3RlcyBhIHBvb2wgb2YgbG9va3VwIHJlc3VsdHMgb2YgbG9jYWxlIGRlcGVuZGVudAorICAgZmlsZXMgb2YgdGhlIHNhbWUga2luZCwgc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgLT5maWxlbmFtZS4KKyAgIERJUkxJU1QgYW5kIERJUkxJU1RfTEVOIGFyZSBhbiBhcmd6IGxpc3Qgb2YgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8KKyAgIGxvb2ssIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGRpcmVjdG9yeSAoaS5lLiBESVJMSVNUX0xFTiA+IDApLgorICAgTUFTSywgTEFOR1VBR0UsIFRFUlJJVE9SWSwgQ09ERVNFVCwgTk9STUFMSVpFRF9DT0RFU0VULCBNT0RJRklFUiwKKyAgIFNQRUNJQUwsIFNQT05TT1IsIFJFVklTSU9OIGFyZSB0aGUgcGllY2VzIG9mIHRoZSBsb2NhbGUgbmFtZSwgYXMKKyAgIHByb2R1Y2VkIGJ5IF9ubF9leHBsb2RlX25hbWUoKS4gIEZJTEVOQU1FIGlzIHRoZSBmaWxlbmFtZSBzdWZmaXguCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsb29rdXAgcmVzdWx0LCBlaXRoZXIgZm91bmQgaW4gKkwxME5GSUxFX0xJU1QsCisgICBvciAtIGlmIERPX0FMTE9DQVRFIGlzIG5vbnplcm8gLSBmcmVzaGx5IGFsbG9jYXRlZCwgb3IgcG9zc2libHkgTlVMTC4KKyAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLU5VTEwsIGl0IGlzIGFkZGVkIHRvICpMMTBORklMRV9MSVNULCBhbmQKKyAgIGl0cyAtPm5leHQgZmllbGQgZGVub3RlcyB0aGUgY2hhaW5pbmcgaW5zaWRlICpMMTBORklMRV9MSVNULCBhbmQKKyAgIGZ1cnRoZXJtb3JlIGl0cyAtPnN1Y2Nlc3NvcltdIGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBvdGhlciBsb29rdXAKKyAgIHJlc3VsdHMgZnJvbSB3aGljaCB0aGlzIGxvb2t1cCByZXN1bHQgaW5oZXJpdHMuICAqLworZXh0ZXJuIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgorX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKKwkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCisJCSAgICBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAorCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAorCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKnNwZWNpYWwsCisJCSAgICBjb25zdCBjaGFyICpzcG9uc29yLCBjb25zdCBjaGFyICpyZXZpc2lvbiwKKwkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpOworCisvKiBMb29rdXAgdGhlIHJlYWwgbG9jYWxlIG5hbWUgZm9yIGEgbG9jYWxlIGFsaWFzIE5BTUUsIG9yIE5VTEwgaWYKKyAgIE5BTUUgaXMgbm90IGEgbG9jYWxlIGFsaWFzIChidXQgcG9zc2libHkgYSByZWFsIGxvY2FsZSBuYW1lKS4KKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYW5kIG11c3Qgbm90IGJlIGZyZWVkLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzIChjb25zdCBjaGFyICpuYW1lKTsKKworLyogU3BsaXQgYSBsb2NhbGUgbmFtZSBOQU1FIGludG8gaXRzIHBpZWNlczogbGFuZ3VhZ2UsIG1vZGlmaWVyLAorICAgdGVycml0b3J5LCBjb2Rlc2V0LCBzcGVjaWFsLCBzcG9uc29yLCByZXZpc2lvbi4KKyAgIE5BTUUgZ2V0cyBkZXN0cnVjdGl2ZWx5IG1vZGlmaWVkOiBOVUwgYnl0ZXMgYXJlIGluc2VydGVkIGhlcmUgYW5kCisgICB0aGVyZS4gICpMQU5HVUFHRSBnZXRzIGFzc2lnbmVkIE5BTUUuICBFYWNoIG9mICpNT0RJRklFUiwgKlRFUlJJVE9SWSwKKyAgICpDT0RFU0VULCAqU1BFQ0lBTCwgKlNQT05TT1IsICpSRVZJU0lPTiBnZXRzIGFzc2lnbmVkIGVpdGhlciBhCisgICBwb2ludGVyIGludG8gdGhlIG9sZCBOQU1FIHN0cmluZywgb3IgTlVMTC4gICpOT1JNQUxJWkVEX0NPREVTRVQKKyAgIGdldHMgYXNzaWduZWQgdGhlIGV4cGFuZGVkICpDT0RFU0VULCBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSAqQ09ERVNFVDsKKyAgIHRoaXMgb25lIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYml0bWFzaywgd2hlcmUgZWFjaCBiaXQgY29ycmVzcG9uZHMgdG8gb25lCisgICBmaWxsZWQtaW4gdmFsdWU6CisgICAgIFhQR19NT0RJRklFUiwgQ0VOX0FVRElFTkNFICBmb3IgKk1PRElGSUVSLAorICAgICBURVJSSVRPUlkgICAgICAgICAgICAgICAgICAgZm9yICpURVJSSVRPUlksCisgICAgIFhQR19DT0RFU0VUICAgICAgICAgICAgICAgICBmb3IgKkNPREVTRVQsCisgICAgIFhQR19OT1JNX0NPREVTRVQgICAgICAgICAgICBmb3IgKk5PUk1BTElaRURfQ09ERVNFVCwKKyAgICAgQ0VOX1NQRUNJQUwgICAgICAgICAgICAgICAgIGZvciAqU1BFQ0lBTCwKKyAgICAgQ0VOX1NQT05TT1IgICAgICAgICAgICAgICAgIGZvciAqU1BPTlNPUiwKKyAgICAgQ0VOX1JFVklTSU9OICAgICAgICAgICAgICAgIGZvciAqUkVWSVNJT04uCisgKi8KK2V4dGVybiBpbnQgX25sX2V4cGxvZGVfbmFtZSAoY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmxhbmd1YWdlLAorCQkJICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksCisJCQkgICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAorCQkJICAgICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0LAorCQkJICAgICBjb25zdCBjaGFyICoqc3BlY2lhbCwgY29uc3QgY2hhciAqKnNwb25zb3IsCisJCQkgICAgIGNvbnN0IGNoYXIgKipyZXZpc2lvbik7CisKKy8qIFNwbGl0IGEgbG9jYWxlIG5hbWUgTkFNRSBpbnRvIGEgbGVhZGluZyBsYW5ndWFnZSBwYXJ0IGFuZCBhbGwgdGhlCisgICByZXN0LiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYW5ndWFnZSwKKyAgIGkuZS4gdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3QuICAqLworZXh0ZXJuIGNoYXIgKl9ubF9maW5kX2xhbmd1YWdlIChjb25zdCBjaGFyICpuYW1lKTsKKworI2VuZGlmCS8qIGxvYWRpbmZvLmggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2FkbXNnY2F0LmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9hZG1zZ2NhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWI3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9hZG1zZ2NhdC5jCkBAIC0wLDAgKzEsMTQxOCBAQAorLyogTG9hZCBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmZGVmIF9fR05VQ19fCisjIHVuZGVmICBhbGxvY2EKKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjIGRlZmluZSBIQVZFX0FMTE9DQSAxCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EKK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KKyMgaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKKyAgICB8fCAoZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9QT1NJWF9NQVBQRURfRklMRVMpCisjIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjIHVuZGVmIEhBVkVfTU1BUAorIyBkZWZpbmUgSEFWRV9NTUFQCTEKKyNlbHNlCisjIHVuZGVmIEhBVkVfTU1BUAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkIEhBVkVfSU5UVFlQRVNfSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdtby5oIgorI2luY2x1ZGUgImdldHRleHRQLmgiCisjaW5jbHVkZSAiaGFzaC1zdHJpbmcuaCIKKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlICIuLi9sb2NhbGUvbG9jYWxlaW5mby5oIgorI2VuZGlmCisKKy8qIFByb3ZpZGUgZmFsbGJhY2sgdmFsdWVzIGZvciBtYWNyb3MgdGhhdCBvdWdodCB0byBiZSBkZWZpbmVkIGluIDxpbnR0eXBlcy5oPi4KKyAgIE5vdGUgdGhhdCBvdXIgZmFsbGJhY2sgdmFsdWVzIG5lZWQgbm90IGJlIGxpdGVyYWwgc3RyaW5ncywgYmVjYXVzZSB3ZSBkb24ndAorICAgdXNlIHRoZW0gd2l0aCBwcmVwcm9jZXNzb3Igc3RyaW5nIGNvbmNhdGVuYXRpb24uICAqLworI2lmICFkZWZpbmVkIFBSSWQ4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWQ4CisjIGRlZmluZSBQUklkOCAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWk4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWk4CisjIGRlZmluZSBQUklpOCAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW84IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW84CisjIGRlZmluZSBQUklvOCAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXU4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXU4CisjIGRlZmluZSBQUkl1OCAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXg4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXg4CisjIGRlZmluZSBQUkl4OCAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVg4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVg4CisjIGRlZmluZSBQUklYOCAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWQxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkMTYKKyMgZGVmaW5lIFBSSWQxNiAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWkxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpMTYKKyMgZGVmaW5lIFBSSWkxNiAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW8xNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvMTYKKyMgZGVmaW5lIFBSSW8xNiAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXUxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1MTYKKyMgZGVmaW5lIFBSSXUxNiAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXgxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4MTYKKyMgZGVmaW5lIFBSSXgxNiAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVgxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYMTYKKyMgZGVmaW5lIFBSSVgxNiAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWQzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkMzIKKyMgZGVmaW5lIFBSSWQzMiAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWkzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpMzIKKyMgZGVmaW5lIFBSSWkzMiAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW8zMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvMzIKKyMgZGVmaW5lIFBSSW8zMiAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXUzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1MzIKKyMgZGVmaW5lIFBSSXUzMiAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXgzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4MzIKKyMgZGVmaW5lIFBSSXgzMiAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVgzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYMzIKKyMgZGVmaW5lIFBSSVgzMiAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWQ2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkNjQKKyMgZGVmaW5lIFBSSWQ2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxkIiA6ICJsbGQiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaTY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWk2NAorIyBkZWZpbmUgUFJJaTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGkiIDogImxsaSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJbzY0CisjIGRlZmluZSBQUklvNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsbyIgOiAibGxvIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXU2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1NjQKKyMgZGVmaW5lIFBSSXU2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImx1IiA6ICJsbHUiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXg2NAorIyBkZWZpbmUgUFJJeDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHgiIDogImxseCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWDY0CisjIGRlZmluZSBQUklYNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsWCIgOiAibGxYIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZExFQVNUOAorIyBkZWZpbmUgUFJJZExFQVNUOCAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUxFQVNUOAorIyBkZWZpbmUgUFJJaUxFQVNUOCAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9MRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0xFQVNUOAorIyBkZWZpbmUgUFJJb0xFQVNUOCAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUxFQVNUOAorIyBkZWZpbmUgUFJJdUxFQVNUOCAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeExFQVNUOAorIyBkZWZpbmUgUFJJeExFQVNUOCAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWExFQVNUOAorIyBkZWZpbmUgUFJJWExFQVNUOCAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRMRUFTVDE2CisjIGRlZmluZSBQUklkTEVBU1QxNiAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlMRUFTVDE2CisjIGRlZmluZSBQUklpTEVBU1QxNiAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9MRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9MRUFTVDE2CisjIGRlZmluZSBQUklvTEVBU1QxNiAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVMRUFTVDE2CisjIGRlZmluZSBQUkl1TEVBU1QxNiAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhMRUFTVDE2CisjIGRlZmluZSBQUkl4TEVBU1QxNiAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhMRUFTVDE2CisjIGRlZmluZSBQUklYTEVBU1QxNiAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRMRUFTVDMyCisjIGRlZmluZSBQUklkTEVBU1QzMiAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlMRUFTVDMyCisjIGRlZmluZSBQUklpTEVBU1QzMiAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9MRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9MRUFTVDMyCisjIGRlZmluZSBQUklvTEVBU1QzMiAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVMRUFTVDMyCisjIGRlZmluZSBQUkl1TEVBU1QzMiAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhMRUFTVDMyCisjIGRlZmluZSBQUkl4TEVBU1QzMiAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhMRUFTVDMyCisjIGRlZmluZSBQUklYTEVBU1QzMiAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRMRUFTVDY0CisjIGRlZmluZSBQUklkTEVBU1Q2NCBQUklkNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlMRUFTVDY0CisjIGRlZmluZSBQUklpTEVBU1Q2NCBQUklpNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9MRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9MRUFTVDY0CisjIGRlZmluZSBQUklvTEVBU1Q2NCBQUklvNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVMRUFTVDY0CisjIGRlZmluZSBQUkl1TEVBU1Q2NCBQUkl1NjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhMRUFTVDY0CisjIGRlZmluZSBQUkl4TEVBU1Q2NCBQUkl4NjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhMRUFTVDY0CisjIGRlZmluZSBQUklYTEVBU1Q2NCBQUklYNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkRkFTVDgKKyMgZGVmaW5lIFBSSWRGQVNUOCAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpRkFTVDgKKyMgZGVmaW5lIFBSSWlGQVNUOCAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9GQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvRkFTVDgKKyMgZGVmaW5lIFBSSW9GQVNUOCAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1RkFTVDgKKyMgZGVmaW5lIFBSSXVGQVNUOCAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4RkFTVDgKKyMgZGVmaW5lIFBSSXhGQVNUOCAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYRkFTVDgKKyMgZGVmaW5lIFBSSVhGQVNUOCAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZEZBU1QxNgorIyBkZWZpbmUgUFJJZEZBU1QxNiAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUZBU1QxNgorIyBkZWZpbmUgUFJJaUZBU1QxNiAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9GQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0ZBU1QxNgorIyBkZWZpbmUgUFJJb0ZBU1QxNiAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUZBU1QxNgorIyBkZWZpbmUgUFJJdUZBU1QxNiAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeEZBU1QxNgorIyBkZWZpbmUgUFJJeEZBU1QxNiAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWEZBU1QxNgorIyBkZWZpbmUgUFJJWEZBU1QxNiAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZEZBU1QzMgorIyBkZWZpbmUgUFJJZEZBU1QzMiAiZCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUZBU1QzMgorIyBkZWZpbmUgUFJJaUZBU1QzMiAiaSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9GQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0ZBU1QzMgorIyBkZWZpbmUgUFJJb0ZBU1QzMiAibyIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUZBU1QzMgorIyBkZWZpbmUgUFJJdUZBU1QzMiAidSIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeEZBU1QzMgorIyBkZWZpbmUgUFJJeEZBU1QzMiAieCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWEZBU1QzMgorIyBkZWZpbmUgUFJJWEZBU1QzMiAiWCIKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZEZBU1Q2NAorIyBkZWZpbmUgUFJJZEZBU1Q2NCBQUklkNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUZBU1Q2NAorIyBkZWZpbmUgUFJJaUZBU1Q2NCBQUklpNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9GQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0ZBU1Q2NAorIyBkZWZpbmUgUFJJb0ZBU1Q2NCBQUklvNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUZBU1Q2NAorIyBkZWZpbmUgUFJJdUZBU1Q2NCBQUkl1NjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeEZBU1Q2NAorIyBkZWZpbmUgUFJJeEZBU1Q2NCBQUkl4NjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWEZBU1Q2NAorIyBkZWZpbmUgUFJJWEZBU1Q2NCBQUklYNjQKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZE1BWAorIyBkZWZpbmUgUFJJZE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibGQiIDogImxsZCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlNQVgKKyMgZGVmaW5lIFBSSWlNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxpIiA6ICJsbGkiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb01BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvTUFYCisjIGRlZmluZSBQUklvTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsbyIgOiAibGxvIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdU1BWAorIyBkZWZpbmUgUFJJdU1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibHUiIDogImxsdSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4TUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhNQVgKKyMgZGVmaW5lIFBSSXhNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImx4IiA6ICJsbHgiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYTUFYCisjIGRlZmluZSBQUklYTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsWCIgOiAibGxYIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWRQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZFBUUgorIyBkZWZpbmUgUFJJZFBUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gImQiIDogXAorICAgImxsZCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlQVFIKKyMgZGVmaW5lIFBSSWlQVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibGkiIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJpIiA6IFwKKyAgICJsbGkiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb1BUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvUFRSCisjIGRlZmluZSBQUklvUFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxvIiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAibyIgOiBcCisgICAibGxvIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXVQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdVBUUgorIyBkZWZpbmUgUFJJdVBUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gInUiIDogXAorICAgImxsdSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4UFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhQVFIKKyMgZGVmaW5lIFBSSXhQVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibHgiIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJ4IiA6IFwKKyAgICJsbHgiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYUFRSCisjIGRlZmluZSBQUklYUFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxYIiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiWCIgOiBcCisgICAibGxYIikKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZmRlZiBfTElCQworLyogUmVuYW1lIHRoZSBub24gSVNPIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKKyAgIGJlY2F1c2Ugc29tZSBJU08gQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAorICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworIyBkZWZpbmUgb3BlbiAgIF9fb3BlbgorIyBkZWZpbmUgY2xvc2UgIF9fY2xvc2UKKyMgZGVmaW5lIHJlYWQgICBfX3JlYWQKKyMgZGVmaW5lIG1tYXAgICBfX21tYXAKKyMgZGVmaW5lIG11bm1hcCBfX211bm1hcAorI2VuZGlmCisKKy8qIEZvciB0aG9zZSBsb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisgICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworI2lmZGVmIEhBVkVfQUxMT0NBCisjIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCisjZWxzZQorIyBkZWZpbmUgYWxsb2NhKG4pIG1hbGxvYyAobikKKyMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCisjZW5kaWYKKworLyogRm9yIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBJL08uCisgICBPX0JJTkFSWSBpcyB1c3VhbGx5IGRlY2xhcmVkIGluIDxmY250bC5oPi4gKi8KKyNpZiAhZGVmaW5lZCBPX0JJTkFSWSAmJiBkZWZpbmVkIF9PX0JJTkFSWQorICAvKiBGb3IgTVNDLWNvbXBhdGlibGUgY29tcGlsZXJzLiAgKi8KKyMgZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQorIyBkZWZpbmUgT19URVhUIF9PX1RFWFQKKyNlbmRpZgorI2lmZGVmIF9fQkVPU19fCisgIC8qIEJlT1MgNSBoYXMgT19CSU5BUlkgYW5kIE9fVEVYVCwgYnV0IHRoZXkgaGF2ZSBubyBlZmZlY3QuICAqLworIyB1bmRlZiBPX0JJTkFSWQorIyB1bmRlZiBPX1RFWFQKKyNlbmRpZgorLyogT24gcmVhc29uYWJsZSBzeXN0ZW1zLCBiaW5hcnkgSS9PIGlzIHRoZSBkZWZhdWx0LiAgKi8KKyNpZm5kZWYgT19CSU5BUlkKKyMgZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisKKy8qIFdlIG5lZWQgYSBzaWduLCB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQKKyAgIHdpdGggYWxsIHRyYW5zbGF0aW9ucy4gIFRoaXMgaXMgaW1wb3J0YW50IGlmIHRoZSB0cmFuc2xhdGlvbnMgYXJlCisgICBjYWNoZWQgYnkgb25lIG9mIEdDQydzIGZlYXR1cmVzLiAgKi8KK2ludCBfbmxfbXNnX2NhdF9jbnRyOworCisKKy8qIEV4cGFuZCBhIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQuICBSZXR1cm4gTlVMTCBpZiB1bnN1cHBvcnRlZC4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfc3lzZGVwX3NlZ21lbnRfdmFsdWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIC8qIFRlc3QgZm9yIGFuIElTTyBDIDk5IHNlY3Rpb24gNy44LjEgZm9ybWF0IHN0cmluZyBkaXJlY3RpdmUuCisgICAgIFN5bnRheDoKKyAgICAgUCBSIEkgeyBkIHwgaSB8IG8gfCB1IHwgeCB8IFggfQorICAgICB7IHsgfCBMRUFTVCB8IEZBU1QgfSB7IDggfCAxNiB8IDMyIHwgNjQgfSB8IE1BWCB8IFBUUiB9ICAqLworICAvKiBXZSBkb24ndCB1c2UgYSB0YWJsZSBvZiAxNCB0aW1lcyA2ICdjb25zdCBjaGFyIConIHN0cmluZ3MgaGVyZSwgYmVjYXVzZQorICAgICBkYXRhIHJlbG9jYXRpb25zIGNvc3Qgc3RhcnR1cCB0aW1lLiAgKi8KKyAgaWYgKG5hbWVbMF0gPT0gJ1AnICYmIG5hbWVbMV0gPT0gJ1InICYmIG5hbWVbMl0gPT0gJ0knKQorICAgIHsKKyAgICAgIGlmIChuYW1lWzNdID09ICdkJyB8fCBuYW1lWzNdID09ICdpJyB8fCBuYW1lWzNdID09ICdvJyB8fCBuYW1lWzNdID09ICd1JworCSAgfHwgbmFtZVszXSA9PSAneCcgfHwgbmFtZVszXSA9PSAnWCcpCisJeworCSAgaWYgKG5hbWVbNF0gPT0gJzgnICYmIG5hbWVbNV0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWQ4OworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWk4OworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW84OworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXU4OworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXg4OworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVg4OworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnMScgJiYgbmFtZVs1XSA9PSAnNicgJiYgbmFtZVs2XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZDE2OworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWkxNjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvMTY7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdTE2OworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXgxNjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYMTY7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICczJyAmJiBuYW1lWzVdID09ICcyJyAmJiBuYW1lWzZdID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisJCXJldHVybiBQUklkMzI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaTMyOworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW8zMjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisJCXJldHVybiBQUkl1MzI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeDMyOworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVgzMjsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJzYnICYmIG5hbWVbNV0gPT0gJzQnICYmIG5hbWVbNl0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWQ2NDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpNjQ7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQlyZXR1cm4gUFJJbzY0OworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXU2NDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4NjQ7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQlyZXR1cm4gUFJJWDY0OworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnTCcgJiYgbmFtZVs1XSA9PSAnRScgJiYgbmFtZVs2XSA9PSAnQScKKwkgICAgICAmJiBuYW1lWzddID09ICdTJyAmJiBuYW1lWzhdID09ICdUJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzldID09ICc4JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9MRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhMRUFTVDg7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs5XSA9PSAnMScgJiYgbmFtZVsxMF0gPT0gJzYnICYmIG5hbWVbMTFdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZExFQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlMRUFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvTEVBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUxFQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhMRUFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYTEVBU1QxNjsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzldID09ICczJyAmJiBuYW1lWzEwXSA9PSAnMicgJiYgbmFtZVsxMV0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkTEVBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUxFQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9MRUFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1TEVBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeExFQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhMRUFTVDMyOworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOV0gPT0gJzYnICYmIG5hbWVbMTBdID09ICc0JyAmJiBuYW1lWzExXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRMRUFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpTEVBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0xFQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVMRUFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4TEVBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWExFQVNUNjQ7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJ0YnICYmIG5hbWVbNV0gPT0gJ0EnICYmIG5hbWVbNl0gPT0gJ1MnCisJICAgICAgJiYgbmFtZVs3XSA9PSAnVCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVs4XSA9PSAnOCcgJiYgbmFtZVs5XSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRGQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUZBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvRkFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVGQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeEZBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYRkFTVDg7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs4XSA9PSAnMScgJiYgbmFtZVs5XSA9PSAnNicgJiYgbmFtZVsxMF0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkRkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpRkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvRkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1RkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4RkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYRkFTVDE2OworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOF0gPT0gJzMnICYmIG5hbWVbOV0gPT0gJzInICYmIG5hbWVbMTBdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZEZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0ZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeEZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWEZBU1QzMjsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzhdID09ICc2JyAmJiBuYW1lWzldID09ICc0JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9GQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhGQVNUNjQ7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJ00nICYmIG5hbWVbNV0gPT0gJ0EnICYmIG5hbWVbNl0gPT0gJ1gnCisJICAgICAgJiYgbmFtZVs3XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZE1BWDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpTUFYOworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW9NQVg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdU1BWDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4TUFYOworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVhNQVg7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICdQJyAmJiBuYW1lWzVdID09ICdUJyAmJiBuYW1lWzZdID09ICdSJworCSAgICAgICYmIG5hbWVbN10gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWRQVFI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaVBUUjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvUFRSOworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXVQVFI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeFBUUjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYUFRSOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJfQorICAgIH0KKyAgLyogVGVzdCBmb3IgYSBnbGliYyBzcGVjaWZpYyBwcmludGYoKSBmb3JtYXQgZGlyZWN0aXZlIGZsYWcuICAqLworICBpZiAobmFtZVswXSA9PSAnSScgJiYgbmFtZVsxXSA9PSAnXDAnKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKQorICAgICAgLyogVGhlICdJJyBmbGFnLCBpbiBudW1lcmljIGZvcm1hdCBkaXJlY3RpdmVzLCByZXBsYWNlcyBBU0NJSSBkaWdpdHMKKwkgd2l0aCB0aGUgJ291dGRpZ2l0cycgZGVmaW5lZCBpbiB0aGUgTENfQ1RZUEUgbG9jYWxlIGZhY2V0LiAgVGhpcyBpcworCSB1c2VkIGZvciBGYXJzaSAoUGVyc2lhbikgYW5kIG1heWJlIEFyYWJpYy4gICovCisgICAgICByZXR1cm4gIkkiOworI2Vsc2UKKyAgICAgIHJldHVybiAiIjsKKyNlbmRpZgorICAgIH0KKyAgLyogT3RoZXIgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIGFyZSBub3QgdmFsaWQuICAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgY29kZXNldCBkZXBlbmRlbnQgcGFydHMgb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4KKyAgIFJldHVybiB0aGUgaGVhZGVyIGVudHJ5LiAgKi8KK2NvbnN0IGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF9pbml0X2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKwkJICAgICAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbiwKKwkJICAgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCit7CisgIC8qIEZpbmQgb3V0IGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0IHRoZSBmaWxlIGlzIGVuY29kZWQgd2l0aC4KKyAgICAgVGhpcyBjYW4gYmUgZm91bmQgKGluIHRleHR1YWwgZm9ybSkgaW4gdGhlIGVudHJ5ICIiLiAgSWYgdGhpcworICAgICBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGBjaGFyc2V0PScKKyAgICAgaW5mb3JtYXRpb24sIHdlIHdpbGwgYXNzdW1lIHRoZSBjaGFyc2V0IG1hdGNoZXMgdGhlIG9uZSB0aGUKKyAgICAgY3VycmVudCBsb2NhbGUgYW5kIHdlIGRvbid0IGhhdmUgdG8gcGVyZm9ybSBhbnkgY29udmVyc2lvbi4gICovCisgIGNoYXIgKm51bGxlbnRyeTsKKyAgc2l6ZV90IG51bGxlbnRyeWxlbjsKKworICAvKiBQcmVpbml0aWFsaXplIGZpZWxkcywgdG8gYXZvaWQgcmVjdXJzaW9uIGR1cmluZyBfbmxfZmluZF9tc2cuICAqLworICBkb21haW4tPmNvZGVzZXRfY250ciA9CisgICAgKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCA/IGRvbWFpbmJpbmRpbmctPmNvZGVzZXRfY250ciA6IDApOworI2lmZGVmIF9MSUJDCisgIGRvbWFpbi0+Y29udiA9IChfX2djb252X3QpIC0xOworI2Vsc2UKKyMgaWYgSEFWRV9JQ09OVgorICBkb21haW4tPmNvbnYgPSAoaWNvbnZfdCkgLTE7CisjIGVuZGlmCisjZW5kaWYKKyAgZG9tYWluLT5jb252X3RhYiA9IE5VTEw7CisKKyAgLyogR2V0IHRoZSBoZWFkZXIgZW50cnkuICAqLworICBudWxsZW50cnkgPSBfbmxfZmluZF9tc2cgKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nLCAiIiwgJm51bGxlbnRyeWxlbik7CisKKyAgaWYgKG51bGxlbnRyeSAhPSBOVUxMKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IEhBVkVfSUNPTlYKKyAgICAgIGNvbnN0IGNoYXIgKmNoYXJzZXRzdHI7CisKKyAgICAgIGNoYXJzZXRzdHIgPSBzdHJzdHIgKG51bGxlbnRyeSwgImNoYXJzZXQ9Iik7CisgICAgICBpZiAoY2hhcnNldHN0ciAhPSBOVUxMKQorCXsKKwkgIHNpemVfdCBsZW47CisJICBjaGFyICpjaGFyc2V0OworCSAgY29uc3QgY2hhciAqb3V0Y2hhcnNldDsKKworCSAgY2hhcnNldHN0ciArPSBzdHJsZW4gKCJjaGFyc2V0PSIpOworCSAgbGVuID0gc3RyY3NwbiAoY2hhcnNldHN0ciwgIiBcdFxuIik7CisKKwkgIGNoYXJzZXQgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEpOworIyBpZiBkZWZpbmVkIF9MSUJDIHx8IEhBVkVfTUVNUENQWQorCSAgKigoY2hhciAqKSBtZW1wY3B5IChjaGFyc2V0LCBjaGFyc2V0c3RyLCBsZW4pKSA9ICdcMCc7CisjIGVsc2UKKwkgIG1lbWNweSAoY2hhcnNldCwgY2hhcnNldHN0ciwgbGVuKTsKKwkgIGNoYXJzZXRbbGVuXSA9ICdcMCc7CisjIGVuZGlmCisKKwkgIC8qIFRoZSBvdXRwdXQgY2hhcnNldCBzaG91bGQgbm9ybWFsbHkgYmUgZGV0ZXJtaW5lZCBieSB0aGUKKwkgICAgIGxvY2FsZS4gIEJ1dCBzb21ldGltZXMgdGhlIGxvY2FsZSBpcyBub3QgdXNlZCBvciBub3QgY29ycmVjdGx5CisJICAgICBzZXQgdXAsIHNvIHdlIHByb3ZpZGUgYSBwb3NzaWJpbGl0eSBmb3IgdGhlIHVzZXIgdG8gb3ZlcnJpZGUKKwkgICAgIHRoaXMuICBNb3Jlb3ZlciwgdGhlIHZhbHVlIHNwZWNpZmllZCB0aHJvdWdoCisJICAgICBiaW5kX3RleHRkb21haW5fY29kZXNldCBvdmVycmlkZXMgYm90aC4gICovCisJICBpZiAoZG9tYWluYmluZGluZyAhPSBOVUxMICYmIGRvbWFpbmJpbmRpbmctPmNvZGVzZXQgIT0gTlVMTCkKKwkgICAgb3V0Y2hhcnNldCA9IGRvbWFpbmJpbmRpbmctPmNvZGVzZXQ7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvdXRjaGFyc2V0ID0gZ2V0ZW52ICgiT1VUUFVUX0NIQVJTRVQiKTsKKwkgICAgICBpZiAob3V0Y2hhcnNldCA9PSBOVUxMIHx8IG91dGNoYXJzZXRbMF0gPT0gJ1wwJykKKwkJeworIyBpZmRlZiBfTElCQworCQkgIG91dGNoYXJzZXQgPSBfTkxfQ1VSUkVOVCAoTENfQ1RZUEUsIENPREVTRVQpOworIyBlbHNlCisjICBpZiBIQVZFX0lDT05WCisJCSAgZXh0ZXJuIGNvbnN0IGNoYXIgKmxvY2FsZV9jaGFyc2V0ICh2b2lkKTsKKwkJICBvdXRjaGFyc2V0ID0gbG9jYWxlX2NoYXJzZXQgKCk7CisjICBlbmRpZgorIyBlbmRpZgorCQl9CisJICAgIH0KKworIyBpZmRlZiBfTElCQworCSAgLyogV2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCisJICBvdXRjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAob3V0Y2hhcnNldCwgIlRSQU5TTElUIik7CisJICBjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAoY2hhcnNldCwgTlVMTCk7CisJICBpZiAoX19nY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0LCAmZG9tYWluLT5jb252LAorCQkJICAgIEdDT05WX0FWT0lEX05PQ09OVikKKwkgICAgICAhPSBfX0dDT05WX09LKQorCSAgICBkb21haW4tPmNvbnYgPSAoX19nY29udl90KSAtMTsKKyMgZWxzZQorIyAgaWYgSEFWRV9JQ09OVgorCSAgLyogV2hlbiB1c2luZyBHTlUgbGliYyA+PSAyLjIgb3IgR05VIGxpYmljb252ID49IDEuNSwKKwkgICAgIHdlIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCisjICAgaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKSB8fCBfX0dMSUJDX18gPiAyIFwKKyAgICAgICB8fCBfTElCSUNPTlZfVkVSU0lPTiA+PSAweDAxMDUKKwkgIGlmIChzdHJjaHIgKG91dGNoYXJzZXQsICcvJykgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNoYXIgKnRtcDsKKworCSAgICAgIGxlbiA9IHN0cmxlbiAob3V0Y2hhcnNldCk7CisJICAgICAgdG1wID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxMCArIDEpOworCSAgICAgIG1lbWNweSAodG1wLCBvdXRjaGFyc2V0LCBsZW4pOworCSAgICAgIG1lbWNweSAodG1wICsgbGVuLCAiLy9UUkFOU0xJVCIsIDEwICsgMSk7CisJICAgICAgb3V0Y2hhcnNldCA9IHRtcDsKKworCSAgICAgIGRvbWFpbi0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOworCisJICAgICAgZnJlZWEgKG91dGNoYXJzZXQpOworCSAgICB9CisJICBlbHNlCisjICAgZW5kaWYKKwkgICAgZG9tYWluLT5jb252ID0gaWNvbnZfb3BlbiAob3V0Y2hhcnNldCwgY2hhcnNldCk7CisjICBlbmRpZgorIyBlbmRpZgorCisJICBmcmVlYSAoY2hhcnNldCk7CisJfQorI2VuZGlmIC8qIF9MSUJDIHx8IEhBVkVfSUNPTlYgKi8KKyAgICB9CisKKyAgcmV0dXJuIG51bGxlbnRyeTsKK30KKworLyogRnJlZXMgdGhlIGNvZGVzZXQgZGVwZW5kZW50IHBhcnRzIG9mIGFuIG9wZW5lZCBtZXNzYWdlIGNhdGFsb2cuICAqLwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF9mcmVlX2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluKQoreworICBpZiAoZG9tYWluLT5jb252X3RhYiAhPSBOVUxMICYmIGRvbWFpbi0+Y29udl90YWIgIT0gKGNoYXIgKiopIC0xKQorICAgIGZyZWUgKGRvbWFpbi0+Y29udl90YWIpOworCisjaWZkZWYgX0xJQkMKKyAgaWYgKGRvbWFpbi0+Y29udiAhPSAoX19nY29udl90KSAtMSkKKyAgICBfX2djb252X2Nsb3NlIChkb21haW4tPmNvbnYpOworI2Vsc2UKKyMgaWYgSEFWRV9JQ09OVgorICBpZiAoZG9tYWluLT5jb252ICE9IChpY29udl90KSAtMSkKKyAgICBpY29udl9jbG9zZSAoZG9tYWluLT5jb252KTsKKyMgZW5kaWYKKyNlbmRpZgorfQorCisvKiBMb2FkIHRoZSBtZXNzYWdlIGNhdGFsb2dzIHNwZWNpZmllZCBieSBGSUxFTkFNRS4gIElmIGl0IGlzIG5vIHZhbGlkCisgICBtZXNzYWdlIGNhdGFsb2cgZG8gbm90aGluZy4gICovCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorX25sX2xvYWRfZG9tYWluIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKwkJIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQoreworICBpbnQgZmQ7CisgIHNpemVfdCBzaXplOworI2lmZGVmIF9MSUJDCisgIHN0cnVjdCBzdGF0NjQgc3Q7CisjZWxzZQorICBzdHJ1Y3Qgc3RhdCBzdDsKKyNlbmRpZgorICBzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKmRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xOworICBpbnQgdXNlX21tYXAgPSAwOworICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOworICBpbnQgcmV2aXNpb247CisgIGNvbnN0IGNoYXIgKm51bGxlbnRyeTsKKworICBkb21haW5fZmlsZS0+ZGVjaWRlZCA9IDE7CisgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKKworICAvKiBOb3RlIHRoYXQgaXQgd291bGQgYmUgdXNlbGVzcyB0byBzdG9yZSBkb21haW5iaW5kaW5nIGluIGRvbWFpbl9maWxlCisgICAgIGJlY2F1c2UgZG9tYWluYmluZGluZyBtaWdodCBiZSA9PSBOVUxMIG5vdyBidXQgIT0gTlVMTCBsYXRlciAoYWZ0ZXIKKyAgICAgYSBjYWxsIHRvIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KS4gICovCisKKyAgLyogSWYgdGhlIHJlY29yZCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBsb2NhbGUgdGhlIEZJTEVOQU1FCisgICAgIG1pZ2h0IGJlIE5VTEwuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCisgICAgIHNwZWNpZmljYXRpb24gdGhlIGxvY2FsZSBmaWxlIG5hbWUgaXMgZGlmZmVyZW50IGZvciBYUEcgYW5kIENFTgorICAgICBzeW50YXguICAqLworICBpZiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIFRyeSB0byBvcGVuIHRoZSBhZGRyZXNzZWQgZmlsZS4gICovCisgIGZkID0gb3BlbiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHJldHVybjsKKworICAvKiBXZSBtdXN0IGtub3cgYWJvdXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuICAqLworICBpZiAoCisjaWZkZWYgX0xJQkMKKyAgICAgIF9fYnVpbHRpbl9leHBlY3QgKGZzdGF0NjQgKGZkLCAmc3QpICE9IDAsIDApCisjZWxzZQorICAgICAgX19idWlsdGluX2V4cGVjdCAoZnN0YXQgKGZkLCAmc3QpICE9IDAsIDApCisjZW5kaWYKKyAgICAgIHx8IF9fYnVpbHRpbl9leHBlY3QgKChzaXplID0gKHNpemVfdCkgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSwgMCkKKyAgICAgIHx8IF9fYnVpbHRpbl9leHBlY3QgKHNpemUgPCBzaXplb2YgKHN0cnVjdCBtb19maWxlX2hlYWRlciksIDApKQorICAgIHsKKyAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KKyAgICAgIGNsb3NlIChmZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9NTUFQCisgIC8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gbG9hZCB0aGUgZmlsZS4gIElmIG1tYXAoKSBpcyBhdmFpbGFibGUgd2UgdHJ5CisgICAgIHRoaXMgZmlyc3QuICBJZiBub3QgYXZhaWxhYmxlIG9yIGl0IGZhaWxlZCB3ZSB0cnkgdG8gbG9hZCBpdC4gICovCisgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCwKKwkJCQkJIE1BUF9QUklWQVRFLCBmZCwgMCk7CisKKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSwgMSkpCisgICAgeworICAgICAgLyogbW1hcCgpIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLworICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIHVzZV9tbWFwID0gMTsKKyAgICB9CisjZW5kaWYKKworICAvKiBJZiB0aGUgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSAoaS5lLiBtbWFwJ2VkKSB3ZSB0cnkgdG8gbG9hZAorICAgICBpdCBtYW51YWxseS4gICovCisgIGlmIChkYXRhID09IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCisgICAgeworICAgICAgc2l6ZV90IHRvX3JlYWQ7CisgICAgICBjaGFyICpyZWFkX3B0cjsKKworICAgICAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbWFsbG9jIChzaXplKTsKKyAgICAgIGlmIChkYXRhID09IE5VTEwpCisJcmV0dXJuOworCisgICAgICB0b19yZWFkID0gc2l6ZTsKKyAgICAgIHJlYWRfcHRyID0gKGNoYXIgKikgZGF0YTsKKyAgICAgIGRvCisJeworCSAgbG9uZyBpbnQgbmIgPSAobG9uZyBpbnQpIHJlYWQgKGZkLCByZWFkX3B0ciwgdG9fcmVhZCk7CisJICBpZiAobmIgPD0gMCkKKwkgICAgeworI2lmZGVmIEVJTlRSCisJICAgICAgaWYgKG5iID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQljb250aW51ZTsKKyNlbmRpZgorCSAgICAgIGNsb3NlIChmZCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICByZWFkX3B0ciArPSBuYjsKKwkgIHRvX3JlYWQgLT0gbmI7CisJfQorICAgICAgd2hpbGUgKHRvX3JlYWQgPiAwKTsKKworICAgICAgY2xvc2UgKGZkKTsKKyAgICB9CisKKyAgLyogVXNpbmcgdGhlIG1hZ2ljIG51bWJlciB3ZSBjYW4gdGVzdCB3aGV0aGVyIGl0IHJlYWxseSBpcyBhIG1lc3NhZ2UKKyAgICAgY2F0YWxvZyBmaWxlLiAgKi8KKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCwKKwkJCTApKQorICAgIHsKKyAgICAgIC8qIFRoZSBtYWdpYyBudW1iZXIgaXMgd3Jvbmc6IG5vdCBhIG1lc3NhZ2UgY2F0YWxvZyBmaWxlLiAgKi8KKyNpZmRlZiBIQVZFX01NQVAKKyAgICAgIGlmICh1c2VfbW1hcCkKKwltdW5tYXAgKCh2b2lkICopIGRhdGEsIHNpemUpOworICAgICAgZWxzZQorI2VuZGlmCisJZnJlZSAoZGF0YSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKKyAgaWYgKGRvbWFpbiA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgZG9tYWluX2ZpbGUtPmRhdGEgPSBkb21haW47CisKKyAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKKyAgZG9tYWluLT51c2VfbW1hcCA9IHVzZV9tbWFwOworICBkb21haW4tPm1tYXBfc2l6ZSA9IHNpemU7CisgIGRvbWFpbi0+bXVzdF9zd2FwID0gZGF0YS0+bWFnaWMgIT0gX01BR0lDOworICBkb21haW4tPm1hbGxvY2VkID0gTlVMTDsKKworICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXZhaWxhYmxlIHRhYmxlcy4gICovCisgIHJldmlzaW9uID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKTsKKyAgLyogV2Ugc3VwcG9ydCBvbmx5IHRoZSBtYWpvciByZXZpc2lvbnMgMCBhbmQgMS4gICovCisgIHN3aXRjaCAocmV2aXNpb24gPj4gMTYpCisgICAgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgICBkb21haW4tPm5zdHJpbmdzID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5zdHJpbmdzKTsKKyAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICopCisJKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ190YWJfb2Zmc2V0KSk7CisgICAgICBkb21haW4tPnRyYW5zX3RhYiA9IChjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKKwkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc190YWJfb2Zmc2V0KSk7CisgICAgICBkb21haW4tPmhhc2hfc2l6ZSA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9zaXplKTsKKyAgICAgIGRvbWFpbi0+aGFzaF90YWIgPQorCShkb21haW4tPmhhc2hfc2l6ZSA+IDIKKwkgPyAoY29uc3QgbmxzX3VpbnQzMiAqKQorCSAgICgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpCisJIDogTlVMTCk7CisgICAgICBkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiA9IGRvbWFpbi0+bXVzdF9zd2FwOworCisgICAgICAvKiBOb3cgZGlzcGF0Y2ggb24gdGhlIG1pbm9yIHJldmlzaW9uLiAgKi8KKyAgICAgIHN3aXRjaCAocmV2aXNpb24gJiAweGZmZmYpCisJeworCWNhc2UgMDoKKwkgIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IDA7CisJICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7CisJICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOworCSAgYnJlYWs7CisJY2FzZSAxOgorCWRlZmF1bHQ6CisJICB7CisJICAgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKKworCSAgICBpZiAoZG9tYWluLT5oYXNoX3RhYiA9PSBOVUxMKQorCSAgICAgIC8qIFRoaXMgaXMgaW52YWxpZC4gIFRoZXNlIG1pbm9yIHJldmlzaW9ucyBuZWVkIGEgaGFzaCB0YWJsZS4gICovCisJICAgICAgZ290byBpbnZhbGlkOworCisJICAgIG5fc3lzZGVwX3N0cmluZ3MgPQorCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uX3N5c2RlcF9zdHJpbmdzKTsKKwkgICAgaWYgKG5fc3lzZGVwX3N0cmluZ3MgPiAwKQorCSAgICAgIHsKKwkJbmxzX3VpbnQzMiBuX3N5c2RlcF9zZWdtZW50czsKKwkJY29uc3Qgc3RydWN0IHN5c2RlcF9zZWdtZW50ICpzeXNkZXBfc2VnbWVudHM7CisJCWNvbnN0IGNoYXIgKipzeXNkZXBfc2VnbWVudF92YWx1ZXM7CisJCWNvbnN0IG5sc191aW50MzIgKm9yaWdfc3lzZGVwX3RhYjsKKwkJY29uc3QgbmxzX3VpbnQzMiAqdHJhbnNfc3lzZGVwX3RhYjsKKwkJbmxzX3VpbnQzMiBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOworCQlzaXplX3QgbWVtbmVlZDsKKwkJY2hhciAqbWVtOworCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV9vcmlnX3N5c2RlcF90YWI7CisJCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX3RyYW5zX3N5c2RlcF90YWI7CisJCW5sc191aW50MzIgKmlubWVtX2hhc2hfdGFiOworCQl1bnNpZ25lZCBpbnQgaSwgajsKKworCQkvKiBHZXQgdGhlIHZhbHVlcyBvZiB0aGUgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCisJCW5fc3lzZGVwX3NlZ21lbnRzID0KKwkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bl9zeXNkZXBfc2VnbWVudHMpOworCQlzeXNkZXBfc2VnbWVudHMgPSAoY29uc3Qgc3RydWN0IHN5c2RlcF9zZWdtZW50ICopCisJCSAgKChjaGFyICopIGRhdGEKKwkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+c3lzZGVwX3NlZ21lbnRzX29mZnNldCkpOworCQlzeXNkZXBfc2VnbWVudF92YWx1ZXMgPQorCQkgIGFsbG9jYSAobl9zeXNkZXBfc2VnbWVudHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOworCQlmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc2VnbWVudHM7IGkrKykKKwkJICB7CisJCSAgICBjb25zdCBjaGFyICpuYW1lID0KKwkJICAgICAgKGNoYXIgKikgZGF0YQorCQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc2VnbWVudHNbaV0ub2Zmc2V0KTsKKwkJICAgIG5sc191aW50MzIgbmFtZWxlbiA9CisJCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc2VnbWVudHNbaV0ubGVuZ3RoKTsKKworCQkgICAgaWYgKCEobmFtZWxlbiA+IDAgJiYgbmFtZVtuYW1lbGVuIC0gMV0gPT0gJ1wwJykpCisJCSAgICAgIHsKKwkJCWZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOworCQkJZ290byBpbnZhbGlkOworCQkgICAgICB9CisKKwkJICAgIHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tpXSA9IGdldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAobmFtZSk7CisJCSAgfQorCisJCW9yaWdfc3lzZGVwX3RhYiA9IChjb25zdCBubHNfdWludDMyICopCisJCSAgKChjaGFyICopIGRhdGEKKwkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ19zeXNkZXBfdGFiX29mZnNldCkpOworCQl0cmFuc19zeXNkZXBfdGFiID0gKGNvbnN0IG5sc191aW50MzIgKikKKwkJICAoKGNoYXIgKikgZGF0YQorCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc19zeXNkZXBfdGFiX29mZnNldCkpOworCisJCS8qIENvbXB1dGUgdGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIG1lbW9yeSBuZWVkZWQgZm9yIHRoZQorCQkgICBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgYW5kIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4KKwkJICAgQXQgdGhlIHNhbWUgdGltZSwgYWxzbyBkcm9wIHN0cmluZyBwYWlycyB3aGljaCByZWZlciB0bworCQkgICBhbiB1bmRlZmluZWQgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50LiAgKi8KKwkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncyA9IDA7CisJCW1lbW5lZWQgPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7CisJCWZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zdHJpbmdzOyBpKyspCisJCSAgeworCQkgICAgaW50IHZhbGlkID0gMTsKKwkJICAgIHNpemVfdCBuZWVkc1syXTsKKworCQkgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJICAgICAgeworCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQorCQkJICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKKwkJCSAgKChjaGFyICopIGRhdGEKKwkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJaiA9PSAwCisJCQkJPyBvcmlnX3N5c2RlcF90YWJbaV0KKwkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKKwkJCXNpemVfdCBuZWVkID0gMDsKKwkJCWNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czsKKworCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpICE9IFNFR01FTlRTX0VORCkKKwkJCSAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCisJCQkgICAgeworCQkJICAgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisKKwkJCSAgICAgIG5lZWQgKz0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOworCisJCQkgICAgICBzeXNkZXByZWYgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKKwkJCSAgICAgIGlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQorCQkJCWJyZWFrOworCisJCQkgICAgICBpZiAoc3lzZGVwcmVmID49IG5fc3lzZGVwX3NlZ21lbnRzKQorCQkJCXsKKwkJCQkgIC8qIEludmFsaWQuICAqLworCQkJCSAgZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7CisJCQkJICBnb3RvIGludmFsaWQ7CisJCQkJfQorCisJCQkgICAgICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKKwkJCQl7CisJCQkJICAvKiBUaGlzIHBhcnRpY3VsYXIgc3RyaW5nIHBhaXIgaXMgaW52YWxpZC4gICovCisJCQkJICB2YWxpZCA9IDA7CisJCQkJICBicmVhazsKKwkJCQl9CisKKwkJCSAgICAgIG5lZWQgKz0gc3RybGVuIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSk7CisJCQkgICAgfQorCisJCQluZWVkc1tqXSA9IG5lZWQ7CisJCQlpZiAoIXZhbGlkKQorCQkJICBicmVhazsKKwkJICAgICAgfQorCisJCSAgICBpZiAodmFsaWQpCisJCSAgICAgIHsKKwkJCW5faW5tZW1fc3lzZGVwX3N0cmluZ3MrKzsKKwkJCW1lbW5lZWQgKz0gbmVlZHNbMF0gKyBuZWVkc1sxXTsKKwkJICAgICAgfQorCQkgIH0KKwkJbWVtbmVlZCArPSAyICogbl9pbm1lbV9zeXNkZXBfc3RyaW5ncworCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOworCisJCWlmIChuX2lubWVtX3N5c2RlcF9zdHJpbmdzID4gMCkKKwkJICB7CisJCSAgICB1bnNpZ25lZCBpbnQgazsKKworCQkgICAgLyogQWxsb2NhdGUgYWRkaXRpb25hbCBtZW1vcnkuICAqLworCQkgICAgbWVtID0gKGNoYXIgKikgbWFsbG9jIChtZW1uZWVkKTsKKwkJICAgIGlmIChtZW0gPT0gTlVMTCkKKwkJICAgICAgZ290byBpbnZhbGlkOworCisJCSAgICBkb21haW4tPm1hbGxvY2VkID0gbWVtOworCQkgICAgaW5tZW1fb3JpZ19zeXNkZXBfdGFiID0gKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKikgbWVtOworCQkgICAgbWVtICs9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MKKwkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKKwkJICAgIGlubWVtX3RyYW5zX3N5c2RlcF90YWIgPSAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqKSBtZW07CisJCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncworCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOworCQkgICAgaW5tZW1faGFzaF90YWIgPSAobmxzX3VpbnQzMiAqKSBtZW07CisJCSAgICBtZW0gKz0gZG9tYWluLT5oYXNoX3NpemUgKiBzaXplb2YgKG5sc191aW50MzIpOworCisJCSAgICAvKiBDb21wdXRlIHRoZSBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MuICAqLworCQkgICAgayA9IDA7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQorCQkgICAgICB7CisJCQlpbnQgdmFsaWQgPSAxOworCisJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJICB7CisJCQkgICAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQorCQkJICAgICAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCisJCQkgICAgICAoKGNoYXIgKikgZGF0YQorCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJICAgIGogPT0gMAorCQkJCSAgICA/IG9yaWdfc3lzZGVwX3RhYltpXQorCQkJCSAgICA6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KKwkJCSAgICAgIHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOworCisJCQkgICAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpCisJCQkJIT0gU0VHTUVOVFNfRU5EKQorCQkJICAgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCisJCQkJeworCQkJCSAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisKKwkJCQkgIHN5c2RlcHJlZiA9CisJCQkJICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOworCQkJCSAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCisJCQkJICAgIGJyZWFrOworCisJCQkJICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKKwkJCQkgICAgeworCQkJCSAgICAgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcworCQkJCQkgaW52YWxpZC4gICovCisJCQkJICAgICAgdmFsaWQgPSAwOworCQkJCSAgICAgIGJyZWFrOworCQkJCSAgICB9CisJCQkJfQorCisJCQkgICAgaWYgKCF2YWxpZCkKKwkJCSAgICAgIGJyZWFrOworCQkJICB9CisKKwkJCWlmICh2YWxpZCkKKwkJCSAgeworCQkJICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisJCQkgICAgICB7CisJCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQorCQkJCSAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCisJCQkJICAoKGNoYXIgKikgZGF0YQorCQkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJCWogPT0gMAorCQkJCQk/IG9yaWdfc3lzZGVwX3RhYltpXQorCQkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKKwkJCQljb25zdCBjaGFyICpzdGF0aWNfc2VnbWVudHMgPQorCQkJCSAgKGNoYXIgKikgZGF0YQorCQkJCSAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3N0cmluZy0+b2Zmc2V0KTsKKwkJCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KKwkJCQkgIHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOworCisJCQkJLyogQ29uY2F0ZW5hdGUgdGhlIHNlZ21lbnRzLCBhbmQgZmlsbAorCQkJCSAgIGlubWVtX29yaWdfc3lzZGVwX3RhYltrXSAoZm9yIGogPT0gMCkgYW5kCisJCQkJICAgaW5tZW1fdHJhbnNfc3lzZGVwX3RhYltrXSAoZm9yIGogPT0gMSkuICAqLworCisJCQkJc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqaW5tZW1fdGFiX2VudHJ5ID0KKwkJCQkgIChqID09IDAKKwkJCQkgICA/IGlubWVtX29yaWdfc3lzZGVwX3RhYgorCQkJCSAgIDogaW5tZW1fdHJhbnNfc3lzZGVwX3RhYikKKwkJCQkgICsgazsKKworCQkJCWlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKQorCQkJCSAgICA9PSBTRUdNRU5UU19FTkQpCisJCQkJICB7CisJCQkJICAgIC8qIE9ubHkgb25lIHN0YXRpYyBzZWdtZW50LiAgKi8KKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQorCQkJCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyID0gc3RhdGljX3NlZ21lbnRzOworCQkJCSAgfQorCQkJCWVsc2UKKwkJCQkgIHsKKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyID0gbWVtOworCisJCQkJICAgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQorCQkJCSAgICAgIHsKKwkJCQkJbmxzX3VpbnQzMiBzZWdzaXplID0KKwkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7CisJCQkJCW5sc191aW50MzIgc3lzZGVwcmVmID0KKwkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKKwkJCQkJc2l6ZV90IG47CisKKwkJCQkJaWYgKHNlZ3NpemUgPiAwKQorCQkJCQkgIHsKKwkJCQkJICAgIG1lbWNweSAobWVtLCBzdGF0aWNfc2VnbWVudHMsIHNlZ3NpemUpOworCQkJCQkgICAgbWVtICs9IHNlZ3NpemU7CisJCQkJCSAgICBzdGF0aWNfc2VnbWVudHMgKz0gc2Vnc2l6ZTsKKwkJCQkJICB9CisKKwkJCQkJaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCisJCQkJCSAgYnJlYWs7CisKKwkJCQkJbiA9IHN0cmxlbiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0pOworCQkJCQltZW1jcHkgKG1lbSwgc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0sIG4pOworCQkJCQltZW0gKz0gbjsKKwkJCQkgICAgICB9CisKKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQorCQkJCSAgICAgIG1lbSAtIGlubWVtX3RhYl9lbnRyeS0+cG9pbnRlcjsKKwkJCQkgIH0KKwkJCSAgICAgIH0KKworCQkJICAgIGsrKzsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICBpZiAoayAhPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzKQorCQkgICAgICBhYm9ydCAoKTsKKworCQkgICAgLyogQ29tcHV0ZSB0aGUgYXVnbWVudGVkIGhhc2ggdGFibGUuICAqLworCQkgICAgZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+aGFzaF9zaXplOyBpKyspCisJCSAgICAgIGlubWVtX2hhc2hfdGFiW2ldID0KKwkJCVcgKGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiLCBkb21haW4tPmhhc2hfdGFiW2ldKTsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOyBpKyspCisJCSAgICAgIHsKKwkJCWNvbnN0IGNoYXIgKm1zZ2lkID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiW2ldLnBvaW50ZXI7CisJCQlubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKKwkJCW5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKKwkJCW5sc191aW50MzIgaW5jciA9CisJCQkgIDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7CisKKwkJCWZvciAoOzspCisJCQkgIHsKKwkJCSAgICBpZiAoaW5tZW1faGFzaF90YWJbaWR4XSA9PSAwKQorCQkJICAgICAgeworCQkJCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICBVc2UgaXQuICAqLworCQkJCWlubWVtX2hhc2hfdGFiW2lkeF0gPSAxICsgZG9tYWluLT5uc3RyaW5ncyArIGk7CisJCQkJYnJlYWs7CisJCQkgICAgICB9CisKKwkJCSAgICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKKwkJCSAgICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7CisJCQkgICAgZWxzZQorCQkJICAgICAgaWR4ICs9IGluY3I7CisJCQkgIH0KKwkJICAgICAgfQorCisJCSAgICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOworCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWI7CisJCSAgICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBpbm1lbV90cmFuc19zeXNkZXBfdGFiOworCisJCSAgICBkb21haW4tPmhhc2hfdGFiID0gaW5tZW1faGFzaF90YWI7CisJCSAgICBkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiA9IDA7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKwkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKKwkJICAgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7CisJCSAgfQorCisJCWZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKwkJZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBOVUxMOworCQlkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgcmV2aXNpb24uICAqLworICAgIGludmFsaWQ6CisgICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgLm1vIGZpbGUuICAqLworICAgICAgZnJlZSAoZG9tYWluLT5tYWxsb2NlZCk7CisjaWZkZWYgSEFWRV9NTUFQCisgICAgICBpZiAodXNlX21tYXApCisJbXVubWFwICgodm9pZCAqKSBkYXRhLCBzaXplKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorCWZyZWUgKGRhdGEpOworICAgICAgZnJlZSAoZG9tYWluKTsKKyAgICAgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogTm93IGluaXRpYWxpemUgdGhlIGNoYXJhY3RlciBzZXQgY29udmVydGVyIGZyb20gdGhlIGNoYXJhY3RlciBzZXQKKyAgICAgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoIChmb3VuZCBpbiB0aGUgaGVhZGVyIGVudHJ5KSB0byB0aGUgZG9tYWluJ3MKKyAgICAgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQgb3IgdGhlIGxvY2FsZSdzIGNoYXJhY3RlciBzZXQuICAqLworICBudWxsZW50cnkgPSBfbmxfaW5pdF9kb21haW5fY29udiAoZG9tYWluX2ZpbGUsIGRvbWFpbiwgZG9tYWluYmluZGluZyk7CisKKyAgLyogQWxzbyBsb29rIGZvciBhIHBsdXJhbCBzcGVjaWZpY2F0aW9uLiAgKi8KKyAgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAobnVsbGVudHJ5LCAmZG9tYWluLT5wbHVyYWwsICZkb21haW4tPm5wbHVyYWxzKTsKK30KKworCisjaWZkZWYgX0xJQkMKK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbikKK3sKKyAgaWYgKGRvbWFpbi0+cGx1cmFsICE9ICZfX2dldHRleHRfZ2VybWFuaWNfcGx1cmFsKQorICAgIF9fZ2V0dGV4dF9mcmVlX2V4cCAoZG9tYWluLT5wbHVyYWwpOworCisgIF9ubF9mcmVlX2RvbWFpbl9jb252IChkb21haW4pOworCisgIGZyZWUgKGRvbWFpbi0+bWFsbG9jZWQpOworCisjIGlmZGVmIF9QT1NJWF9NQVBQRURfRklMRVMKKyAgaWYgKGRvbWFpbi0+dXNlX21tYXApCisgICAgbXVubWFwICgodm9pZCAqKSBkb21haW4tPmRhdGEsIGRvbWFpbi0+bW1hcF9zaXplKTsKKyAgZWxzZQorIyBlbmRpZgkvKiBfUE9TSVhfTUFQUEVEX0ZJTEVTICovCisgICAgZnJlZSAoKHZvaWQgKikgZG9tYWluLT5kYXRhKTsKKworICBmcmVlIChkb21haW4pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9jYWxjaGFyc2V0LmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9jYWxjaGFyc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlM2E5YgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2NhbGNoYXJzZXQuYwpAQCAtMCwwICsxLDM5NyBAQAorLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KKworICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2luY2x1ZGUgImxvY2FsY2hhcnNldC5oIgorCisjaWYgSEFWRV9TVERERUZfSAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1NUUklOR19ICisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWYgSEFWRV9TVERMSUJfSAorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KKyMgdW5kZWYgV0lOMzIgICAvKiBhdm9pZCB3YXJuaW5nIG9uIG1pbmd3MzIgKi8KKyMgZGVmaW5lIFdJTjMyCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19FTVhfXworLyogQXNzdW1lIEVNWCBwcm9ncmFtIHJ1bnMgb24gT1MvMiwgZXZlbiBpZiBjb21waWxlZCB1bmRlciBET1MuICAqLworIyBkZWZpbmUgT1MyCisjZW5kaWYKKworI2lmICFkZWZpbmVkIFdJTjMyCisjIGlmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAorIyAgaW5jbHVkZSA8bGFuZ2luZm8uaD4KKyMgZWxzZQorIyAgaWYgSEFWRV9TRVRMT0NBTEUKKyMgICBpbmNsdWRlIDxsb2NhbGUuaD4KKyMgIGVuZGlmCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIFdJTjMyCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQgT1MyCisjIGRlZmluZSBJTkNMX0RPUworIyBpbmNsdWRlIDxvczIuaD4KKyNlbmRpZgorCisjaWYgRU5BQkxFX1JFTE9DQVRBQkxFCisjIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCisjZWxzZQorIyBkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCisgIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCisjZW5kaWYKKworI2lmbmRlZiBESVJFQ1RPUllfU0VQQVJBVE9SCisjIGRlZmluZSBESVJFQ1RPUllfU0VQQVJBVE9SICcvJworI2VuZGlmCisKKyNpZm5kZWYgSVNTTEFTSAorIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09IERJUkVDVE9SWV9TRVBBUkFUT1IpCisjZW5kaWYKKworI2lmIEhBVkVfREVDTF9HRVRDX1VOTE9DS0VECisjIHVuZGVmIGdldGMKKyMgZGVmaW5lIGdldGMgZ2V0Y191bmxvY2tlZAorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgc3RhdGljIHZhcmlhYmxlIGlzIGRlY2xhcmVkICd2b2xhdGlsZScgdG8gYXZvaWQgYQorICAgcG9zc2libGUgbXVsdGl0aHJlYWQgcHJvYmxlbSBpbiB0aGUgZnVuY3Rpb24gZ2V0X2NoYXJzZXRfYWxpYXNlcy4gSWYgd2UKKyAgIGFyZSBydW5uaW5nIGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQsIGFuZCBpZiB0d28gdGhyZWFkcyBpbml0aWFsaXplCisgICAnY2hhcnNldF9hbGlhc2VzJyBzaW11bHRhbmVvdXNseSwgYm90aCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgdmFsdWUsCisgICBhbmQgZXZlcnl0aGluZyB3aWxsIGJlIG9rIGlmIHRoZSB0d28gYXNzaWdubWVudHMgdG8gJ2NoYXJzZXRfYWxpYXNlcycKKyAgIGFyZSBhdG9taWMuIEJ1dCBJIGRvbid0IGtub3cgd2hhdCB3aWxsIGhhcHBlbiBpZiB0aGUgdHdvIGFzc2lnbm1lbnRzIG1peC4gICovCisjaWYgX19TVERDX18gIT0gMQorIyBkZWZpbmUgdm9sYXRpbGUgLyogZW1wdHkgKi8KKyNlbmRpZgorLyogUG9pbnRlciB0byB0aGUgY29udGVudHMgb2YgdGhlIGNoYXJzZXQuYWxpYXMgZmlsZSwgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgorICAgcmVhZCwgZWxzZSBOVUxMLiAgSXRzIGZvcm1hdCBpczoKKyAgIEFMSUFTXzEgJ1wwJyBDQU5PTklDQUxfMSAnXDAnIC4uLiBBTElBU19uICdcMCcgQ0FOT05JQ0FMX24gJ1wwJyAnXDAnICAqLworc3RhdGljIGNvbnN0IGNoYXIgKiB2b2xhdGlsZSBjaGFyc2V0X2FsaWFzZXM7CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X2NoYXJzZXRfYWxpYXNlcyAoKQoreworICBjb25zdCBjaGFyICpjcDsKKworICBjcCA9IGNoYXJzZXRfYWxpYXNlczsKKyAgaWYgKGNwID09IE5VTEwpCisgICAgeworI2lmICEoZGVmaW5lZCBWTVMgfHwgZGVmaW5lZCBXSU4zMikKKyAgICAgIEZJTEUgKmZwOworICAgICAgY29uc3QgY2hhciAqZGlyID0gcmVsb2NhdGUgKExJQkRJUik7CisgICAgICBjb25zdCBjaGFyICpiYXNlID0gImNoYXJzZXQuYWxpYXMiOworICAgICAgY2hhciAqZmlsZV9uYW1lOworCisgICAgICAvKiBDb25jYXRlbmF0ZSBkaXIgYW5kIGJhc2UgaW50byBmcmVzaGx5IGFsbG9jYXRlZCBmaWxlX25hbWUuICAqLworICAgICAgeworCXNpemVfdCBkaXJfbGVuID0gc3RybGVuIChkaXIpOworCXNpemVfdCBiYXNlX2xlbiA9IHN0cmxlbiAoYmFzZSk7CisJaW50IGFkZF9zbGFzaCA9IChkaXJfbGVuID4gMCAmJiAhSVNTTEFTSCAoZGlyW2Rpcl9sZW4gLSAxXSkpOworCWZpbGVfbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlyX2xlbiArIGFkZF9zbGFzaCArIGJhc2VfbGVuICsgMSk7CisJaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQorCSAgeworCSAgICBtZW1jcHkgKGZpbGVfbmFtZSwgZGlyLCBkaXJfbGVuKTsKKwkgICAgaWYgKGFkZF9zbGFzaCkKKwkgICAgICBmaWxlX25hbWVbZGlyX2xlbl0gPSBESVJFQ1RPUllfU0VQQVJBVE9SOworCSAgICBtZW1jcHkgKGZpbGVfbmFtZSArIGRpcl9sZW4gKyBhZGRfc2xhc2gsIGJhc2UsIGJhc2VfbGVuICsgMSk7CisJICB9CisgICAgICB9CisKKyAgICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCB8fCAoZnAgPSBmb3BlbiAoZmlsZV9uYW1lLCAiciIpKSA9PSBOVUxMKQorCS8qIE91dCBvZiBtZW1vcnkgb3IgZmlsZSBub3QgZm91bmQsIHRyZWF0IGl0IGFzIGVtcHR5LiAgKi8KKwljcCA9ICIiOworICAgICAgZWxzZQorCXsKKwkgIC8qIFBhcnNlIHRoZSBmaWxlJ3MgY29udGVudHMuICAqLworCSAgaW50IGM7CisJICBjaGFyIGJ1ZjFbNTArMV07CisJICBjaGFyIGJ1ZjJbNTArMV07CisJICBjaGFyICpyZXNfcHRyID0gTlVMTDsKKwkgIHNpemVfdCByZXNfc2l6ZSA9IDA7CisJICBzaXplX3QgbDEsIGwyOworCisJICBmb3IgKDs7KQorCSAgICB7CisJICAgICAgYyA9IGdldGMgKGZwKTsKKwkgICAgICBpZiAoYyA9PSBFT0YpCisJCWJyZWFrOworCSAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnICcgfHwgYyA9PSAnXHQnKQorCQljb250aW51ZTsKKwkgICAgICBpZiAoYyA9PSAnIycpCisJCXsKKwkJICAvKiBTa2lwIGNvbW1lbnQsIHRvIGVuZCBvZiBsaW5lLiAgKi8KKwkJICBkbworCQkgICAgYyA9IGdldGMgKGZwKTsKKwkJICB3aGlsZSAoIShjID09IEVPRiB8fCBjID09ICdcbicpKTsKKwkJICBpZiAoYyA9PSBFT0YpCisJCSAgICBicmVhazsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIHVuZ2V0YyAoYywgZnApOworCSAgICAgIGlmIChmc2NhbmYgKGZwLCAiJTUwcyAlNTBzIiwgYnVmMSwgYnVmMikgPCAyKQorCQlicmVhazsKKwkgICAgICBsMSA9IHN0cmxlbiAoYnVmMSk7CisJICAgICAgbDIgPSBzdHJsZW4gKGJ1ZjIpOworCSAgICAgIGlmIChyZXNfc2l6ZSA9PSAwKQorCQl7CisJCSAgcmVzX3NpemUgPSBsMSArIDEgKyBsMiArIDE7CisJCSAgcmVzX3B0ciA9IChjaGFyICopIG1hbGxvYyAocmVzX3NpemUgKyAxKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHJlc19zaXplICs9IGwxICsgMSArIGwyICsgMTsKKwkJICByZXNfcHRyID0gKGNoYXIgKikgcmVhbGxvYyAocmVzX3B0ciwgcmVzX3NpemUgKyAxKTsKKwkJfQorCSAgICAgIGlmIChyZXNfcHRyID09IE5VTEwpCisJCXsKKwkJICAvKiBPdXQgb2YgbWVtb3J5LiAqLworCQkgIHJlc19zaXplID0gMDsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIHN0cmNweSAocmVzX3B0ciArIHJlc19zaXplIC0gKGwyICsgMSkgLSAobDEgKyAxKSwgYnVmMSk7CisJICAgICAgc3RyY3B5IChyZXNfcHRyICsgcmVzX3NpemUgLSAobDIgKyAxKSwgYnVmMik7CisJICAgIH0KKwkgIGZjbG9zZSAoZnApOworCSAgaWYgKHJlc19zaXplID09IDApCisJICAgIGNwID0gIiI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqKHJlc19wdHIgKyByZXNfc2l6ZSkgPSAnXDAnOworCSAgICAgIGNwID0gcmVzX3B0cjsKKwkgICAgfQorCX0KKworICAgICAgZnJlZSAoZmlsZV9uYW1lKTsKKworI2Vsc2UKKworIyBpZiBkZWZpbmVkIFZNUworICAgICAgLyogVG8gYXZvaWQgdGhlIHRyb3VibGVzIG9mIGFuIGV4dHJhIGZpbGUgY2hhcnNldC5hbGlhc192bXMgaW4gdGhlCisJIHNvdXJjZXMgb2YgbWFueSBHTlUgcGFja2FnZXMsIHNpbXBseSBpbmxpbmUgdGhlIGFsaWFzZXMgaGVyZS4gICovCisgICAgICAvKiBUaGUgbGlzdCBvZiBlbmNvZGluZ3MgaXMgdGFrZW4gZnJvbSB0aGUgT3BlblZNUyA3LjMtMSBkb2N1bWVudGF0aW9uCisJICJDb21wYXEgQyBSdW4tVGltZSBMaWJyYXJ5IFJlZmVyZW5jZSBNYW51YWwgZm9yIE9wZW5WTVMgc3lzdGVtcyIKKwkgc2VjdGlvbiAxMC43ICJIYW5kbGluZyBEaWZmZXJlbnQgQ2hhcmFjdGVyIFNldHMiLiAgKi8KKyAgICAgIGNwID0gIklTTzg4NTktMSIgIlwwIiAiSVNPLTg4NTktMSIgIlwwIgorCSAgICJJU084ODU5LTIiICJcMCIgIklTTy04ODU5LTIiICJcMCIKKwkgICAiSVNPODg1OS01IiAiXDAiICJJU08tODg1OS01IiAiXDAiCisJICAgIklTTzg4NTktNyIgIlwwIiAiSVNPLTg4NTktNyIgIlwwIgorCSAgICJJU084ODU5LTgiICJcMCIgIklTTy04ODU5LTgiICJcMCIKKwkgICAiSVNPODg1OS05IiAiXDAiICJJU08tODg1OS05IiAiXDAiCisJICAgLyogSmFwYW5lc2UgKi8KKwkgICAiZXVjSlAiICJcMCIgIkVVQy1KUCIgIlwwIgorCSAgICJTSklTIiAiXDAiICJTSElGVF9KSVMiICJcMCIKKwkgICAiREVDS0FOSkkiICJcMCIgIkRFQy1LQU5KSSIgIlwwIgorCSAgICJTREVDS0FOSkkiICJcMCIgIkVVQy1KUCIgIlwwIgorCSAgIC8qIENoaW5lc2UgKi8KKwkgICAiZXVjVFciICJcMCIgIkVVQy1UVyIgIlwwIgorCSAgICJERUNIQU5ZVSIgIlwwIiAiREVDLUhBTllVIiAiXDAiCisJICAgIkRFQ0hBTlpJIiAiXDAiICJHQjIzMTIiICJcMCIKKwkgICAvKiBLb3JlYW4gKi8KKwkgICAiREVDS09SRUFOIiAiXDAiICJFVUMtS1IiICJcMCI7CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBXSU4zMgorICAgICAgLyogVG8gYXZvaWQgdGhlIHRyb3VibGVzIG9mIGluc3RhbGxpbmcgYSBzZXBhcmF0ZSBmaWxlIGluIHRoZSBzYW1lCisJIGRpcmVjdG9yeSBhcyB0aGUgRExMIGFuZCBvZiByZXRyaWV2aW5nIHRoZSBETEwncyBkaXJlY3RvcnkgYXQKKwkgcnVudGltZSwgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KKworICAgICAgY3AgPSAiQ1A5MzYiICJcMCIgIkdCSyIgIlwwIgorCSAgICJDUDEzNjEiICJcMCIgIkpPSEFCIiAiXDAiCisJICAgIkNQMjAxMjciICJcMCIgIkFTQ0lJIiAiXDAiCisJICAgIkNQMjA4NjYiICJcMCIgIktPSTgtUiIgIlwwIgorCSAgICJDUDIxODY2IiAiXDAiICJLT0k4LVJVIiAiXDAiCisJICAgIkNQMjg1OTEiICJcMCIgIklTTy04ODU5LTEiICJcMCIKKwkgICAiQ1AyODU5MiIgIlwwIiAiSVNPLTg4NTktMiIgIlwwIgorCSAgICJDUDI4NTkzIiAiXDAiICJJU08tODg1OS0zIiAiXDAiCisJICAgIkNQMjg1OTQiICJcMCIgIklTTy04ODU5LTQiICJcMCIKKwkgICAiQ1AyODU5NSIgIlwwIiAiSVNPLTg4NTktNSIgIlwwIgorCSAgICJDUDI4NTk2IiAiXDAiICJJU08tODg1OS02IiAiXDAiCisJICAgIkNQMjg1OTciICJcMCIgIklTTy04ODU5LTciICJcMCIKKwkgICAiQ1AyODU5OCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgorCSAgICJDUDI4NTk5IiAiXDAiICJJU08tODg1OS05IiAiXDAiCisJICAgIkNQMjg2MDUiICJcMCIgIklTTy04ODU5LTE1IiAiXDAiOworIyBlbmRpZgorI2VuZGlmCisKKyAgICAgIGNoYXJzZXRfYWxpYXNlcyA9IGNwOworICAgIH0KKworICByZXR1cm4gY3A7Cit9CisKKy8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCBjYW5vbmljYWxpemUgaXQKKyAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgorICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCisgICBJZiB0aGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSByZXN1bHQgaXMgYSBub24tY2Fub25pY2FsCisgICBuYW1lLiAgKi8KKworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZW5kaWYKK2NvbnN0IGNoYXIgKgorbG9jYWxlX2NoYXJzZXQgKCkKK3sKKyAgY29uc3QgY2hhciAqY29kZXNldDsKKyAgY29uc3QgY2hhciAqYWxpYXNlczsKKworI2lmICEoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIE9TMikKKworIyBpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKKworICAvKiBNb3N0IHN5c3RlbXMgc3VwcG9ydCBubF9sYW5naW5mbyAoQ09ERVNFVCkgbm93YWRheXMuICAqLworICBjb2Rlc2V0ID0gbmxfbGFuZ2luZm8gKENPREVTRVQpOworCisjIGVsc2UKKworICAvKiBPbiBvbGQgc3lzdGVtcyB3aGljaCBsYWNrIGl0LCB1c2Ugc2V0bG9jYWxlIG9yIGdldGVudi4gICovCisgIGNvbnN0IGNoYXIgKmxvY2FsZSA9IE5VTEw7CisKKyAgLyogQnV0IG1vc3Qgb2xkIHN5c3RlbXMgZG9uJ3QgaGF2ZSBhIGNvbXBsZXRlIHNldCBvZiBsb2NhbGVzLiAgU29tZQorICAgICAobGlrZSBTdW5PUyA0IG9yIERKR1BQKSBoYXZlIG9ubHkgdGhlIEMgbG9jYWxlLiAgVGhlcmVmb3JlIHdlIGRvbid0CisgICAgIHVzZSBzZXRsb2NhbGUgaGVyZTsgaXQgd291bGQgcmV0dXJuICJDIiB3aGVuIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKKyAgICAgbG9jYWxlIG5hbWUgdGhlIHVzZXIgaGFzIHNldC4gICovCisjICBpZiBIQVZFX1NFVExPQ0FMRSAmJiAwCisgIGxvY2FsZSA9IHNldGxvY2FsZSAoTENfQ1RZUEUsIE5VTEwpOworIyAgZW5kaWYKKyAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOworICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorCXsKKwkgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7CisJICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisJICAgIGxvY2FsZSA9IGdldGVudiAoIkxBTkciKTsKKwl9CisgICAgfQorCisgIC8qIE9uIHNvbWUgb2xkIHN5c3RlbXMsIG9uZSB1c2VkIHRvIHNldCBsb2NhbGUgPSAiaXNvODg1OV8xIi4gT24gb3RoZXJzLAorICAgICB5b3Ugc2V0IGl0IHRvICJsYW5ndWFnZV9DT1VOVFJZLmNoYXJzZXQiLiBJbiBhbnkgY2FzZSwgd2UgcmVzb2x2ZSBpdAorICAgICB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLworICBjb2Rlc2V0ID0gbG9jYWxlOworCisjIGVuZGlmCisKKyNlbGlmIGRlZmluZWQgV0lOMzIKKworICBzdGF0aWMgY2hhciBidWZbMiArIDEwICsgMV07CisKKyAgLyogV29lMzIgaGFzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsb2NhbGUncyBjb2RlcGFnZSBhcyBhIG51bWJlci4gICovCisgIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBHZXRBQ1AgKCkpOworICBjb2Rlc2V0ID0gYnVmOworCisjZWxpZiBkZWZpbmVkIE9TMgorCisgIGNvbnN0IGNoYXIgKmxvY2FsZTsKKyAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOworICBVTE9ORyBjcFszXTsKKyAgVUxPTkcgY3BsZW47CisKKyAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgY29kZXNldCwgYXMgc2V0IGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorICAgICB3aXRoIHN0YW5kYXJkIGxhbmd1YWdlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCisgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisgICAgeworICAgICAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQ1RZUEUiKTsKKyAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKKwlsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7CisgICAgfQorICBpZiAobG9jYWxlICE9IE5VTEwgJiYgbG9jYWxlWzBdICE9ICdcMCcpCisgICAgeworICAgICAgLyogSWYgdGhlIGxvY2FsZSBuYW1lIGNvbnRhaW5zIGFuIGVuY29kaW5nIGFmdGVyIHRoZSBkb3QsIHJldHVybiBpdC4gICovCisgICAgICBjb25zdCBjaGFyICpkb3QgPSBzdHJjaHIgKGxvY2FsZSwgJy4nKTsKKworICAgICAgaWYgKGRvdCAhPSBOVUxMKQorCXsKKwkgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOworCisJICBkb3QrKzsKKwkgIC8qIExvb2sgZm9yIHRoZSBwb3NzaWJsZSBALi4uIHRyYWlsZXIgYW5kIHJlbW92ZSBpdCwgaWYgYW55LiAgKi8KKwkgIG1vZGlmaWVyID0gc3RyY2hyIChkb3QsICdAJyk7CisJICBpZiAobW9kaWZpZXIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGRvdDsKKwkgIGlmIChtb2RpZmllciAtIGRvdCA8IHNpemVvZiAoYnVmKSkKKwkgICAgeworCSAgICAgIG1lbWNweSAoYnVmLCBkb3QsIG1vZGlmaWVyIC0gZG90KTsKKwkgICAgICBidWYgW21vZGlmaWVyIC0gZG90XSA9ICdcMCc7CisJICAgICAgcmV0dXJuIGJ1ZjsKKwkgICAgfQorCX0KKworICAgICAgLyogUmVzb2x2ZSB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLworICAgICAgY29kZXNldCA9IGxvY2FsZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBPUy8yIGhhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbG9jYWxlJ3MgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLworICAgICAgaWYgKERvc1F1ZXJ5Q3AgKHNpemVvZiAoY3ApLCBjcCwgJmNwbGVuKSkKKwljb2Rlc2V0ID0gIiI7CisgICAgICBlbHNlCisJeworCSAgc3ByaW50ZiAoYnVmLCAiQ1AldSIsIGNwWzBdKTsKKwkgIGNvZGVzZXQgPSBidWY7CisJfQorICAgIH0KKworI2VuZGlmCisKKyAgaWYgKGNvZGVzZXQgPT0gTlVMTCkKKyAgICAvKiBUaGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQuICAqLworICAgIGNvZGVzZXQgPSAiIjsKKworICAvKiBSZXNvbHZlIGFsaWFzLiAqLworICBmb3IgKGFsaWFzZXMgPSBnZXRfY2hhcnNldF9hbGlhc2VzICgpOworICAgICAgICphbGlhc2VzICE9ICdcMCc7CisgICAgICAgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSwgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSkKKyAgICBpZiAoc3RyY21wIChjb2Rlc2V0LCBhbGlhc2VzKSA9PSAwCisJfHwgKGFsaWFzZXNbMF0gPT0gJyonICYmIGFsaWFzZXNbMV0gPT0gJ1wwJykpCisgICAgICB7CisJY29kZXNldCA9IGFsaWFzZXMgKyBzdHJsZW4gKGFsaWFzZXMpICsgMTsKKwlicmVhazsKKyAgICAgIH0KKworICAvKiBEb24ndCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLiAgR05VIGxpYmMgYW5kIEdOVSBsaWJpY29udiBpbnRlcnByZXQKKyAgICAgdGhlIGVtcHR5IHN0cmluZyBhcyBkZW5vdGluZyAidGhlIGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZyIsCisgICAgIHRodXMgR05VIGxpYmljb252IHdvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhIHNlY29uZCB0aW1lLiAgKi8KKyAgaWYgKGNvZGVzZXRbMF0gPT0gJ1wwJykKKyAgICBjb2Rlc2V0ID0gIkFTQ0lJIjsKKworICByZXR1cm4gY29kZXNldDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2NhbGNoYXJzZXQuaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2NhbGNoYXJzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEzN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2xvY2FsY2hhcnNldC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIERldGVybWluZSBhIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQ0hBUlNFVCBMaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfTE9DQUxDSEFSU0VUX0gKKyNkZWZpbmUgX0xPQ0FMQ0hBUlNFVF9ICisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCBjYW5vbmljYWxpemUgaXQKKyAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgorICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCisgICBJZiB0aGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSByZXN1bHQgaXMgYSBub24tY2Fub25pY2FsCisgICBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICogbG9jYWxlX2NoYXJzZXQgKHZvaWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9MT0NBTENIQVJTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL2xvY2FsZS5hbGlhcyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2NhbGUuYWxpYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YmIyNQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2NhbGUuYWxpYXMKQEAgLTAsMCArMSw3OCBAQAorIyBMb2NhbGUgbmFtZSBhbGlhcyBkYXRhIGJhc2UuCisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyBVU0EuCisKKyMgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgb2YKKyMgdGhlIFggV2luZG93IFN5c3RlbSwgd2hpY2ggbm9ybWFsbHkgY2FuIGJlIGZvdW5kIGluCisjCS91c3IvbGliL1gxMS9sb2NhbGUvbG9jYWxlLmFsaWFzCisjIEEgc2luZ2xlIGxpbmUgY29udGFpbnMgdHdvIGZpZWxkczogYW4gYWxpYXMgYW5kIGEgc3Vic3RpdHV0aW9uIHZhbHVlLgorIyBBbGwgZW50cmllcyBhcmUgY2FzZSBpbmRlcGVuZGVudC4KKworIyBOb3RlOiBUaGlzIGZpbGUgaXMgZmFyIGZyb20gYmVpbmcgY29tcGxldGUuICBJZiB5b3UgaGF2ZSBhIHZhbHVlIGZvcgorIyB5b3VyIG93biBzaXRlIHdoaWNoIHlvdSB0aGluayBtaWdodCBiZSB1c2VmdWwgZm9yIG90aGVycyB0b28sIHNoYXJlCisjIGl0IHdpdGggdGhlIHJlc3Qgb2YgdXMuICBTZW5kIGl0IHVzaW5nIHRoZSBgZ2xpYmNidWcnIHNjcmlwdCB0bworIyBidWdzQGdudS5vcmcuCisKKyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAKKworYm9rbWFsCQluYl9OTy5JU08tODg1OS0xCitib2tt5WwJCW5iX05PLklTTy04ODU5LTEKK2NhdGFsYW4JCWNhX0VTLklTTy04ODU5LTEKK2Nyb2F0aWFuCWhyX0hSLklTTy04ODU5LTIKK2N6ZWNoCQljc19DWi5JU08tODg1OS0yCitkYW5pc2ggICAgICAgICAgZGFfREsuSVNPLTg4NTktMQorZGFuc2sJCWRhX0RLLklTTy04ODU5LTEKK2RldXRzY2gJCWRlX0RFLklTTy04ODU5LTEKK2R1dGNoCQlubF9OTC5JU08tODg1OS0xCitlZXN0aQkJZXRfRUUuSVNPLTg4NTktMQorZXN0b25pYW4JZXRfRUUuSVNPLTg4NTktMQorZmlubmlzaCAgICAgICAgIGZpX0ZJLklTTy04ODU5LTEKK2ZyYW7nYWlzCWZyX0ZSLklTTy04ODU5LTEKK2ZyZW5jaAkJZnJfRlIuSVNPLTg4NTktMQorZ2FsZWdvCQlnbF9FUy5JU08tODg1OS0xCitnYWxpY2lhbglnbF9FUy5JU08tODg1OS0xCitnZXJtYW4JCWRlX0RFLklTTy04ODU5LTEKK2dyZWVrICAgICAgICAgICBlbF9HUi5JU08tODg1OS03CitoZWJyZXcgICAgICAgICAgaGVfSUwuSVNPLTg4NTktOAoraHJ2YXRza2kJaHJfSFIuSVNPLTg4NTktMgoraHVuZ2FyaWFuICAgICAgIGh1X0hVLklTTy04ODU5LTIKK2ljZWxhbmRpYyAgICAgICBpc19JUy5JU08tODg1OS0xCitpdGFsaWFuICAgICAgICAgaXRfSVQuSVNPLTg4NTktMQoramFwYW5lc2UJamFfSlAuZXVjSlAKK2phcGFuZXNlLmV1YwlqYV9KUC5ldWNKUAoramFfSlAJCWphX0pQLmV1Y0pQCitqYV9KUC51amlzCWphX0pQLmV1Y0pQCitqYXBhbmVzZS5zamlzCWphX0pQLlNKSVMKK2tvcmVhbgkJa29fS1IuZXVjS1IKK2tvcmVhbi5ldWMgCWtvX0tSLmV1Y0tSCitrb19LUgkJa29fS1IuZXVjS1IKK2xpdGh1YW5pYW4gICAgICBsdF9MVC5JU08tODg1OS0xMworbm9fTk8JCW5iX05PLklTTy04ODU5LTEKK25vX05PLklTTy04ODU5LTEgbmJfTk8uSVNPLTg4NTktMQorbm9yd2VnaWFuICAgICAgIG5iX05PLklTTy04ODU5LTEKK255bm9yc2sJCW5uX05PLklTTy04ODU5LTEKK3BvbGlzaCAgICAgICAgICBwbF9QTC5JU08tODg1OS0yCitwb3J0dWd1ZXNlICAgICAgcHRfUFQuSVNPLTg4NTktMQorcm9tYW5pYW4gICAgICAgIHJvX1JPLklTTy04ODU5LTIKK3J1c3NpYW4gICAgICAgICBydV9SVS5JU08tODg1OS01CitzbG92YWsgICAgICAgICAgc2tfU0suSVNPLTg4NTktMgorc2xvdmVuZSAgICAgICAgIHNsX1NJLklTTy04ODU5LTIKK3Nsb3ZlbmlhbiAgICAgICBzbF9TSS5JU08tODg1OS0yCitzcGFuaXNoICAgICAgICAgZXNfRVMuSVNPLTg4NTktMQorc3dlZGlzaCAgICAgICAgIHN2X1NFLklTTy04ODU5LTEKK3RoYWkJCXRoX1RILlRJUy02MjAKK3R1cmtpc2ggICAgICAgICB0cl9UUi5JU08tODg1OS05CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9jYWxlYWxpYXMuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2NhbGVhbGlhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYWY4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9jYWxlYWxpYXMuYwpAQCAtMCwwICsxLDQxNCBAQAorLyogSGFuZGxlIGFsaWFzZXMgZm9yIGxvY2FsZSBuYW1lcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX19fRlNFVExPQ0tJTkcKKyMgaW5jbHVkZSA8c3RkaW9fZXh0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fR05VQ19fCisjIHVuZGVmIGFsbG9jYQorIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYQorY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdldHRleHRQLmgiCisKKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKyMgaW5jbHVkZSAicmVsb2NhdGFibGUuaCIKKyNlbHNlCisjIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworI2lmZGVmIF9MSUJDCisvKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKKyAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKyAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KKyMgZGVmaW5lIHN0cmNhc2VjbXAgX19zdHJjYXNlY21wCisKKyMgaWZuZGVmIG1lbXBjcHkKKyMgIGRlZmluZSBtZW1wY3B5IF9fbWVtcGNweQorIyBlbmRpZgorIyBkZWZpbmUgSEFWRV9NRU1QQ1BZCTEKKyMgZGVmaW5lIEhBVkVfX19GU0VUTE9DS0lORwkxCisKKy8qIFdlIG5lZWQgbG9ja2luZyBoZXJlIHNpbmNlIHdlIGNhbiBiZSBjYWxsZWQgZnJvbSBkaWZmZXJlbnQgcGxhY2VzLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKworX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spOworI2VuZGlmCisKKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisjZW5kaWYKKworLyogU29tZSBvcHRpbWl6YXRpb25zIGZvciBnbGliYy4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEZFT0YoZnApCQlmZW9mX3VubG9ja2VkIChmcCkKKyMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzX3VubG9ja2VkIChidWYsIG4sIGZwKQorI2Vsc2UKKyMgZGVmaW5lIEZFT0YoZnApCQlmZW9mIChmcCkKKyMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzIChidWYsIG4sIGZwKQorI2VuZGlmCisKKy8qIEZvciB0aG9zZSBsb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisgICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworI2lmZGVmIEhBVkVfQUxMT0NBCisjIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCisjZWxzZQorIyBkZWZpbmUgYWxsb2NhKG4pIG1hbGxvYyAobikKKyMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UIHx8IEhBVkVfREVDTF9GR0VUU19VTkxPQ0tFRAorIyB1bmRlZiBmZ2V0cworIyBkZWZpbmUgZmdldHMoYnVmLCBsZW4sIHMpIGZnZXRzX3VubG9ja2VkIChidWYsIGxlbiwgcykKKyNlbmRpZgorI2lmIGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UIHx8IEhBVkVfREVDTF9GRU9GX1VOTE9DS0VECisjIHVuZGVmIGZlb2YKKyMgZGVmaW5lIGZlb2YocykgZmVvZl91bmxvY2tlZCAocykKKyNlbmRpZgorCisKK3N0cnVjdCBhbGlhc19tYXAKK3sKKyAgY29uc3QgY2hhciAqYWxpYXM7CisgIGNvbnN0IGNoYXIgKnZhbHVlOworfTsKKworCisjaWZuZGVmIF9MSUJDCisjIGRlZmluZSBsaWJjX2ZyZWVyZXNfcHRyKGRlY2wpIGRlY2wKKyNlbmRpZgorCitsaWJjX2ZyZWVyZXNfcHRyIChzdGF0aWMgY2hhciAqc3RyaW5nX3NwYWNlKTsKK3N0YXRpYyBzaXplX3Qgc3RyaW5nX3NwYWNlX2FjdDsKK3N0YXRpYyBzaXplX3Qgc3RyaW5nX3NwYWNlX21heDsKK2xpYmNfZnJlZXJlc19wdHIgKHN0YXRpYyBzdHJ1Y3QgYWxpYXNfbWFwICptYXApOworc3RhdGljIHNpemVfdCBubWFwOworc3RhdGljIHNpemVfdCBtYXhtYXA7CisKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitzdGF0aWMgaW50IGV4dGVuZF9hbGlhc190YWJsZSAodm9pZCk7CitzdGF0aWMgaW50IGFsaWFzX2NvbXBhcmUgKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCisJCQkgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpOworCisKK2NvbnN0IGNoYXIgKgorX25sX2V4cGFuZF9hbGlhcyAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmxvY2FsZV9hbGlhc19wYXRoOworICBzdHJ1Y3QgYWxpYXNfbWFwICpyZXR2YWw7CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIHNpemVfdCBhZGRlZDsKKworI2lmZGVmIF9MSUJDCisgIF9fbGliY19sb2NrX2xvY2sgKGxvY2spOworI2VuZGlmCisKKyAgaWYgKGxvY2FsZV9hbGlhc19wYXRoID09IE5VTEwpCisgICAgbG9jYWxlX2FsaWFzX3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKKworICBkbworICAgIHsKKyAgICAgIHN0cnVjdCBhbGlhc19tYXAgaXRlbTsKKworICAgICAgaXRlbS5hbGlhcyA9IG5hbWU7CisKKyAgICAgIGlmIChubWFwID4gMCkKKwlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAorCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKKwkJCQkJICAgICAgIChpbnQgKCopIChjb25zdCB2b2lkICosCisJCQkJCQkJIGNvbnN0IHZvaWQgKikKKwkJCQkJCSkgYWxpYXNfY29tcGFyZSk7CisgICAgICBlbHNlCisJcmV0dmFsID0gTlVMTDsKKworICAgICAgLyogV2UgcmVhbGx5IGZvdW5kIGFuIGFsaWFzLiAgUmV0dXJuIHRoZSB2YWx1ZS4gICovCisgICAgICBpZiAocmV0dmFsICE9IE5VTEwpCisJeworCSAgcmVzdWx0ID0gcmV0dmFsLT52YWx1ZTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogUGVyaGFwcyB3ZSBjYW4gZmluZCBhbm90aGVyIGFsaWFzIGZpbGUuICAqLworICAgICAgYWRkZWQgPSAwOworICAgICAgd2hpbGUgKGFkZGVkID09IDAgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJykKKwl7CisJICBjb25zdCBjaGFyICpzdGFydDsKKworCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdID09IFBBVEhfU0VQQVJBVE9SKQorCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOworCSAgc3RhcnQgPSBsb2NhbGVfYWxpYXNfcGF0aDsKKworCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcKKwkJICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9IFBBVEhfU0VQQVJBVE9SKQorCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOworCisJICBpZiAoc3RhcnQgPCBsb2NhbGVfYWxpYXNfcGF0aCkKKwkgICAgYWRkZWQgPSByZWFkX2FsaWFzX2ZpbGUgKHN0YXJ0LCBsb2NhbGVfYWxpYXNfcGF0aCAtIHN0YXJ0KTsKKwl9CisgICAgfQorICB3aGlsZSAoYWRkZWQgIT0gMCk7CisKKyNpZmRlZiBfTElCQworICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgc2l6ZV90CitpbnRlcm5hbF9mdW5jdGlvbgorcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKK3sKKyAgRklMRSAqZnA7CisgIGNoYXIgKmZ1bGxfZm5hbWU7CisgIHNpemVfdCBhZGRlZDsKKyAgc3RhdGljIGNvbnN0IGNoYXIgYWxpYXNmaWxlW10gPSAiL2xvY2FsZS5hbGlhcyI7CisKKyAgZnVsbF9mbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZm5hbWVfbGVuICsgc2l6ZW9mIGFsaWFzZmlsZSk7CisjaWZkZWYgSEFWRV9NRU1QQ1BZCisgIG1lbXBjcHkgKG1lbXBjcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pLAorCSAgIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7CisjZWxzZQorICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOworICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7CisjZW5kaWYKKworICBmcCA9IGZvcGVuIChyZWxvY2F0ZSAoZnVsbF9mbmFtZSksICJyIik7CisgIGZyZWVhIChmdWxsX2ZuYW1lKTsKKyAgaWYgKGZwID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyNpZmRlZiBIQVZFX19fRlNFVExPQ0tJTkcKKyAgLyogTm8gdGhyZWFkcyBwcmVzZW50LiAgKi8KKyAgX19mc2V0bG9ja2luZyAoZnAsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKyNlbmRpZgorCisgIGFkZGVkID0gMDsKKyAgd2hpbGUgKCFGRU9GIChmcCkpCisgICAgeworICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCisJIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKKwkgYikgdGhlc2UgZmllbGRzIG11c3QgYmUgdXNhYmxlIGFzIGZpbGUgbmFtZXMgYW5kIHNvIG11c3Qgbm90CisJICAgIGJlIHRoYXQgbG9uZworCSBXZSBhdm9pZCBhIG11bHRpLWtpbG9ieXRlIGJ1ZmZlciBoZXJlIHNpbmNlIHRoaXMgd291bGQgdXNlIHVwCisJIHN0YWNrIHNwYWNlIHdoaWNoIHdlIG1pZ2h0IG5vdCBoYXZlIGlmIHRoZSBwcm9ncmFtIHJhbiBvdXQgb2YKKwkgbWVtb3J5LiAgKi8KKyAgICAgIGNoYXIgYnVmWzQwMF07CisgICAgICBjaGFyICphbGlhczsKKyAgICAgIGNoYXIgKnZhbHVlOworICAgICAgY2hhciAqY3A7CisKKyAgICAgIGlmIChGR0VUUyAoYnVmLCBzaXplb2YgYnVmLCBmcCkgPT0gTlVMTCkKKwkvKiBFT0YgcmVhY2hlZC4gICovCisJYnJlYWs7CisKKyAgICAgIGNwID0gYnVmOworICAgICAgLyogSWdub3JlIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCisJKytjcDsKKworICAgICAgLyogQSBsZWFkaW5nICcjJyBzaWduYWxzIGEgY29tbWVudCBsaW5lLiAgKi8KKyAgICAgIGlmIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcjJykKKwl7CisJICBhbGlhcyA9IGNwKys7CisJICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKKwkgICAgKytjcDsKKwkgIC8qIFRlcm1pbmF0ZSBhbGlhcyBuYW1lLiAgKi8KKwkgIGlmIChjcFswXSAhPSAnXDAnKQorCSAgICAqY3ArKyA9ICdcMCc7CisKKwkgIC8qIE5vdyBsb29rIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2YWx1ZS4gICovCisJICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKKwkgICAgKytjcDsKKworCSAgaWYgKGNwWzBdICE9ICdcMCcpCisJICAgIHsKKwkgICAgICBzaXplX3QgYWxpYXNfbGVuOworCSAgICAgIHNpemVfdCB2YWx1ZV9sZW47CisKKwkgICAgICB2YWx1ZSA9IGNwKys7CisJICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCisJCSsrY3A7CisJICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KKwkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKKwkJeworCQkgIC8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRlc3QKKwkJICAgICBmb3IgdGhlIGVuZCBvZiBsaW5lIHBvc3NpYmxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yCisJCSAgICAgdGhlIHRlcm1pbmF0aW5nICdcbicgd2hpY2ggZG8gbm90IG92ZXJ3cml0ZSBoZXJlLiAgKi8KKwkJICAqY3ArKyA9ICdcMCc7CisJCSAgKmNwID0gJ1xuJzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGNwWzBdICE9ICdcMCcpCisJCSpjcCsrID0gJ1wwJzsKKworCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKKwkJaWYgKF9fYnVpbHRpbl9leHBlY3QgKGV4dGVuZF9hbGlhc190YWJsZSAoKSwgMCkpCisJCSAgcmV0dXJuIGFkZGVkOworCisJICAgICAgYWxpYXNfbGVuID0gc3RybGVuIChhbGlhcykgKyAxOworCSAgICAgIHZhbHVlX2xlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKKworCSAgICAgIGlmIChzdHJpbmdfc3BhY2VfYWN0ICsgYWxpYXNfbGVuICsgdmFsdWVfbGVuID4gc3RyaW5nX3NwYWNlX21heCkKKwkJeworCQkgIC8qIEluY3JlYXNlIHNpemUgb2YgbWVtb3J5IHBvb2wuICAqLworCQkgIHNpemVfdCBuZXdfc2l6ZSA9IChzdHJpbmdfc3BhY2VfbWF4CisJCQkJICAgICArIChhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiAxMDI0CisJCQkJCT8gYWxpYXNfbGVuICsgdmFsdWVfbGVuIDogMTAyNCkpOworCQkgIGNoYXIgKm5ld19wb29sID0gKGNoYXIgKikgcmVhbGxvYyAoc3RyaW5nX3NwYWNlLCBuZXdfc2l6ZSk7CisJCSAgaWYgKG5ld19wb29sID09IE5VTEwpCisJCSAgICByZXR1cm4gYWRkZWQ7CisKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAoc3RyaW5nX3NwYWNlICE9IG5ld19wb29sLCAwKSkKKwkJICAgIHsKKwkJICAgICAgc2l6ZV90IGk7CisKKwkJICAgICAgZm9yIChpID0gMDsgaSA8IG5tYXA7IGkrKykKKwkJCXsKKwkJCSAgbWFwW2ldLmFsaWFzICs9IG5ld19wb29sIC0gc3RyaW5nX3NwYWNlOworCQkJICBtYXBbaV0udmFsdWUgKz0gbmV3X3Bvb2wgLSBzdHJpbmdfc3BhY2U7CisJCQl9CisJCSAgICB9CisKKwkJICBzdHJpbmdfc3BhY2UgPSBuZXdfcG9vbDsKKwkJICBzdHJpbmdfc3BhY2VfbWF4ID0gbmV3X3NpemU7CisJCX0KKworCSAgICAgIG1hcFtubWFwXS5hbGlhcyA9IG1lbWNweSAoJnN0cmluZ19zcGFjZVtzdHJpbmdfc3BhY2VfYWN0XSwKKwkJCQkJYWxpYXMsIGFsaWFzX2xlbik7CisJICAgICAgc3RyaW5nX3NwYWNlX2FjdCArPSBhbGlhc19sZW47CisKKwkgICAgICBtYXBbbm1hcF0udmFsdWUgPSBtZW1jcHkgKCZzdHJpbmdfc3BhY2Vbc3RyaW5nX3NwYWNlX2FjdF0sCisJCQkJCXZhbHVlLCB2YWx1ZV9sZW4pOworCSAgICAgIHN0cmluZ19zcGFjZV9hY3QgKz0gdmFsdWVfbGVuOworCisJICAgICAgKytubWFwOworCSAgICAgICsrYWRkZWQ7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFBvc3NpYmx5IG5vdCB0aGUgd2hvbGUgbGluZSBmaXRzIGludG8gdGhlIGJ1ZmZlci4gIElnbm9yZQorCSB0aGUgcmVzdCBvZiB0aGUgbGluZS4gICovCisgICAgICB3aGlsZSAoc3RyY2hyIChidWYsICdcbicpID09IE5VTEwpCisJaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQorCSAgLyogTWFrZSBzdXJlIHRoZSBpbm5lciBsb29wIHdpbGwgYmUgbGVmdC4gIFRoZSBvdXRlciBsb29wCisJICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KKwkgIGJyZWFrOworICAgIH0KKworICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCisgICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KKyAgZmNsb3NlIChmcCk7CisKKyAgaWYgKGFkZGVkID4gMCkKKyAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAorCSAgIChpbnQgKCopIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIGFsaWFzX2NvbXBhcmUpOworCisgIHJldHVybiBhZGRlZDsKK30KKworCitzdGF0aWMgaW50CitleHRlbmRfYWxpYXNfdGFibGUgKCkKK3sKKyAgc2l6ZV90IG5ld19zaXplOworICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOworCisgIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOworICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgcmVhbGxvYyAobWFwLCAobmV3X3NpemUKKwkJCQkJCSogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSkpOworICBpZiAobmV3X21hcCA9PSBOVUxMKQorICAgIC8qIFNpbXBseSBkb24ndCBleHRlbmQ6IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29yZS4gICovCisgICAgcmV0dXJuIC0xOworCisgIG1hcCA9IG5ld19tYXA7CisgIG1heG1hcCA9IG5ld19zaXplOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CithbGlhc19jb21wYXJlIChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLCBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKQoreworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKKyAgcmV0dXJuIHN0cmNhc2VjbXAgKG1hcDEtPmFsaWFzLCBtYXAyLT5hbGlhcyk7CisjZWxzZQorICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDEtPmFsaWFzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDItPmFsaWFzOworICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKworICBpZiAocDEgPT0gcDIpCisgICAgcmV0dXJuIDA7CisKKyAgZG8KKyAgICB7CisgICAgICAvKiBJIGtub3cgdGhpcyBzZWVtcyB0byBiZSBvZGQgYnV0IHRoZSB0b2xvd2VyKCkgZnVuY3Rpb24gaW4KKwkgc29tZSBzeXN0ZW1zIGxpYmMgY2Fubm90IGhhbmRsZSBub25hbHBoYSBjaGFyYWN0ZXJzLiAgKi8KKyAgICAgIGMxID0gaXN1cHBlciAoKnAxKSA/IHRvbG93ZXIgKCpwMSkgOiAqcDE7CisgICAgICBjMiA9IGlzdXBwZXIgKCpwMikgPyB0b2xvd2VyICgqcDIpIDogKnAyOworICAgICAgaWYgKGMxID09ICdcMCcpCisJYnJlYWs7CisgICAgICArK3AxOworICAgICAgKytwMjsKKyAgICB9CisgIHdoaWxlIChjMSA9PSBjMik7CisKKyAgcmV0dXJuIGMxIC0gYzI7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2NhbGVuYW1lLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9jYWxlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjJlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9jYWxlbmFtZS5jCkBAIC0wLDAgKzEsMTE0MiBAQAorLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNlbGVjdGVkIGxvY2FsZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5vcmc+LCAxOTk1LiAgKi8KKy8qIFdpbjMyIGNvZGUgd3JpdHRlbiBieSBUb3IgTGlsbHF2aXN0IDx0bWxAaWtpLmZpPi4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisjIHVuZGVmIFdJTjMyICAgLyogYXZvaWQgd2FybmluZyBvbiBtaW5ndzMyICovCisjIGRlZmluZSBXSU4zMgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisvKiBMaXN0IG9mIGxhbmd1YWdlIGNvZGVzLCBzb3J0ZWQgYnkgdmFsdWU6CisgICAweDAxIExBTkdfQVJBQklDCisgICAweDAyIExBTkdfQlVMR0FSSUFOCisgICAweDAzIExBTkdfQ0FUQUxBTgorICAgMHgwNCBMQU5HX0NISU5FU0UKKyAgIDB4MDUgTEFOR19DWkVDSAorICAgMHgwNiBMQU5HX0RBTklTSAorICAgMHgwNyBMQU5HX0dFUk1BTgorICAgMHgwOCBMQU5HX0dSRUVLCisgICAweDA5IExBTkdfRU5HTElTSAorICAgMHgwYSBMQU5HX1NQQU5JU0gKKyAgIDB4MGIgTEFOR19GSU5OSVNICisgICAweDBjIExBTkdfRlJFTkNICisgICAweDBkIExBTkdfSEVCUkVXCisgICAweDBlIExBTkdfSFVOR0FSSUFOCisgICAweDBmIExBTkdfSUNFTEFORElDCisgICAweDEwIExBTkdfSVRBTElBTgorICAgMHgxMSBMQU5HX0pBUEFORVNFCisgICAweDEyIExBTkdfS09SRUFOCisgICAweDEzIExBTkdfRFVUQ0gKKyAgIDB4MTQgTEFOR19OT1JXRUdJQU4KKyAgIDB4MTUgTEFOR19QT0xJU0gKKyAgIDB4MTYgTEFOR19QT1JUVUdVRVNFCisgICAweDE3IExBTkdfUkhBRVRPX1JPTUFOQ0UKKyAgIDB4MTggTEFOR19ST01BTklBTgorICAgMHgxOSBMQU5HX1JVU1NJQU4KKyAgIDB4MWEgTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KKyAgIDB4MWIgTEFOR19TTE9WQUsKKyAgIDB4MWMgTEFOR19BTEJBTklBTgorICAgMHgxZCBMQU5HX1NXRURJU0gKKyAgIDB4MWUgTEFOR19USEFJCisgICAweDFmIExBTkdfVFVSS0lTSAorICAgMHgyMCBMQU5HX1VSRFUKKyAgIDB4MjEgTEFOR19JTkRPTkVTSUFOCisgICAweDIyIExBTkdfVUtSQUlOSUFOCisgICAweDIzIExBTkdfQkVMQVJVU0lBTgorICAgMHgyNCBMQU5HX1NMT1ZFTklBTgorICAgMHgyNSBMQU5HX0VTVE9OSUFOCisgICAweDI2IExBTkdfTEFUVklBTgorICAgMHgyNyBMQU5HX0xJVEhVQU5JQU4KKyAgIDB4MjggTEFOR19UQUpJSworICAgMHgyOSBMQU5HX0ZBUlNJCisgICAweDJhIExBTkdfVklFVE5BTUVTRQorICAgMHgyYiBMQU5HX0FSTUVOSUFOCisgICAweDJjIExBTkdfQVpFUkkKKyAgIDB4MmQgTEFOR19CQVNRVUUKKyAgIDB4MmUgTEFOR19TT1JCSUFOCisgICAweDJmIExBTkdfTUFDRURPTklBTgorICAgMHgzMCBMQU5HX1NVVFUKKyAgIDB4MzEgTEFOR19UU09OR0EKKyAgIDB4MzIgTEFOR19UU1dBTkEKKyAgIDB4MzMgTEFOR19WRU5EQQorICAgMHgzNCBMQU5HX1hIT1NBCisgICAweDM1IExBTkdfWlVMVQorICAgMHgzNiBMQU5HX0FGUklLQUFOUworICAgMHgzNyBMQU5HX0dFT1JHSUFOCisgICAweDM4IExBTkdfRkFFUk9FU0UKKyAgIDB4MzkgTEFOR19ISU5ESQorICAgMHgzYSBMQU5HX01BTFRFU0UKKyAgIDB4M2IgTEFOR19TQUFNSQorICAgMHgzYyBMQU5HX0dBRUxJQworICAgMHgzZCBMQU5HX1lJRERJU0gKKyAgIDB4M2UgTEFOR19NQUxBWQorICAgMHgzZiBMQU5HX0tBWkFLCisgICAweDQwIExBTkdfS1lSR1laCisgICAweDQxIExBTkdfU1dBSElMSQorICAgMHg0MiBMQU5HX1RVUktNRU4KKyAgIDB4NDMgTEFOR19VWkJFSworICAgMHg0NCBMQU5HX1RBVEFSCisgICAweDQ1IExBTkdfQkVOR0FMSQorICAgMHg0NiBMQU5HX1BVTkpBQkkKKyAgIDB4NDcgTEFOR19HVUpBUkFUSQorICAgMHg0OCBMQU5HX09SSVlBCisgICAweDQ5IExBTkdfVEFNSUwKKyAgIDB4NGEgTEFOR19URUxVR1UKKyAgIDB4NGIgTEFOR19LQU5OQURBCisgICAweDRjIExBTkdfTUFMQVlBTEFNCisgICAweDRkIExBTkdfQVNTQU1FU0UKKyAgIDB4NGUgTEFOR19NQVJBVEhJCisgICAweDRmIExBTkdfU0FOU0tSSVQKKyAgIDB4NTAgTEFOR19NT05HT0xJQU4KKyAgIDB4NTEgTEFOR19USUJFVEFOCisgICAweDUyIExBTkdfV0VMU0gKKyAgIDB4NTMgTEFOR19DQU1CT0RJQU4KKyAgIDB4NTQgTEFOR19MQU8KKyAgIDB4NTUgTEFOR19CVVJNRVNFCisgICAweDU2IExBTkdfR0FMSUNJQU4KKyAgIDB4NTcgTEFOR19LT05LQU5JCisgICAweDU4IExBTkdfTUFOSVBVUkkKKyAgIDB4NTkgTEFOR19TSU5ESEkKKyAgIDB4NWEgTEFOR19TWVJJQUMKKyAgIDB4NWIgTEFOR19TSU5IQUxFU0UKKyAgIDB4NWMgTEFOR19DSEVST0tFRQorICAgMHg1ZCBMQU5HX0lOVUtUSVRVVAorICAgMHg1ZSBMQU5HX0FNSEFSSUMKKyAgIDB4NWYgTEFOR19UQU1BWklHSFQKKyAgIDB4NjAgTEFOR19LQVNITUlSSQorICAgMHg2MSBMQU5HX05FUEFMSQorICAgMHg2MiBMQU5HX0ZSSVNJQU4KKyAgIDB4NjMgTEFOR19QQVNIVE8KKyAgIDB4NjQgTEFOR19UQUdBTE9HCisgICAweDY1IExBTkdfRElWRUhJCisgICAweDY2IExBTkdfRURPCisgICAweDY3IExBTkdfRlVMRlVMREUKKyAgIDB4NjggTEFOR19IQVVTQQorICAgMHg2OSBMQU5HX0lCSUJJTworICAgMHg2YSBMQU5HX1lPUlVCQQorICAgMHg3MCBMQU5HX0lHQk8KKyAgIDB4NzEgTEFOR19LQU5VUkkKKyAgIDB4NzIgTEFOR19PUk9NTworICAgMHg3MyBMQU5HX1RJR1JJTllBCisgICAweDc0IExBTkdfR1VBUkFOSQorICAgMHg3NSBMQU5HX0hBV0FJSUFOCisgICAweDc2IExBTkdfTEFUSU4KKyAgIDB4NzcgTEFOR19TT01BTEkKKyAgIDB4NzggTEFOR19ZSQorICAgMHg3OSBMQU5HX1BBUElBTUVOVFUKKyovCisvKiBNaW5ndyBoZWFkZXJzIGRvbid0IGhhdmUgbGF0ZXN0IGxhbmd1YWdlIGFuZCBzdWJsYW5ndWFnZSBjb2Rlcy4gICovCisjIGlmbmRlZiBMQU5HX0FGUklLQUFOUworIyBkZWZpbmUgTEFOR19BRlJJS0FBTlMgMHgzNgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19BTEJBTklBTgorIyBkZWZpbmUgTEFOR19BTEJBTklBTiAweDFjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FNSEFSSUMKKyMgZGVmaW5lIExBTkdfQU1IQVJJQyAweDVlCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FSQUJJQworIyBkZWZpbmUgTEFOR19BUkFCSUMgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19BUk1FTklBTgorIyBkZWZpbmUgTEFOR19BUk1FTklBTiAweDJiCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FTU0FNRVNFCisjIGRlZmluZSBMQU5HX0FTU0FNRVNFIDB4NGQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQVpFUkkKKyMgZGVmaW5lIExBTkdfQVpFUkkgMHgyYworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CQVNRVUUKKyMgZGVmaW5lIExBTkdfQkFTUVVFIDB4MmQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQkVMQVJVU0lBTgorIyBkZWZpbmUgTEFOR19CRUxBUlVTSUFOIDB4MjMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQkVOR0FMSQorIyBkZWZpbmUgTEFOR19CRU5HQUxJIDB4NDUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQlVSTUVTRQorIyBkZWZpbmUgTEFOR19CVVJNRVNFIDB4NTUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQ0FNQk9ESUFOCisjIGRlZmluZSBMQU5HX0NBTUJPRElBTiAweDUzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0NBVEFMQU4KKyMgZGVmaW5lIExBTkdfQ0FUQUxBTiAweDAzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0NIRVJPS0VFCisjIGRlZmluZSBMQU5HX0NIRVJPS0VFIDB4NWMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRElWRUhJCisjIGRlZmluZSBMQU5HX0RJVkVISSAweDY1CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0VETworIyBkZWZpbmUgTEFOR19FRE8gMHg2NgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19FU1RPTklBTgorIyBkZWZpbmUgTEFOR19FU1RPTklBTiAweDI1CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0ZBRVJPRVNFCisjIGRlZmluZSBMQU5HX0ZBRVJPRVNFIDB4MzgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRkFSU0kKKyMgZGVmaW5lIExBTkdfRkFSU0kgMHgyOQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19GUklTSUFOCisjIGRlZmluZSBMQU5HX0ZSSVNJQU4gMHg2MgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19GVUxGVUxERQorIyBkZWZpbmUgTEFOR19GVUxGVUxERSAweDY3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0dBRUxJQworIyBkZWZpbmUgTEFOR19HQUVMSUMgMHgzYworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19HQUxJQ0lBTgorIyBkZWZpbmUgTEFOR19HQUxJQ0lBTiAweDU2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0dFT1JHSUFOCisjIGRlZmluZSBMQU5HX0dFT1JHSUFOIDB4MzcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR1VBUkFOSQorIyBkZWZpbmUgTEFOR19HVUFSQU5JIDB4NzQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR1VKQVJBVEkKKyMgZGVmaW5lIExBTkdfR1VKQVJBVEkgMHg0NworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19IQVVTQQorIyBkZWZpbmUgTEFOR19IQVVTQSAweDY4CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0hBV0FJSUFOCisjIGRlZmluZSBMQU5HX0hBV0FJSUFOIDB4NzUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSEVCUkVXCisjIGRlZmluZSBMQU5HX0hFQlJFVyAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0hJTkRJCisjIGRlZmluZSBMQU5HX0hJTkRJIDB4MzkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSUJJQklPCisjIGRlZmluZSBMQU5HX0lCSUJJTyAweDY5CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0lHQk8KKyMgZGVmaW5lIExBTkdfSUdCTyAweDcwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0lORE9ORVNJQU4KKyMgZGVmaW5lIExBTkdfSU5ET05FU0lBTiAweDIxCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0lOVUtUSVRVVAorIyBkZWZpbmUgTEFOR19JTlVLVElUVVQgMHg1ZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQU5OQURBCisjIGRlZmluZSBMQU5HX0tBTk5BREEgMHg0YgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQU5VUkkKKyMgZGVmaW5lIExBTkdfS0FOVVJJIDB4NzEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfS0FTSE1JUkkKKyMgZGVmaW5lIExBTkdfS0FTSE1JUkkgMHg2MAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQVpBSworIyBkZWZpbmUgTEFOR19LQVpBSyAweDNmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tPTktBTkkKKyMgZGVmaW5lIExBTkdfS09OS0FOSSAweDU3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tZUkdZWgorIyBkZWZpbmUgTEFOR19LWVJHWVogMHg0MAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MQU8KKyMgZGVmaW5lIExBTkdfTEFPIDB4NTQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTEFUSU4KKyMgZGVmaW5lIExBTkdfTEFUSU4gMHg3NgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MQVRWSUFOCisjIGRlZmluZSBMQU5HX0xBVFZJQU4gMHgyNgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MSVRIVUFOSUFOCisjIGRlZmluZSBMQU5HX0xJVEhVQU5JQU4gMHgyNworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQUNFRE9OSUFOCisjIGRlZmluZSBMQU5HX01BQ0VET05JQU4gMHgyZgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQUxBWQorIyBkZWZpbmUgTEFOR19NQUxBWSAweDNlCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTEFZQUxBTQorIyBkZWZpbmUgTEFOR19NQUxBWUFMQU0gMHg0YworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQUxURVNFCisjIGRlZmluZSBMQU5HX01BTFRFU0UgMHgzYQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQU5JUFVSSQorIyBkZWZpbmUgTEFOR19NQU5JUFVSSSAweDU4CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BUkFUSEkKKyMgZGVmaW5lIExBTkdfTUFSQVRISSAweDRlCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01PTkdPTElBTgorIyBkZWZpbmUgTEFOR19NT05HT0xJQU4gMHg1MAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ORVBBTEkKKyMgZGVmaW5lIExBTkdfTkVQQUxJIDB4NjEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfT1JJWUEKKyMgZGVmaW5lIExBTkdfT1JJWUEgMHg0OAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19PUk9NTworIyBkZWZpbmUgTEFOR19PUk9NTyAweDcyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1BBUElBTUVOVFUKKyMgZGVmaW5lIExBTkdfUEFQSUFNRU5UVSAweDc5CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1BBU0hUTworIyBkZWZpbmUgTEFOR19QQVNIVE8gMHg2MworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19QVU5KQUJJCisjIGRlZmluZSBMQU5HX1BVTkpBQkkgMHg0NgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19SSEFFVE9fUk9NQU5DRQorIyBkZWZpbmUgTEFOR19SSEFFVE9fUk9NQU5DRSAweDE3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NBQU1JCisjIGRlZmluZSBMQU5HX1NBQU1JIDB4M2IKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0FOU0tSSVQKKyMgZGVmaW5lIExBTkdfU0FOU0tSSVQgMHg0ZgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TRVJCSUFOCisjIGRlZmluZSBMQU5HX1NFUkJJQU4gMHgxYQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TSU5ESEkKKyMgZGVmaW5lIExBTkdfU0lOREhJIDB4NTkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0lOSEFMRVNFCisjIGRlZmluZSBMQU5HX1NJTkhBTEVTRSAweDViCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NMT1ZBSworIyBkZWZpbmUgTEFOR19TTE9WQUsgMHgxYgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TT01BTEkKKyMgZGVmaW5lIExBTkdfU09NQUxJIDB4NzcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU09SQklBTgorIyBkZWZpbmUgTEFOR19TT1JCSUFOIDB4MmUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU1VUVQorIyBkZWZpbmUgTEFOR19TVVRVIDB4MzAKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU1dBSElMSQorIyBkZWZpbmUgTEFOR19TV0FISUxJIDB4NDEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU1lSSUFDCisjIGRlZmluZSBMQU5HX1NZUklBQyAweDVhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RBR0FMT0cKKyMgZGVmaW5lIExBTkdfVEFHQUxPRyAweDY0CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RBSklLCisjIGRlZmluZSBMQU5HX1RBSklLIDB4MjgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFNQVpJR0hUCisjIGRlZmluZSBMQU5HX1RBTUFaSUdIVCAweDVmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RBTUlMCisjIGRlZmluZSBMQU5HX1RBTUlMIDB4NDkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFUQVIKKyMgZGVmaW5lIExBTkdfVEFUQVIgMHg0NAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19URUxVR1UKKyMgZGVmaW5lIExBTkdfVEVMVUdVIDB4NGEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEhBSQorIyBkZWZpbmUgTEFOR19USEFJIDB4MWUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVElCRVRBTgorIyBkZWZpbmUgTEFOR19USUJFVEFOIDB4NTEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVElHUklOWUEKKyMgZGVmaW5lIExBTkdfVElHUklOWUEgMHg3MworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UU09OR0EKKyMgZGVmaW5lIExBTkdfVFNPTkdBIDB4MzEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVFNXQU5BCisjIGRlZmluZSBMQU5HX1RTV0FOQSAweDMyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RVUktNRU4KKyMgZGVmaW5lIExBTkdfVFVSS01FTiAweDQyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1VLUkFJTklBTgorIyBkZWZpbmUgTEFOR19VS1JBSU5JQU4gMHgyMgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19VUkRVCisjIGRlZmluZSBMQU5HX1VSRFUgMHgyMAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19VWkJFSworIyBkZWZpbmUgTEFOR19VWkJFSyAweDQzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1ZFTkRBCisjIGRlZmluZSBMQU5HX1ZFTkRBIDB4MzMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVklFVE5BTUVTRQorIyBkZWZpbmUgTEFOR19WSUVUTkFNRVNFIDB4MmEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfV0VMU0gKKyMgZGVmaW5lIExBTkdfV0VMU0ggMHg1MgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19YSE9TQQorIyBkZWZpbmUgTEFOR19YSE9TQSAweDM0CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1lJCisjIGRlZmluZSBMQU5HX1lJIDB4NzgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWUlERElTSAorIyBkZWZpbmUgTEFOR19ZSURESVNIIDB4M2QKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWU9SVUJBCisjIGRlZmluZSBMQU5HX1lPUlVCQSAweDZhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1pVTFUKKyMgZGVmaW5lIExBTkdfWlVMVSAweDM1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQSAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19JUkFRCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19JUkFRIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0VHWVBUCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19FR1lQVCAweDAzCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19MSUJZQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTElCWUEgMHgwNAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQUxHRVJJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfQUxHRVJJQSAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPIDB4MDYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1RVTklTSUEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1RVTklTSUEgMHgwNworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfT01BTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfT01BTiAweDA4CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19ZRU1FTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfWUVNRU4gMHgwOQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfU1lSSUEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1NZUklBIDB4MGEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0pPUkRBTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfSk9SREFOIDB4MGIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xFQkFOT04KKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0xFQkFOT04gMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfS1VXQUlUCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19LVVdBSVQgMHgwZAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVUFFCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19VQUUgMHgwZQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQkFIUkFJTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfQkFIUkFJTiAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19RQVRBUgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfUUFUQVIgMHgxMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BWkVSSV9MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19BWkVSSV9MQVRJTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0NZUklMTElDCisjIGRlZmluZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19CRU5HQUxJX0lORElBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNICisjIGRlZmluZSBTVUJMQU5HX0JFTkdBTElfQkFOR0xBREVTSCAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0NISU5FU0VfTUFDQVUKKyMgZGVmaW5lIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVSAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU09VVEhfQUZSSUNBCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfU09VVEhfQUZSSUNBIDB4MDcKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSAweDA4CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOIDB4MDkKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFECisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQgMHgwYgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0UgMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVMgMHgwZAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQSAweDBlCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkcKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9IT05HS09ORyAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9JTkRJQSAweDEwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUEKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQSAweDExCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFIDB4MTIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkcKKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkcgMHgwNQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTU9OQUNPCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NT05BQ08gMHgwNgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUworIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUyAweDA3CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9SRVVOSU9OCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9SRVVOSU9OIDB4MDgKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPTkdPCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DT05HTyAweDA5CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMIDB4MGEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DQU1FUk9PTiAweDBiCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRQorIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfQ09URURJVk9JUkUgMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTUFMSQorIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTUFMSSAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT1JPQ0NPCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NT1JPQ0NPIDB4MGUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0hBSVRJCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9IQUlUSSAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHCisjIGRlZmluZSBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHIDB4MDQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU4KKyMgZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU4gMHgwNQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19LQVNITUlSSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19LQVNITUlSSV9JTkRJQSAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX01BTEFZX01BTEFZU0lBCisjIGRlZmluZSBTVUJMQU5HX01BTEFZX01BTEFZU0lBIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0KKyMgZGVmaW5lIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0gMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19ORVBBTElfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfTkVQQUxJX0lORElBIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19QVU5KQUJJX0lORElBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTgorIyBkZWZpbmUgU1VCTEFOR19QVU5KQUJJX1BBS0lTVEFOIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQQorIyBkZWZpbmUgU1VCTEFOR19ST01BTklBTl9ST01BTklBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fTU9MRE9WQQorIyBkZWZpbmUgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19TRVJCSUFOX0xBVElOIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQworIyBkZWZpbmUgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDIDB4MDMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX1NJTkRISV9JTkRJQSAweDAwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTgorIyBkZWZpbmUgU1VCTEFOR19TSU5ESElfUEFLSVNUQU4gMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSAweDA0CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0EgMHgwNQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BBTkFNQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBTkFNQSAweDA2CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDIDB4MDcKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEEKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEEgMHgwOAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEgMHgwOQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BFUlUKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QRVJVIDB4MGEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEgMHgwYgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SIDB4MGMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DSElMRQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NISUxFIDB4MGQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWSAweDBlCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEgMHgxMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IgMHgxMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVMgMHgxMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQSAweDEzCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08KKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTyAweDE0CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NXRURJU0hfRklOTEFORAorIyBkZWZpbmUgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfQVJBQklDCisjIGRlZmluZSBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUMgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfTEFUSU4KKyMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0xBVElOIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEKKyMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBCisjIGRlZmluZSBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19VUkRVX1BBS0lTVEFOCisjIGRlZmluZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU4gMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19VUkRVX0lORElBCisjIGRlZmluZSBTVUJMQU5HX1VSRFVfSU5ESUEgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19VWkJFS19MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19VWkJFS19MQVRJTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0NZUklMTElDCisjIGRlZmluZSBTVUJMQU5HX1VaQkVLX0NZUklMTElDIDB4MDIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiAnc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgorICAgIkRpcmVjdHMgJ3NldGxvY2FsZSgpJyB0byBxdWVyeSAnY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKKyAgICBzZXR0aW5nIG9mICdsb2NhbCcuIgorICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBOZWl0aGVyIGRvIFNVU1YyIGFuZAorICAgSVNPIEMgOTkuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkIHN5c3RlbXMgKGUuZy4KKyAgIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDIHx8IChkZWZpbmVkIF9fR05VX0xJQlJBUllfXyAmJiBfX0dOVV9MSUJSQVJZX18gPj0gMikKKyMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKKyNlbmRpZgorCisvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgbmFtZSwgYW5kIGNhbm9uaWNhbGl6ZSBpdCBpbnRvIFhQRyBzeW50YXgKKyAgICAgbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0KKyAgIFRoZSBjb2Rlc2V0IHBhcnQgaW4gdGhlIHJlc3VsdCBpcyBub3QgcmVsaWFibGU7IHRoZSBsb2NhbGVfY2hhcnNldCgpCisgICBzaG91bGQgYmUgdXNlZCBmb3IgY29kZXNldCBpbmZvcm1hdGlvbiBpbnN0ZWFkLgorICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuICAqLworCitjb25zdCBjaGFyICoKK19ubF9sb2NhbGVfbmFtZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCit7CisgIGNvbnN0IGNoYXIgKnJldHZhbDsKKworI2lmbmRlZiBXSU4zMgorCisgIC8qIFVzZSB0aGUgUE9TSVggbWV0aG9kcyBvZiBsb29raW5nIHRvICdMQ19BTEwnLCAnTENfeHh4JywgYW5kICdMQU5HJy4KKyAgICAgT24gc29tZSBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlICdzZXRsb2NhbGUnIGZ1bmN0aW9uIGl0c2VsZi4gICovCisjIGlmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAorICByZXR2YWwgPSBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKTsKKyMgZWxzZQorICAvKiBTZXR0aW5nIG9mIExDX0FMTCBvdmVyd3JpdGVzIGFsbCBvdGhlci4gICovCisgIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAocmV0dmFsID09IE5VTEwgfHwgcmV0dmFsWzBdID09ICdcMCcpCisgICAgeworICAgICAgLyogTmV4dCBjb21lcyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjYXRlZ29yeS4gICovCisgICAgICByZXR2YWwgPSBnZXRlbnYgKGNhdGVnb3J5bmFtZSk7CisgICAgICBpZiAocmV0dmFsID09IE5VTEwgfHwgcmV0dmFsWzBdID09ICdcMCcpCisJeworCSAgLyogTGFzdCBwb3NzaWJpbGl0eSBpcyB0aGUgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCisJICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7CisJICBpZiAocmV0dmFsID09IE5VTEwgfHwgcmV0dmFsWzBdID09ICdcMCcpCisJICAgIC8qIFdlIHVzZSBDIGFzIHRoZSBkZWZhdWx0IGRvbWFpbi4gIFBPU0lYIHNheXMgdGhpcyBpcworCSAgICAgICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgKi8KKwkgICAgcmV0dmFsID0gIkMiOworCX0KKyAgICB9CisjIGVuZGlmCisKKyAgcmV0dXJuIHJldHZhbDsKKworI2Vsc2UgLyogV0lOMzIgKi8KKworICAvKiBSZXR1cm4gYW4gWFBHIHN0eWxlIGxvY2FsZSBuYW1lIGxhbmd1YWdlW190ZXJyaXRvcnldW0Btb2RpZmllcl0uCisgICAgIERvbid0IGV2ZW4gYm90aGVyIGRldGVybWluaW5nIHRoZSBjb2Rlc2V0OyBpdCdzIG5vdCB1c2VmdWwgaW4gdGhpcworICAgICBjb250ZXh0LCBiZWNhdXNlIG1lc3NhZ2UgY2F0YWxvZ3MgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHNpbmdsZQorICAgICBjb2Rlc2V0LiAgKi8KKworICBMQ0lEIGxjaWQ7CisgIExBTkdJRCBsYW5naWQ7CisgIGludCBwcmltYXJ5LCBzdWI7CisKKyAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBzeXN0ZW0gc2V0dGluZ3MgdGhyb3VnaCBlbnZpcm9ubWVudAorICAgICB2YXJpYWJsZXMsIGFzIG9uIFBPU0lYIHN5c3RlbXMuICAqLworICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorICAgIHJldHVybiByZXR2YWw7CisgIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorICAgIHJldHVybiByZXR2YWw7CisgIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorICAgIHJldHVybiByZXR2YWw7CisKKyAgLyogVXNlIG5hdGl2ZSBXaW4zMiBBUEkgbG9jYWxlIElELiAgKi8KKyAgbGNpZCA9IEdldFRocmVhZExvY2FsZSAoKTsKKworICAvKiBTdHJpcCBvZmYgdGhlIHNvcnRpbmcgcnVsZXMsIGtlZXAgb25seSB0aGUgbGFuZ3VhZ2UgcGFydC4gICovCisgIGxhbmdpZCA9IExBTkdJREZST01MQ0lEIChsY2lkKTsKKworICAvKiBTcGxpdCBpbnRvIGxhbmd1YWdlIGFuZCB0ZXJyaXRvcnkgcGFydC4gICovCisgIHByaW1hcnkgPSBQUklNQVJZTEFOR0lEIChsYW5naWQpOworICBzdWIgPSBTVUJMQU5HSUQgKGxhbmdpZCk7CisKKyAgLyogRGlzcGF0Y2ggb24gbGFuZ3VhZ2UuCisgICAgIFNlZSBhbHNvIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9vbmxpbmVkYXQvbGFuZ3VhZ2VzLmh0bWwgLgorICAgICBGb3IgZGV0YWlscyBhYm91dCBsYW5ndWFnZXMsIHNlZSBodHRwOi8vd3d3LmV0aG5vbG9ndWUuY29tLyAuICAqLworICBzd2l0Y2ggKHByaW1hcnkpCisgICAgeworICAgIGNhc2UgTEFOR19BRlJJS0FBTlM6IHJldHVybiAiYWZfWkEiOworICAgIGNhc2UgTEFOR19BTEJBTklBTjogcmV0dXJuICJzcV9BTCI7CisgICAgY2FzZSBMQU5HX0FNSEFSSUM6IHJldHVybiAiYW1fRVQiOworICAgIGNhc2UgTEFOR19BUkFCSUM6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUE6IHJldHVybiAiYXJfU0EiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfSVJBUTogcmV0dXJuICJhcl9JUSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19FR1lQVDogcmV0dXJuICJhcl9FRyI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19MSUJZQTogcmV0dXJuICJhcl9MWSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19BTEdFUklBOiByZXR1cm4gImFyX0RaIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX01PUk9DQ086IHJldHVybiAiYXJfTUEiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfVFVOSVNJQTogcmV0dXJuICJhcl9UTiI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19PTUFOOiByZXR1cm4gImFyX09NIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1lFTUVOOiByZXR1cm4gImFyX1lFIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1NZUklBOiByZXR1cm4gImFyX1NZIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0pPUkRBTjogcmV0dXJuICJhcl9KTyI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OOiByZXR1cm4gImFyX0xCIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0tVV0FJVDogcmV0dXJuICJhcl9LVyI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19VQUU6IHJldHVybiAiYXJfQUUiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfQkFIUkFJTjogcmV0dXJuICJhcl9CSCI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19RQVRBUjogcmV0dXJuICJhcl9RQSI7CisJfQorICAgICAgcmV0dXJuICJhciI7CisgICAgY2FzZSBMQU5HX0FSTUVOSUFOOiByZXR1cm4gImh5X0FNIjsKKyAgICBjYXNlIExBTkdfQVNTQU1FU0U6IHJldHVybiAiYXNfSU4iOworICAgIGNhc2UgTEFOR19BWkVSSToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwkvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBBemVyYmFpamFuaSBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKwljYXNlIFNVQkxBTkdfQVpFUklfTEFUSU46IHJldHVybiAiYXpfQVpAbGF0aW4iOworCWNhc2UgU1VCTEFOR19BWkVSSV9DWVJJTExJQzogcmV0dXJuICJhel9BWkBjeXJpbGxpYyI7CisJfQorICAgICAgcmV0dXJuICJheiI7CisgICAgY2FzZSBMQU5HX0JBU1FVRToKKyAgICAgIHJldHVybiAiZXUiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJldV9FUyIgb3IgImV1X0ZSIi4gICovCisgICAgY2FzZSBMQU5HX0JFTEFSVVNJQU46IHJldHVybiAiYmVfQlkiOworICAgIGNhc2UgTEFOR19CRU5HQUxJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19CRU5HQUxJX0lORElBOiByZXR1cm4gImJuX0lOIjsKKwljYXNlIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIOiByZXR1cm4gImJuX0JEIjsKKwl9CisgICAgICByZXR1cm4gImJuIjsKKyAgICBjYXNlIExBTkdfQlVMR0FSSUFOOiByZXR1cm4gImJnX0JHIjsKKyAgICBjYXNlIExBTkdfQlVSTUVTRTogcmV0dXJuICJteV9NTSI7CisgICAgY2FzZSBMQU5HX0NBTUJPRElBTjogcmV0dXJuICJrbV9LSCI7CisgICAgY2FzZSBMQU5HX0NBVEFMQU46IHJldHVybiAiY2FfRVMiOworICAgIGNhc2UgTEFOR19DSEVST0tFRTogcmV0dXJuICJjaHJfVVMiOworICAgIGNhc2UgTEFOR19DSElORVNFOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19DSElORVNFX1RSQURJVElPTkFMOiByZXR1cm4gInpoX1RXIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU1QTElGSUVEOiByZXR1cm4gInpoX0NOIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9IT05HS09ORzogcmV0dXJuICJ6aF9ISyI7CisJY2FzZSBTVUJMQU5HX0NISU5FU0VfU0lOR0FQT1JFOiByZXR1cm4gInpoX1NHIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVTogcmV0dXJuICJ6aF9NTyI7CisJfQorICAgICAgcmV0dXJuICJ6aCI7CisgICAgY2FzZSBMQU5HX0NST0FUSUFOOgkJLyogTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KKwkJCQkgKiBXaGF0IHVzZWQgdG8gYmUgY2FsbGVkIFNlcmJvLUNyb2F0aWFuCisJCQkJICogc2hvdWxkIHJlYWxseSBub3cgYmUgdHdvIHNlcGFyYXRlCisJCQkJICogbGFuZ3VhZ2VzIGJlY2F1c2Ugb2YgcG9saXRpY2FsIHJlYXNvbnMuCisJCQkJICogKFNheXMgdG1sLCB3aG8ga25vd3Mgbm90aGluZyBhYm91dCBTZXJiaWFuCisJCQkJICogb3IgQ3JvYXRpYW4uKQorCQkJCSAqIChJIGNhbiBmZWVsIHRob3NlIGZsYW1lcyBjb21pbmcgYWxyZWFkeS4pCisJCQkJICovCisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAiaHJfSFIiOworCWNhc2UgU1VCTEFOR19TRVJCSUFOX0xBVElOOiByZXR1cm4gInNyX0NTIjsKKwljYXNlIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQzogcmV0dXJuICJzcl9DU0BjeXJpbGxpYyI7CisJfQorICAgICAgcmV0dXJuICJociI7CisgICAgY2FzZSBMQU5HX0NaRUNIOiByZXR1cm4gImNzX0NaIjsKKyAgICBjYXNlIExBTkdfREFOSVNIOiByZXR1cm4gImRhX0RLIjsKKyAgICBjYXNlIExBTkdfRElWRUhJOiByZXR1cm4gImR2X01WIjsKKyAgICBjYXNlIExBTkdfRFVUQ0g6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RVVENIOiByZXR1cm4gIm5sX05MIjsKKwljYXNlIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTjogLyogRkxFTUlTSCwgVkxBQU1TICovIHJldHVybiAibmxfQkUiOworCX0KKyAgICAgIHJldHVybiAibmwiOworICAgIGNhc2UgTEFOR19FRE86IHJldHVybiAiYmluX05HIjsKKyAgICBjYXNlIExBTkdfRU5HTElTSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwkvKiBTVUJMQU5HX0VOR0xJU0hfVVMgPT0gU1VCTEFOR19ERUZBVUxULiBIZWguIEkgdGhvdWdodAorCSAqIEVuZ2xpc2ggd2FzIHRoZSBsYW5ndWFnZSBzcG9rZW4gaW4gRW5nbGFuZC4KKwkgKiBPaCB3ZWxsLgorCSAqLworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1VTOiByZXR1cm4gImVuX1VTIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9VSzogcmV0dXJuICJlbl9HQiI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQVVTOiByZXR1cm4gImVuX0FVIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9DQU46IHJldHVybiAiZW5fQ0EiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX05aOiByZXR1cm4gImVuX05aIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9FSVJFOiByZXR1cm4gImVuX0lFIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0E6IHJldHVybiAiZW5fWkEiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0E6IHJldHVybiAiZW5fSk0iOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0NBUklCQkVBTjogcmV0dXJuICJlbl9HRCI7IC8qIEdyZW5hZGE/ICovCisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFOiByZXR1cm4gImVuX0JaIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRDogcmV0dXJuICJlbl9UVCI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0U6IHJldHVybiAiZW5fWlciOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTOiByZXR1cm4gImVuX1BIIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9JTkRPTkVTSUE6IHJldHVybiAiZW5fSUQiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HOiByZXR1cm4gImVuX0hLIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9JTkRJQTogcmV0dXJuICJlbl9JTiI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUE6IHJldHVybiAiZW5fTVkiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1NJTkdBUE9SRTogcmV0dXJuICJlbl9TRyI7CisJfQorICAgICAgcmV0dXJuICJlbiI7CisgICAgY2FzZSBMQU5HX0VTVE9OSUFOOiByZXR1cm4gImV0X0VFIjsKKyAgICBjYXNlIExBTkdfRkFFUk9FU0U6IHJldHVybiAiZm9fRk8iOworICAgIGNhc2UgTEFOR19GQVJTSTogcmV0dXJuICJmYV9JUiI7CisgICAgY2FzZSBMQU5HX0ZJTk5JU0g6IHJldHVybiAiZmlfRkkiOworICAgIGNhc2UgTEFOR19GUkVOQ0g6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSDogcmV0dXJuICJmcl9GUiI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOOiAvKiBXQUxMT09OICovIHJldHVybiAiZnJfQkUiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfQ0FOQURJQU46IHJldHVybiAiZnJfQ0EiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfU1dJU1M6IHJldHVybiAiZnJfQ0giOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRzogcmV0dXJuICJmcl9MVSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9NT05BQ086IHJldHVybiAiZnJfTUMiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUzogcmV0dXJuICJmciI7IC8qIENhcmliYmVhbj8gKi8KKwljYXNlIFNVQkxBTkdfRlJFTkNIX1JFVU5JT046IHJldHVybiAiZnJfUkUiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfQ09OR086IHJldHVybiAiZnJfQ0ciOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfU0VORUdBTDogcmV0dXJuICJmcl9TTiI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU1FUk9PTjogcmV0dXJuICJmcl9DTSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRTogcmV0dXJuICJmcl9DSSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9NQUxJOiByZXR1cm4gImZyX01MIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX01PUk9DQ086IHJldHVybiAiZnJfTUEiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfSEFJVEk6IHJldHVybiAiZnJfSFQiOworCX0KKyAgICAgIHJldHVybiAiZnIiOworICAgIGNhc2UgTEFOR19GUklTSUFOOiByZXR1cm4gImZ5X05MIjsKKyAgICBjYXNlIExBTkdfRlVMRlVMREU6CisgICAgICAvKiBTcG9rZW4gaW4gTmlnZXJpYSwgR3VpbmVhLCBTZW5lZ2FsLCBNYWxpLCBOaWdlciwgQ2FtZXJvb24sIEJlbmluLiAqLworICAgICAgcmV0dXJuICJmZl9ORyI7CisgICAgY2FzZSBMQU5HX0dBRUxJQzoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIDB4MDE6IC8qIFNDT1RUSVNIICovIHJldHVybiAiZ2RfR0IiOworCWNhc2UgMHgwMjogLyogSVJJU0ggKi8gcmV0dXJuICJnYV9JRSI7CisJfQorICAgICAgcmV0dXJuICJDIjsKKyAgICBjYXNlIExBTkdfR0FMSUNJQU46IHJldHVybiAiZ2xfRVMiOworICAgIGNhc2UgTEFOR19HRU9SR0lBTjogcmV0dXJuICJrYV9HRSI7CisgICAgY2FzZSBMQU5HX0dFUk1BTjoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfR0VSTUFOOiByZXR1cm4gImRlX0RFIjsKKwljYXNlIFNVQkxBTkdfR0VSTUFOX1NXSVNTOiByZXR1cm4gImRlX0NIIjsKKwljYXNlIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOOiByZXR1cm4gImRlX0FUIjsKKwljYXNlIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkc6IHJldHVybiAiZGVfTFUiOworCWNhc2UgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTjogcmV0dXJuICJkZV9MSSI7CisJfQorICAgICAgcmV0dXJuICJkZSI7CisgICAgY2FzZSBMQU5HX0dSRUVLOiByZXR1cm4gImVsX0dSIjsKKyAgICBjYXNlIExBTkdfR1VBUkFOSTogcmV0dXJuICJnbl9QWSI7CisgICAgY2FzZSBMQU5HX0dVSkFSQVRJOiByZXR1cm4gImd1X0lOIjsKKyAgICBjYXNlIExBTkdfSEFVU0E6IHJldHVybiAiaGFfTkciOworICAgIGNhc2UgTEFOR19IQVdBSUlBTjoKKyAgICAgIC8qIEZJWE1FOiBEbyB0aGV5IG1lYW4gSGF3YWlpYW4gKCJoYXdfVVMiLCAxMDAwIHNwZWFrZXJzKQorCSBvciBIYXdhaWkgQ3Jlb2xlIEVuZ2xpc2ggKCJjcGVfVVMiLCA2MDAwMDAgc3BlYWtlcnMpPyAgKi8KKyAgICAgIHJldHVybiAiY3BlX1VTIjsKKyAgICBjYXNlIExBTkdfSEVCUkVXOiByZXR1cm4gImhlX0lMIjsKKyAgICBjYXNlIExBTkdfSElOREk6IHJldHVybiAiaGlfSU4iOworICAgIGNhc2UgTEFOR19IVU5HQVJJQU46IHJldHVybiAiaHVfSFUiOworICAgIGNhc2UgTEFOR19JQklCSU86IHJldHVybiAibmljX05HIjsKKyAgICBjYXNlIExBTkdfSUNFTEFORElDOiByZXR1cm4gImlzX0lTIjsKKyAgICBjYXNlIExBTkdfSUdCTzogcmV0dXJuICJpZ19ORyI7CisgICAgY2FzZSBMQU5HX0lORE9ORVNJQU46IHJldHVybiAiaWRfSUQiOworICAgIGNhc2UgTEFOR19JTlVLVElUVVQ6IHJldHVybiAiaXVfQ0EiOworICAgIGNhc2UgTEFOR19JVEFMSUFOOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19JVEFMSUFOOiByZXR1cm4gIml0X0lUIjsKKwljYXNlIFNVQkxBTkdfSVRBTElBTl9TV0lTUzogcmV0dXJuICJpdF9DSCI7CisJfQorICAgICAgcmV0dXJuICJpdCI7CisgICAgY2FzZSBMQU5HX0pBUEFORVNFOiByZXR1cm4gImphX0pQIjsKKyAgICBjYXNlIExBTkdfS0FOTkFEQTogcmV0dXJuICJrbl9JTiI7CisgICAgY2FzZSBMQU5HX0tBTlVSSTogcmV0dXJuICJrcl9ORyI7CisgICAgY2FzZSBMQU5HX0tBU0hNSVJJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gImtzX1BLIjsKKwljYXNlIFNVQkxBTkdfS0FTSE1JUklfSU5ESUE6IHJldHVybiAia3NfSU4iOworCX0KKyAgICAgIHJldHVybiAia3MiOworICAgIGNhc2UgTEFOR19LQVpBSzogcmV0dXJuICJra19LWiI7CisgICAgY2FzZSBMQU5HX0tPTktBTkk6CisgICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworICAgICAgcmV0dXJuICJrb2tfSU4iOworICAgIGNhc2UgTEFOR19LT1JFQU46IHJldHVybiAia29fS1IiOworICAgIGNhc2UgTEFOR19LWVJHWVo6IHJldHVybiAia3lfS0ciOworICAgIGNhc2UgTEFOR19MQU86IHJldHVybiAibG9fTEEiOworICAgIGNhc2UgTEFOR19MQVRJTjogcmV0dXJuICJsYV9WQSI7CisgICAgY2FzZSBMQU5HX0xBVFZJQU46IHJldHVybiAibHZfTFYiOworICAgIGNhc2UgTEFOR19MSVRIVUFOSUFOOiByZXR1cm4gImx0X0xUIjsKKyAgICBjYXNlIExBTkdfTUFDRURPTklBTjogcmV0dXJuICJta19NSyI7CisgICAgY2FzZSBMQU5HX01BTEFZOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19NQUxBWV9NQUxBWVNJQTogcmV0dXJuICJtc19NWSI7CisJY2FzZSBTVUJMQU5HX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNOiByZXR1cm4gIm1zX0JOIjsKKwl9CisgICAgICByZXR1cm4gIm1zIjsKKyAgICBjYXNlIExBTkdfTUFMQVlBTEFNOiByZXR1cm4gIm1sX0lOIjsKKyAgICBjYXNlIExBTkdfTUFMVEVTRTogcmV0dXJuICJtdF9NVCI7CisgICAgY2FzZSBMQU5HX01BTklQVVJJOgorICAgICAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKyAgICAgIHJldHVybiAibW5pX0lOIjsKKyAgICBjYXNlIExBTkdfTUFSQVRISTogcmV0dXJuICJtcl9JTiI7CisgICAgY2FzZSBMQU5HX01PTkdPTElBTjoKKyAgICAgIHJldHVybiAibW4iOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJtbl9DTiIgb3IgIm1uX01OIi4gICovCisgICAgY2FzZSBMQU5HX05FUEFMSToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJuZV9OUCI7CisJY2FzZSBTVUJMQU5HX05FUEFMSV9JTkRJQTogcmV0dXJuICJuZV9JTiI7CisJfQorICAgICAgcmV0dXJuICJuZSI7CisgICAgY2FzZSBMQU5HX05PUldFR0lBTjoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTDogcmV0dXJuICJub19OTyI7CisJY2FzZSBTVUJMQU5HX05PUldFR0lBTl9OWU5PUlNLOiByZXR1cm4gIm5uX05PIjsKKwl9CisgICAgICByZXR1cm4gIm5vIjsKKyAgICBjYXNlIExBTkdfT1JJWUE6IHJldHVybiAib3JfSU4iOworICAgIGNhc2UgTEFOR19PUk9NTzogcmV0dXJuICJvbV9FVCI7CisgICAgY2FzZSBMQU5HX1BBUElBTUVOVFU6IHJldHVybiAicGFwX0FOIjsKKyAgICBjYXNlIExBTkdfUEFTSFRPOgorICAgICAgcmV0dXJuICJwcyI7IC8qIEFtYmlndW91czogY291bGQgYmUgInBzX1BLIiBvciAicHNfQUYiLiAgKi8KKyAgICBjYXNlIExBTkdfUE9MSVNIOiByZXR1cm4gInBsX1BMIjsKKyAgICBjYXNlIExBTkdfUE9SVFVHVUVTRToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfUE9SVFVHVUVTRTogcmV0dXJuICJwdF9QVCI7CisJLyogSG1tLiBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOID09IFNVQkxBTkdfREVGQVVMVC4KKwkgICBTYW1lIHBoZW5vbWVub24gYXMgU1VCTEFOR19FTkdMSVNIX1VTID09IFNVQkxBTkdfREVGQVVMVC4gKi8KKwljYXNlIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU46IHJldHVybiAicHRfQlIiOworCX0KKyAgICAgIHJldHVybiAicHQiOworICAgIGNhc2UgTEFOR19QVU5KQUJJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19QVU5KQUJJX0lORElBOiByZXR1cm4gInBhX0lOIjsgLyogR3VybXVraGkgc2NyaXB0ICovCisJY2FzZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU46IHJldHVybiAicGFfUEsiOyAvKiBBcmFiaWMgc2NyaXB0ICovCisJfQorICAgICAgcmV0dXJuICJwYSI7CisgICAgY2FzZSBMQU5HX1JIQUVUT19ST01BTkNFOiByZXR1cm4gInJtX0NIIjsKKyAgICBjYXNlIExBTkdfUk9NQU5JQU46CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUE6IHJldHVybiAicm9fUk8iOworCWNhc2UgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBOiByZXR1cm4gInJvX01EIjsKKwl9CisgICAgICByZXR1cm4gInJvIjsKKyAgICBjYXNlIExBTkdfUlVTU0lBTjoKKyAgICAgIHJldHVybiAicnUiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJydV9SVSIgb3IgInJ1X1VBIiBvciAicnVfTUQiLiAgKi8KKyAgICBjYXNlIExBTkdfU0FBTUk6IC8qIGFjdHVhbGx5IE5vcnRoZXJuIFNhbWkgKi8gcmV0dXJuICJzZV9OTyI7CisgICAgY2FzZSBMQU5HX1NBTlNLUklUOiByZXR1cm4gInNhX0lOIjsKKyAgICBjYXNlIExBTkdfU0lOREhJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19TSU5ESElfSU5ESUE6IHJldHVybiAic2RfSU4iOworCWNhc2UgU1VCTEFOR19TSU5ESElfUEFLSVNUQU46IHJldHVybiAic2RfUEsiOworCX0KKyAgICAgIHJldHVybiAic2QiOworICAgIGNhc2UgTEFOR19TSU5IQUxFU0U6IHJldHVybiAic2lfTEsiOworICAgIGNhc2UgTEFOR19TTE9WQUs6IHJldHVybiAic2tfU0siOworICAgIGNhc2UgTEFOR19TTE9WRU5JQU46IHJldHVybiAic2xfU0kiOworICAgIGNhc2UgTEFOR19TT01BTEk6IHJldHVybiAic29fU08iOworICAgIGNhc2UgTEFOR19TT1JCSUFOOgorICAgICAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKyAgICAgIHJldHVybiAid2VuX0RFIjsKKyAgICBjYXNlIExBTkdfU1BBTklTSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfU1BBTklTSDogcmV0dXJuICJlc19FUyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTjogcmV0dXJuICJlc19NWCI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTU9ERVJOOgorCSAgcmV0dXJuICJlc19FU0Btb2Rlcm4iOwkvKiBub3Qgc2VlbiBvbiBVbml4ICovCisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBOiByZXR1cm4gImVzX0dUIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBOiByZXR1cm4gImVzX0NSIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QQU5BTUE6IHJldHVybiAiZXNfUEEiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQzogcmV0dXJuICJlc19ETyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBOiByZXR1cm4gImVzX1ZFIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQTogcmV0dXJuICJlc19DTyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEVSVTogcmV0dXJuICJlc19QRSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BOiByZXR1cm4gImVzX0FSIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SOiByZXR1cm4gImVzX0VDIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9DSElMRTogcmV0dXJuICJlc19DTCI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWTogcmV0dXJuICJlc19VWSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVk6IHJldHVybiAiZXNfUFkiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0JPTElWSUE6IHJldHVybiAiZXNfQk8iOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SOiByZXR1cm4gImVzX1NWIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUzogcmV0dXJuICJlc19ITiI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBOiByZXR1cm4gImVzX05JIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTzogcmV0dXJuICJlc19QUiI7CisJfQorICAgICAgcmV0dXJuICJlcyI7CisgICAgY2FzZSBMQU5HX1NVVFU6IHJldHVybiAiYm50X1RaIjsgLyogb3IgInN0X0xTIiBvciAibnNvX1pBIj8gKi8KKyAgICBjYXNlIExBTkdfU1dBSElMSTogcmV0dXJuICJzd19LRSI7CisgICAgY2FzZSBMQU5HX1NXRURJU0g6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAic3ZfU0UiOworCWNhc2UgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQ6IHJldHVybiAic3ZfRkkiOworCX0KKyAgICAgIHJldHVybiAic3YiOworICAgIGNhc2UgTEFOR19TWVJJQUM6IHJldHVybiAic3lyX1RSIjsgLyogQW4gZXh0aW5jdCBsYW5ndWFnZS4gICovCisgICAgY2FzZSBMQU5HX1RBR0FMT0c6IHJldHVybiAidGxfUEgiOworICAgIGNhc2UgTEFOR19UQUpJSzogcmV0dXJuICJ0Z19USiI7CisgICAgY2FzZSBMQU5HX1RBTUFaSUdIVDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwkvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBUYW1hemlnaHQgbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCisJY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUM6IHJldHVybiAiYmVyX01BQGFyYWJpYyI7CisJY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9MQVRJTjogcmV0dXJuICJiZXJfTUFAbGF0aW4iOworCX0KKyAgICAgIHJldHVybiAiYmVyX01BIjsKKyAgICBjYXNlIExBTkdfVEFNSUw6CisgICAgICByZXR1cm4gInRhIjsgLyogQW1iaWd1b3VzOiBjb3VsZCBiZSAidGFfSU4iIG9yICJ0YV9MSyIgb3IgInRhX1NHIi4gICovCisgICAgY2FzZSBMQU5HX1RBVEFSOiByZXR1cm4gInR0X1JVIjsKKyAgICBjYXNlIExBTkdfVEVMVUdVOiByZXR1cm4gInRlX0lOIjsKKyAgICBjYXNlIExBTkdfVEhBSTogcmV0dXJuICJ0aF9USCI7CisgICAgY2FzZSBMQU5HX1RJQkVUQU46IHJldHVybiAiYm9fQ04iOworICAgIGNhc2UgTEFOR19USUdSSU5ZQToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUE6IHJldHVybiAidGlfRVQiOworCWNhc2UgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBOiByZXR1cm4gInRpX0VSIjsKKwl9CisgICAgICByZXR1cm4gInRpIjsKKyAgICBjYXNlIExBTkdfVFNPTkdBOiByZXR1cm4gInRzX1pBIjsKKyAgICBjYXNlIExBTkdfVFNXQU5BOiByZXR1cm4gInRuX0JXIjsKKyAgICBjYXNlIExBTkdfVFVSS0lTSDogcmV0dXJuICJ0cl9UUiI7CisgICAgY2FzZSBMQU5HX1RVUktNRU46IHJldHVybiAidGtfVE0iOworICAgIGNhc2UgTEFOR19VS1JBSU5JQU46IHJldHVybiAidWtfVUEiOworICAgIGNhc2UgTEFOR19VUkRVOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19VUkRVX1BBS0lTVEFOOiByZXR1cm4gInVyX1BLIjsKKwljYXNlIFNVQkxBTkdfVVJEVV9JTkRJQTogcmV0dXJuICJ1cl9JTiI7CisJfQorICAgICAgcmV0dXJuICJ1ciI7CisgICAgY2FzZSBMQU5HX1VaQkVLOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19VWkJFS19MQVRJTjogcmV0dXJuICJ1el9VWiI7CisJY2FzZSBTVUJMQU5HX1VaQkVLX0NZUklMTElDOiByZXR1cm4gInV6X1VaQGN5cmlsbGljIjsKKwl9CisgICAgICByZXR1cm4gInV6IjsKKyAgICBjYXNlIExBTkdfVkVOREE6IHJldHVybiAidmVfWkEiOworICAgIGNhc2UgTEFOR19WSUVUTkFNRVNFOiByZXR1cm4gInZpX1ZOIjsKKyAgICBjYXNlIExBTkdfV0VMU0g6IHJldHVybiAiY3lfR0IiOworICAgIGNhc2UgTEFOR19YSE9TQTogcmV0dXJuICJ4aF9aQSI7CisgICAgY2FzZSBMQU5HX1lJOiByZXR1cm4gInNpdF9DTiI7CisgICAgY2FzZSBMQU5HX1lJRERJU0g6IHJldHVybiAieWlfSUwiOworICAgIGNhc2UgTEFOR19ZT1JVQkE6IHJldHVybiAieW9fTkciOworICAgIGNhc2UgTEFOR19aVUxVOiByZXR1cm4gInp1X1pBIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIkMiOworICAgIH0KKworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9nLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2MDc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9sb2cuYwpAQCAtMCwwICsxLDk4IEBACisvKiBMb2cgZmlsZSBvdXRwdXQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBQcmludCBhbiBBU0NJSSBzdHJpbmcgd2l0aCBxdW90ZXMgYW5kIGVzY2FwZSBzZXF1ZW5jZXMgd2hlcmUgbmVlZGVkLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9lc2NhcGVkIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgcHV0YyAoJyInLCBzdHJlYW0pOworICBmb3IgKDsgKnN0ciAhPSAnXDAnOyBzdHIrKykKKyAgICBpZiAoKnN0ciA9PSAnXG4nKQorICAgICAgeworCWZwdXRzICgiXFxuXCIiLCBzdHJlYW0pOworCWlmIChzdHJbMV0gPT0gJ1wwJykKKwkgIHJldHVybjsKKwlmcHV0cyAoIlxuXCIiLCBzdHJlYW0pOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlpZiAoKnN0ciA9PSAnIicgfHwgKnN0ciA9PSAnXFwnKQorCSAgcHV0YyAoJ1xcJywgc3RyZWFtKTsKKwlwdXRjICgqc3RyLCBzdHJlYW0pOworICAgICAgfQorICBwdXRjICgnIicsIHN0cmVhbSk7Cit9CisKKy8qIEFkZCB0byB0aGUgbG9nIGZpbGUgYW4gZW50cnkgZGVub3RpbmcgYSBmYWlsZWQgdHJhbnNsYXRpb24uICAqLwordm9pZAorX25sX2xvZ191bnRyYW5zbGF0ZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAorCQkgICAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgaW50IHBsdXJhbCkKK3sKKyAgc3RhdGljIGNoYXIgKmxhc3RfbG9nZmlsZW5hbWUgPSBOVUxMOworICBzdGF0aWMgRklMRSAqbGFzdF9sb2dmaWxlID0gTlVMTDsKKyAgRklMRSAqbG9nZmlsZTsKKworICAvKiBDYW4gd2UgcmV1c2UgdGhlIGxhc3Qgb3BlbmVkIGxvZ2ZpbGU/ICAqLworICBpZiAobGFzdF9sb2dmaWxlbmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAobG9nZmlsZW5hbWUsIGxhc3RfbG9nZmlsZW5hbWUpICE9IDApCisgICAgeworICAgICAgLyogQ2xvc2UgdGhlIGxhc3QgdXNlZCBsb2dmaWxlLiAgKi8KKyAgICAgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lICE9IE5VTEwpCisJeworCSAgaWYgKGxhc3RfbG9nZmlsZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgZmNsb3NlIChsYXN0X2xvZ2ZpbGUpOworCSAgICAgIGxhc3RfbG9nZmlsZSA9IE5VTEw7CisJICAgIH0KKwkgIGZyZWUgKGxhc3RfbG9nZmlsZW5hbWUpOworCSAgbGFzdF9sb2dmaWxlbmFtZSA9IE5VTEw7CisJfQorICAgICAgLyogT3BlbiB0aGUgbG9nZmlsZS4gICovCisgICAgICBsYXN0X2xvZ2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKGxvZ2ZpbGVuYW1lKSArIDEpOworICAgICAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgICBzdHJjcHkgKGxhc3RfbG9nZmlsZW5hbWUsIGxvZ2ZpbGVuYW1lKTsKKyAgICAgIGxhc3RfbG9nZmlsZSA9IGZvcGVuIChsb2dmaWxlbmFtZSwgImEiKTsKKyAgICAgIGlmIChsYXN0X2xvZ2ZpbGUgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgfQorICBsb2dmaWxlID0gbGFzdF9sb2dmaWxlOworCisgIGZwcmludGYgKGxvZ2ZpbGUsICJkb21haW4gIik7CisgIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIGRvbWFpbm5hbWUpOworICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZCAiKTsKKyAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgbXNnaWQxKTsKKyAgaWYgKHBsdXJhbCkKKyAgICB7CisgICAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZF9wbHVyYWwgIik7CisgICAgICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBtc2dpZDIpOworICAgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnc3RyWzBdIFwiXCJcbiIpOworICAgIH0KKyAgZWxzZQorICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ3N0ciBcIlwiXG4iKTsKKyAgcHV0YyAoJ1xuJywgbG9nZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbmdldHRleHQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9uZ2V0dGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2UwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvbmdldHRleHQuYwpAQCAtMCwwICsxLDY1IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiBuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBfX25lZWRfTlVMTAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIE5HRVRURVhUIF9fbmdldHRleHQKKyMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgTkdFVFRFWFQgbGliaW50bF9uZ2V0dGV4dAorIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKyAgIHRleHQpLiAgKi8KK2NoYXIgKgorTkdFVFRFWFQgKGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICByZXR1cm4gRENOR0VUVEVYVCAoTlVMTCwgbXNnaWQxLCBtc2dpZDIsIG4sIExDX01FU1NBR0VTKTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fbmdldHRleHQsIG5nZXR0ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL29zMmNvbXBhdC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL29zMmNvbXBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGMzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvb3MyY29tcGF0LmMKQEAgLTAsMCArMSw5OCBAQAorLyogT1MvMiBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2RlZmluZSBPUzJfQVdBUkUKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisvKiBBIHZlcnNpb24gb2YgZ2V0ZW52KCkgdGhhdCB3b3JrcyBmcm9tIERMTHMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIERvc1NjYW5FbnYgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBzek5hbWUsIHVuc2lnbmVkIGNoYXIgKipwcHN6VmFsdWUpOworCitjaGFyICoKK19ubF9nZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOworICBpZiAoRG9zU2NhbkVudiAobmFtZSwgJnZhbHVlKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiB2YWx1ZTsKK30KKworLyogQSBmaXhlZCBzaXplIGJ1ZmZlci4gICovCitjaGFyIGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lW01BWFBBVEhMRU4rMV07CisKK2NoYXIgKl9ubG9zMl9saWJkaXIgPSBOVUxMOworY2hhciAqX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IE5VTEw7CitjaGFyICpfbmxvczJfbG9jYWxlZGlyID0gTlVMTDsKKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZAorbmxvczJfaW5pdGlhbGl6ZSAoKQoreworICBjaGFyICpyb290ID0gZ2V0ZW52ICgiVU5JWFJPT1QiKTsKKyAgY2hhciAqZ251bG9jYWxlZGlyID0gZ2V0ZW52ICgiR05VTE9DQUxFRElSIik7CisKKyAgX25sb3MyX2xpYmRpciA9IGdudWxvY2FsZWRpcjsKKyAgaWYgKCFfbmxvczJfbGliZGlyKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKyAgICAgICAgICBfbmxvczJfbGliZGlyID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTElCRElSKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciArIHNsLCBMSUJESVIsIHN0cmxlbiAoTElCRElSKSArIDEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9saWJkaXIgPSBMSUJESVI7CisgICAgfQorCisgIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBnbnVsb2NhbGVkaXI7CisgIGlmICghX25sb3MyX2xvY2FsZWFsaWFzcGF0aCkKKyAgICB7CisgICAgICBpZiAocm9vdCkKKyAgICAgICAgeworICAgICAgICAgIHNpemVfdCBzbCA9IHN0cmxlbiAocm9vdCk7CisgICAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWFsaWFzcGF0aCwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWFsaWFzcGF0aCArIHNsLCBMT0NBTEVfQUxJQVNfUEFUSCwgc3RybGVuIChMT0NBTEVfQUxJQVNfUEFUSCkgKyAxKTsKKyAgICAgICAgfQorICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKKyAgICB9CisKKyAgX25sb3MyX2xvY2FsZWRpciA9IGdudWxvY2FsZWRpcjsKKyAgaWYgKCFfbmxvczJfbG9jYWxlZGlyKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKyAgICAgICAgICBfbmxvczJfbG9jYWxlZGlyID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTE9DQUxFRElSKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciArIHNsLCBMT0NBTEVESVIsIHN0cmxlbiAoTE9DQUxFRElSKSArIDEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSBMT0NBTEVESVI7CisgICAgfQorCisgIGlmIChzdHJsZW4gKF9ubG9zMl9sb2NhbGVkaXIpIDw9IE1BWFBBVEhMRU4pCisgICAgc3RyY3B5IChsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZSwgX25sb3MyX2xvY2FsZWRpcik7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvb3MyY29tcGF0LmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvb3MyY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NGU4YwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9vczJjb21wYXQuaApAQCAtMCwwICsxLDQ2IEBACisvKiBPUy8yIGNvbXBhdGliaWxpdHkgZGVmaW5lcy4KKyAgIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBmcm9tIGNvbmZpZy5oCisgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFdoZW4gaW5jbHVkZWQgZnJvbSBvczJjb21wYXQuaCB3ZSBuZWVkIGFsbCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbnMgKi8KKyNpZm5kZWYgT1MyX0FXQVJFCisKKyN1bmRlZiBMSUJESVIKKyNkZWZpbmUgTElCRElSCQkJX25sb3MyX2xpYmRpcgorZXh0ZXJuIGNoYXIgKl9ubG9zMl9saWJkaXI7CisKKyN1bmRlZiBMT0NBTEVESVIKKyNkZWZpbmUgTE9DQUxFRElSCQlfbmxvczJfbG9jYWxlZGlyCitleHRlcm4gY2hhciAqX25sb3MyX2xvY2FsZWRpcjsKKworI3VuZGVmIExPQ0FMRV9BTElBU19QQVRICisjZGVmaW5lIExPQ0FMRV9BTElBU19QQVRICV9ubG9zMl9sb2NhbGVhbGlhc3BhdGgKK2V4dGVybiBjaGFyICpfbmxvczJfbG9jYWxlYWxpYXNwYXRoOworCisjZW5kaWYKKworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorI2RlZmluZSBIQVZFX1NUUkNBU0VDTVAgMQorI2RlZmluZSBzdHJjYXNlY21wIHN0cmljbXAKKyNkZWZpbmUgc3RybmNhc2VjbXAgc3RybmljbXAKKworLyogV2UgaGF2ZSBvdXIgb3duIGdldGVudigpIHdoaWNoIHdvcmtzIGV2ZW4gaWYgbGlicmFyeSBpcyBjb21waWxlZCBhcyBETEwgKi8KKyNkZWZpbmUgZ2V0ZW52IF9ubF9nZXRlbnYKKworLyogT2xkZXIgdmVyc2lvbnMgb2YgZ2V0dGV4dCB1c2VkIC0xIGFzIHRoZSB2YWx1ZSBvZiBMQ19NRVNTQUdFUyAqLworI2RlZmluZSBMQ19NRVNTQUdFU19DT01QQVQgKC0xKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL29zZGVwLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvb3NkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzcyNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL29zZGVwLmMKQEAgLTAsMCArMSwyNCBAQAorLyogT1MgZGVwZW5kZW50IHBhcnRzIG9mIGxpYmludGwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZiBkZWZpbmVkIF9fRU1YX18KKyMgaW5jbHVkZSAib3MyY29tcGF0LmMiCisjZWxzZQorLyogQXZvaWQgQUlYIGNvbXBpbGVyIHdhcm5pbmcuICAqLwordHlwZWRlZiBpbnQgZHVtbXk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wbHVyYWwtZXhwLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcGx1cmFsLWV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDRlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcGx1cmFsLWV4cC5jCkBAIC0wLDAgKzEsMTU0IEBACisvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorCisjaWYgKGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX19BUFBMRV9DQ19fKSBcCisgICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisKKy8qIFRoZXNlIHN0cnVjdHMgYXJlIHRoZSBjb25zdGFudCBleHByZXNzaW9uIGZvciB0aGUgZ2VybWFuaWMgcGx1cmFsCisgICBmb3JtIGRldGVybWluYXRpb24uICBJdCByZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICAibiAhPSAxIi4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gcGx2YXIgPQoreworICAubmFyZ3MgPSAwLAorICAub3BlcmF0aW9uID0gdmFyLAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZSA9Cit7CisgIC5uYXJncyA9IDAsCisgIC5vcGVyYXRpb24gPSBudW0sCisgIC52YWwgPQorICB7CisgICAgLm51bSA9IDEKKyAgfQorfTsKK3N0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTCA9Cit7CisgIC5uYXJncyA9IDIsCisgIC5vcGVyYXRpb24gPSBub3RfZXF1YWwsCisgIC52YWwgPQorICB7CisgICAgLmFyZ3MgPQorICAgIHsKKyAgICAgIFswXSA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSAmcGx2YXIsCisgICAgICBbMV0gPSAoc3RydWN0IGV4cHJlc3Npb24gKikgJnBsb25lCisgICAgfQorICB9Cit9OworCisjIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpCisKKyNlbHNlCisKKy8qIEZvciBjb21waWxlcnMgd2l0aG91dCBzdXBwb3J0IGZvciBJU08gQyA5OSBzdHJ1Y3QvdW5pb24gaW5pdGlhbGl6ZXJzOgorICAgSW5pdGlhbGl6YXRpb24gYXQgcnVuLXRpbWUuICAqLworCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gcGx2YXI7CitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gcGxvbmU7CitzdHJ1Y3QgZXhwcmVzc2lvbiBHRVJNQU5JQ19QTFVSQUw7CisKK3N0YXRpYyB2b2lkCitpbml0X2dlcm1hbmljX3BsdXJhbCAoKQoreworICBpZiAocGxvbmUudmFsLm51bSA9PSAwKQorICAgIHsKKyAgICAgIHBsdmFyLm5hcmdzID0gMDsKKyAgICAgIHBsdmFyLm9wZXJhdGlvbiA9IHZhcjsKKworICAgICAgcGxvbmUubmFyZ3MgPSAwOworICAgICAgcGxvbmUub3BlcmF0aW9uID0gbnVtOworICAgICAgcGxvbmUudmFsLm51bSA9IDE7CisKKyAgICAgIEdFUk1BTklDX1BMVVJBTC5uYXJncyA9IDI7CisgICAgICBHRVJNQU5JQ19QTFVSQUwub3BlcmF0aW9uID0gbm90X2VxdWFsOworICAgICAgR0VSTUFOSUNfUExVUkFMLnZhbC5hcmdzWzBdID0gJnBsdmFyOworICAgICAgR0VSTUFOSUNfUExVUkFMLnZhbC5hcmdzWzFdID0gJnBsb25lOworICAgIH0KK30KKworIyBkZWZpbmUgSU5JVF9HRVJNQU5JQ19QTFVSQUwoKSBpbml0X2dlcm1hbmljX3BsdXJhbCAoKQorCisjZW5kaWYKKwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK0VYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKGNvbnN0IGNoYXIgKm51bGxlbnRyeSwgc3RydWN0IGV4cHJlc3Npb24gKipwbHVyYWxwLAorCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKK3sKKyAgaWYgKG51bGxlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnBsdXJhbDsKKyAgICAgIGNvbnN0IGNoYXIgKm5wbHVyYWxzOworCisgICAgICBwbHVyYWwgPSBzdHJzdHIgKG51bGxlbnRyeSwgInBsdXJhbD0iKTsKKyAgICAgIG5wbHVyYWxzID0gc3Ryc3RyIChudWxsZW50cnksICJucGx1cmFscz0iKTsKKyAgICAgIGlmIChwbHVyYWwgPT0gTlVMTCB8fCBucGx1cmFscyA9PSBOVUxMKQorCWdvdG8gbm9fcGx1cmFsOworICAgICAgZWxzZQorCXsKKwkgIGNoYXIgKmVuZHA7CisJICB1bnNpZ25lZCBsb25nIGludCBuOworCSAgc3RydWN0IHBhcnNlX2FyZ3MgYXJnczsKKworCSAgLyogRmlyc3QgZ2V0IHRoZSBudW1iZXIuICAqLworCSAgbnBsdXJhbHMgKz0gOTsKKwkgIHdoaWxlICgqbnBsdXJhbHMgIT0gJ1wwJyAmJiBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKm5wbHVyYWxzKSkKKwkgICAgKytucGx1cmFsczsKKwkgIGlmICghKCpucGx1cmFscyA+PSAnMCcgJiYgKm5wbHVyYWxzIDw9ICc5JykpCisJICAgIGdvdG8gbm9fcGx1cmFsOworI2lmIGRlZmluZWQgSEFWRV9TVFJUT1VMIHx8IGRlZmluZWQgX0xJQkMKKwkgIG4gPSBzdHJ0b3VsIChucGx1cmFscywgJmVuZHAsIDEwKTsKKyNlbHNlCisJICBmb3IgKGVuZHAgPSBucGx1cmFscywgbiA9IDA7ICplbmRwID49ICcwJyAmJiAqZW5kcCA8PSAnOSc7IGVuZHArKykKKwkgICAgbiA9IG4gKiAxMCArICgqZW5kcCAtICcwJyk7CisjZW5kaWYKKwkgIGlmIChucGx1cmFscyA9PSBlbmRwKQorCSAgICBnb3RvIG5vX3BsdXJhbDsKKwkgICpucGx1cmFsc3AgPSBuOworCisJICAvKiBEdWUgdG8gdGhlIHJlc3RyaWN0aW9ucyBiaXNvbiBpbXBvc2VzIG9udG8gdGhlIGludGVyZmFjZSBvZiB0aGUKKwkgICAgIHNjYW5uZXIgZnVuY3Rpb24gd2UgaGF2ZSB0byBwdXQgdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIHJlc3VsdAorCSAgICAgcGFzc2VkIHVwIGZyb20gdGhlIHBhcnNlciBpbnRvIHRoZSBzYW1lIHN0cnVjdHVyZSB3aGljaCBhZGRyZXNzCisJICAgICBpcyBwYXNzZWQgZG93biB0byB0aGUgcGFyc2VyLiAgKi8KKwkgIHBsdXJhbCArPSA3OworCSAgYXJncy5jcCA9IHBsdXJhbDsKKwkgIGlmIChQTFVSQUxfUEFSU0UgKCZhcmdzKSAhPSAwKQorCSAgICBnb3RvIG5vX3BsdXJhbDsKKwkgICpwbHVyYWxwID0gYXJncy5yZXM7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEJ5IGRlZmF1bHQgd2UgYXJlIHVzaW5nIHRoZSBHZXJtYW5pYyBmb3JtOiBzaW5ndWxhciBmb3JtIG9ubHkKKyAgICAgICAgIGZvciBgb25lJywgdGhlIHBsdXJhbCBmb3JtIG90aGVyd2lzZS4gIFllcywgdGhpcyBpcyBhbHNvIHdoYXQKKyAgICAgICAgIEVuZ2xpc2ggaXMgdXNpbmcgc2luY2UgRW5nbGlzaCBpcyBhIEdlcm1hbmljIGxhbmd1YWdlLiAgKi8KKyAgICBub19wbHVyYWw6CisgICAgICBJTklUX0dFUk1BTklDX1BMVVJBTCAoKTsKKyAgICAgICpwbHVyYWxwID0gJkdFUk1BTklDX1BMVVJBTDsKKyAgICAgICpucGx1cmFsc3AgPSAyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wbHVyYWwtZXhwLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcGx1cmFsLWV4cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTJjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcGx1cmFsLWV4cC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiBFeHByZXNzaW9uIHBhcnNpbmcgYW5kIGV2YWx1YXRpb24gZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1BMVVJBTF9FWFBfSAorI2RlZmluZSBfUExVUkFMX0VYUF9ICisKKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisjZW5kaWYKKworI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCisjIGRlZmluZSBhdHRyaWJ1dGVfaGlkZGVuCisjZW5kaWYKKworCisvKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHRoZQorICAgcGx1cmFsIGZvcm0uICAqLworc3RydWN0IGV4cHJlc3Npb24KK3sKKyAgaW50IG5hcmdzOwkJCS8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBlbnVtIG9wZXJhdG9yCisgIHsKKyAgICAvKiBXaXRob3V0IGFyZ3VtZW50czogICovCisgICAgdmFyLAkJCS8qIFRoZSB2YXJpYWJsZSAibiIuICAqLworICAgIG51bSwJCQkvKiBEZWNpbWFsIG51bWJlci4gICovCisgICAgLyogVW5hcnkgb3BlcmF0b3JzOiAgKi8KKyAgICBsbm90LAkJCS8qIExvZ2ljYWwgTk9ULiAgKi8KKyAgICAvKiBCaW5hcnkgb3BlcmF0b3JzOiAgKi8KKyAgICBtdWx0LAkJCS8qIE11bHRpcGxpY2F0aW9uLiAgKi8KKyAgICBkaXZpZGUsCQkJLyogRGl2aXNpb24uICAqLworICAgIG1vZHVsZSwJCQkvKiBNb2R1bG8gb3BlcmF0aW9uLiAgKi8KKyAgICBwbHVzLAkJCS8qIEFkZGl0aW9uLiAgKi8KKyAgICBtaW51cywJCQkvKiBTdWJ0cmFjdGlvbi4gICovCisgICAgbGVzc190aGFuLAkJCS8qIENvbXBhcmlzb24uICAqLworICAgIGdyZWF0ZXJfdGhhbiwJCS8qIENvbXBhcmlzb24uICAqLworICAgIGxlc3Nfb3JfZXF1YWwsCQkvKiBDb21wYXJpc29uLiAgKi8KKyAgICBncmVhdGVyX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCisgICAgZXF1YWwsCQkJLyogQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkuICAqLworICAgIG5vdF9lcXVhbCwJCQkvKiBDb21wYXJpc29uIGZvciBpbmVxdWFsaXR5LiAgKi8KKyAgICBsYW5kLAkJCS8qIExvZ2ljYWwgQU5ELiAgKi8KKyAgICBsb3IsCQkJLyogTG9naWNhbCBPUi4gICovCisgICAgLyogVGVybmFyeSBvcGVyYXRvcnM6ICAqLworICAgIHFtb3AJCQkvKiBRdWVzdGlvbiBtYXJrIG9wZXJhdG9yLiAgKi8KKyAgfSBvcGVyYXRpb247CisgIHVuaW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBudW07CS8qIE51bWJlciB2YWx1ZSBmb3IgYG51bScuICAqLworICAgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwkvKiBVcCB0byB0aHJlZSBhcmd1bWVudHMuICAqLworICB9IHZhbDsKK307CisKKy8qIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIHBhcnNlciBhbmQgZ2V0CisgICB0aGUgcmVzdWx0IGluIGEgdGhyZWFkLXNhZmUgd2F5LiAgKi8KK3N0cnVjdCBwYXJzZV9hcmdzCit7CisgIGNvbnN0IGNoYXIgKmNwOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmVzOworfTsKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGlzIHNvdXJjZSBjb2RlIGlzIHVzZWQKKyAgIDEuIGluIHRoZSBHTlUgQyBMaWJyYXJ5IGxpYnJhcnksCisgICAyLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSwKKyAgIDMuIGluIHRoZSBHTlUgZ2V0dGV4dCB0b29scy4KKyAgIFRoZSBmdW5jdGlvbiBuYW1lcyBpbiBlYWNoIHNpdHVhdGlvbiBtdXN0IGJlIGRpZmZlcmVudCwgdG8gYWxsb3cgZm9yCisgICBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4gJ3N0cnVjdCBleHByZXNzaW9uJy4gIEZ1cnRoZXJtb3JlLAorICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwgdGhlIG5hbWVzIGhhdmUgYSBfXyBwcmVmaXgsCisgICAyLiszLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSBhbmQgaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLCB0aGUgbmFtZXMKKyAgICAgICAgIG11c3QgZm9sbG93IEFOU0kgQyBhbmQgbm90IHN0YXJ0IHdpdGggX18uCisgICBTbyB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHRoZSB0aHJlZSBjYXNlcy4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBfX2dldHRleHRfZnJlZV9leHAKKyMgZGVmaW5lIFBMVVJBTF9QQVJTRSBfX2dldHRleHRwYXJzZQorIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIF9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwKKyMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gX19nZXR0ZXh0X2V4dHJhY3RfcGx1cmFsCisjZWxpZiBkZWZpbmVkIChJTl9MSUJJTlRMKQorIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9mcmVlX2V4cAorIyBkZWZpbmUgUExVUkFMX1BBUlNFIGxpYmludGxfZ2V0dGV4dHBhcnNlCisjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgbGliaW50bF9nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAorIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBsaWJpbnRsX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKKyNlbHNlCisjIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gZnJlZV9wbHVyYWxfZXhwcmVzc2lvbgorIyBkZWZpbmUgUExVUkFMX1BBUlNFIHBhcnNlX3BsdXJhbF9leHByZXNzaW9uCisjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgZ2VybWFuaWNfcGx1cmFsCisjIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGV4dHJhY3RfcGx1cmFsX2V4cHJlc3Npb24KKyNlbmRpZgorCitleHRlcm4gdm9pZCBGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworZXh0ZXJuIGludCBQTFVSQUxfUEFSU0UgKHZvaWQgKmFyZyk7CitleHRlcm4gc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gdm9pZCBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChjb25zdCBjaGFyICpudWxsZW50cnksCisJCQkJICAgICAgIHN0cnVjdCBleHByZXNzaW9uICoqcGx1cmFscCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKyNpZiAhZGVmaW5lZCAoX0xJQkMpICYmICFkZWZpbmVkIChJTl9MSUJJTlRMKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHBsdXJhbF9ldmFsIChzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBuKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX1BMVVJBTF9FWFBfSCAqLwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3BsdXJhbC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3BsdXJhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTMwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcGx1cmFsLmMKQEAgLTAsMCArMSwxNDkwIEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIHBsdXJhbC55CisgICBieSBHTlUgYmlzb24gMS4zNS4gICovCisKKyNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworCisjZGVmaW5lIHl5cGFyc2UgX19nZXR0ZXh0cGFyc2UKKyNkZWZpbmUgeXlsZXggX19nZXR0ZXh0bGV4CisjZGVmaW5lIHl5ZXJyb3IgX19nZXR0ZXh0ZXJyb3IKKyNkZWZpbmUgeXlsdmFsIF9fZ2V0dGV4dGx2YWwKKyNkZWZpbmUgeXljaGFyIF9fZ2V0dGV4dGNoYXIKKyNkZWZpbmUgeXlkZWJ1ZyBfX2dldHRleHRkZWJ1ZworI2RlZmluZSB5eW5lcnJzIF9fZ2V0dGV4dG5lcnJzCisjIGRlZmluZQlFUVVPUDIJMjU3CisjIGRlZmluZQlDTVBPUDIJMjU4CisjIGRlZmluZQlBRERPUDIJMjU5CisjIGRlZmluZQlNVUxPUDIJMjYwCisjIGRlZmluZQlOVU1CRVIJMjYxCisKKyNsaW5lIDEgInBsdXJhbC55IgorCisvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRoZSBiaXNvbiBnZW5lcmF0ZWQgcGFyc2VyIHVzZXMgYWxsb2NhLiAgQUlYIDMgZm9yY2VzIHVzIHRvIHB1dCB0aGlzCisgICBkZWNsYXJhdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgVGhlIGRlY2xhcmF0aW9uIGluIGJpc29uJ3MKKyAgIHNrZWxldG9uIGZpbGUgY29tZXMgdG9vIGxhdGUuICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPgorICAgYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlIGFyYml0cmFyeSBzeXN0ZW0gaGVhZGVycy4gICovCisjaWYgZGVmaW5lZCBfQUlYICYmICFkZWZpbmVkIF9fR05VQ19fCisgI3ByYWdtYSBhbGxvY2EKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorCisvKiBUaGUgbWFpbiBmdW5jdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciBpcyBjYWxsZWQgX19nZXR0ZXh0cGFyc2UsCisgICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KKyNpZm5kZWYgX0xJQkMKKyMgZGVmaW5lIF9fZ2V0dGV4dHBhcnNlIFBMVVJBTF9QQVJTRQorI2VuZGlmCisKKyNkZWZpbmUgWVlMRVhfUEFSQU0JJigoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+Y3AKKyNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKKworI2xpbmUgNDkgInBsdXJhbC55IgorI2lmbmRlZiBZWVNUWVBFCit0eXBlZGVmIHVuaW9uIHsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbnVtOworICBlbnVtIG9wZXJhdG9yIG9wOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworfSB5eXN0eXBlOworIyBkZWZpbmUgWVlTVFlQRSB5eXN0eXBlCisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQorI2VuZGlmCisjbGluZSA1NSAicGx1cmFsLnkiCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgaW50IHl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCk7CitzdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOworCisvKiBBbGxvY2F0aW9uIG9mIGV4cHJlc3Npb25zLiAgKi8KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHAgKGludCBuYXJncywgZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOworCisgIC8qIElmIGFueSBvZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIG1hbGxvYydlZCwganVzdCByZXR1cm4gTlVMTC4gICovCisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKKyAgICAgIGdvdG8gZmFpbDsKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KKyAgbmV3cCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsKKyAgaWYgKG5ld3AgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXdwLT5uYXJncyA9IG5hcmdzOworICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7CisgICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorCW5ld3AtPnZhbC5hcmdzW2ldID0gYXJnc1tpXTsKKyAgICAgIHJldHVybiBuZXdwOworICAgIH0KKworIGZhaWw6CisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgRlJFRV9FWFBSRVNTSU9OIChhcmdzW2ldKTsKKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzAgKGVudW0gb3BlcmF0b3Igb3ApCit7CisgIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8xIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCit7CisgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzFdOworCisgIGFyZ3NbMF0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDEsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMiAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmxlZnQsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07CisKKyAgYXJnc1swXSA9IGxlZnQ7CisgIGFyZ3NbMV0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDIsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzMgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpiZXhwLAorCSAgIHN0cnVjdCBleHByZXNzaW9uICp0YnJhbmNoLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZmJyYW5jaCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107CisKKyAgYXJnc1swXSA9IGJleHA7CisgIGFyZ3NbMV0gPSB0YnJhbmNoOworICBhcmdzWzJdID0gZmJyYW5jaDsKKyAgcmV0dXJuIG5ld19leHAgKDMsIG9wLCBhcmdzKTsKK30KKworI2lmbmRlZiBZWURFQlVHCisjIGRlZmluZSBZWURFQlVHIDAKKyNlbmRpZgorCisKKworI2RlZmluZQlZWUZJTkFMCQkyNworI2RlZmluZQlZWUZMQUcJCS0zMjc2OAorI2RlZmluZQlZWU5UQkFTRQkxNgorCisvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICovCisjZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI2MSA/IHl5dHJhbnNsYXRlW3hdIDogMTgpCisKKy8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPQoreworICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNSwgICAgIDIsCisgICAgICAxNCwgICAgMTUsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgIDEzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDYsICAgICA3LCAgICAgOCwKKyAgICAgICA5LCAgICAxMQorfTsKKworI2lmIFlZREVCVUcKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9Cit7CisgICAgICAgMCwgICAgIDAsICAgICAyLCAgICAgOCwgICAgMTIsICAgIDE2LCAgICAyMCwgICAgMjQsICAgIDI4LCAgICAzMiwKKyAgICAgIDM1LCAgICAzNywgICAgMzkKK307CitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9Cit7CisgICAgICAxNywgICAgIDAsICAgIDE3LCAgICAgMywgICAgMTcsICAgIDEyLCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgNCwKKyAgICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA1LCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgNiwgICAgMTcsICAgICAwLAorICAgICAgMTcsICAgICA3LCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgOCwgICAgMTcsICAgICAwLCAgICAxNywgICAgIDksCisgICAgICAxNywgICAgIDAsICAgIDEwLCAgICAxNywgICAgIDAsICAgIDEzLCAgICAgMCwgICAgMTEsICAgICAwLCAgICAxNCwKKyAgICAgIDE3LCAgICAxNSwgICAgIDAKK307CisKKyNlbmRpZgorCisjaWYgWVlERUJVRworLyogWVlSTElORVtZWU5dIC0tIHNvdXJjZSBsaW5lIHdoZXJlIHJ1bGUgbnVtYmVyIFlZTiB3YXMgZGVmaW5lZC4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPQoreworICAgICAgIDAsICAgMTUwLCAgIDE1OCwgICAxNjIsICAgMTY2LCAgIDE3MCwgICAxNzQsICAgMTc4LCAgIDE4MiwgICAxODYsCisgICAgIDE5MCwgICAxOTQsICAgMTk5Cit9OworI2VuZGlmCisKKworI2lmIChZWURFQlVHKSB8fCBkZWZpbmVkIFlZRVJST1JfVkVSQk9TRQorCisvKiBZWVROQU1FW1RPS0VOX05VTV0gLS0gU3RyaW5nIG5hbWUgb2YgdGhlIHRva2VuIFRPS0VOX05VTS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB5eXRuYW1lW10gPQoreworICAiJCIsICJlcnJvciIsICIkdW5kZWZpbmVkLiIsICInPyciLCAiJ3wnIiwgIicmJyIsICJFUVVPUDIiLCAiQ01QT1AyIiwKKyAgIkFERE9QMiIsICJNVUxPUDIiLCAiJyEnIiwgIk5VTUJFUiIsICInOiciLCAiJ24nIiwgIicoJyIsICInKSciLAorICAic3RhcnQiLCAiZXhwIiwgMAorfTsKKyNlbmRpZgorCisvKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9Cit7CisgICAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywKKyAgICAgIDE3LCAgICAxNywgICAgMTcKK307CisKKy8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5cjJbXSA9Cit7CisgICAgICAgMCwgICAgIDEsICAgICA1LCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMiwKKyAgICAgICAxLCAgICAgMSwgICAgIDMKK307CisKKy8qIFlZREVGQUNUW1NdIC0tIGRlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZSBTIHdoZW4gWVlUQUJMRQorICAgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybyBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbgorICAgZXJyb3IuICovCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZhY3RbXSA9Cit7CisgICAgICAgMCwgICAgIDAsICAgIDExLCAgICAxMCwgICAgIDAsICAgICAxLCAgICAgOSwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTIsICAgICAwLCAgICAgMywgICAgIDQsICAgICA1LAorICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDAsICAgICAyLCAgICAgMCwgICAgIDAsICAgICAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPQoreworICAgICAgMjUsICAgICA1Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPQoreworICAgICAgLTksICAgIC05LC0zMjc2OCwtMzI3NjgsICAgIC05LCAgICAzNCwtMzI3NjgsICAgIDExLCAgICAtOSwgICAgLTksCisgICAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwgICAgLTksLTMyNzY4LCAgICAyNCwgICAgMzksICAgIDQzLCAgICAxNiwKKyAgICAgIDI2LCAgICAtMywtMzI3NjgsICAgIC05LCAgICAzNCwgICAgMjEsICAgIDUzLC0zMjc2OAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9Cit7CisgIC0zMjc2OCwgICAgLTEKK307CisKKworI2RlZmluZQlZWUxBU1QJCTUzCisKKworc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9Cit7CisgICAgICAgNiwgICAgIDEsICAgICAyLCAgICAgNywgICAgIDMsICAgICA0LCAgICAxNCwgICAgMTYsICAgIDE3LCAgICAxOCwKKyAgICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorICAgICAgMTQsICAgIDI2LCAgICAyNCwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgICA4LCAgICAgOSwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTMsICAgIDE0LCAgICAyMywgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDExLAorICAgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMjcKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPQoreworICAgICAgIDEsICAgIDEwLCAgICAxMSwgICAgIDQsICAgIDEzLCAgICAxNCwgICAgIDksICAgICA4LCAgICAgOSwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwKKyAgICAgICA5LCAgICAgMCwgICAgMjMsICAgICA3LCAgICAgOCwgICAgIDksICAgIDE1LCAgICAgMywgICAgIDQsICAgICA1LAorICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA4LCAgICAgOSwgICAgMTIsICAgICAzLCAgICAgNCwgICAgIDUsCisgICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAgNiwKKyAgICAgICA3LCAgICAgOCwgICAgIDksICAgICAwCit9OworI2RlZmluZSBZWVBVUkUgMQorCisvKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLworI2xpbmUgMyAiL3Vzci9sb2NhbC9zaGFyZS9iaXNvbi9iaXNvbi5zaW1wbGUiCisKKy8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAorCisgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQorICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KKyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCisKKy8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyIHdoZW4KKyAgIHRoZSAlc2VtYW50aWNfcGFyc2VyIGRlY2xhcmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIuCisgICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKKyAgIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCisKKy8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCisgICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKKyAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCisgICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCisgICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgorICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCisKKyNpZiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKKworLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLworCisjIGlmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjIGVsc2UKKyMgIGlmbmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgICBpZiBkZWZpbmVkIChhbGxvY2EpIHx8IGRlZmluZWQgKF9BTExPQ0FfSCkKKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZmRlZiBfX0dOVUNfXworIyAgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIFlZU1RBQ0tfQUxMT0MKKyAgIC8qIFBhY2lmeSBHQ0MncyBgZW1wdHkgaWYtYm9keScgd2FybmluZy4gKi8KKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlICgwKQorIyBlbHNlCisjICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjICBlbmRpZgorIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgbWFsbG9jCisjICBkZWZpbmUgWVlTVEFDS19GUkVFIGZyZWUKKyMgZW5kaWYKKyNlbmRpZiAvKiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkgKi8KKworCisjaWYgKCEgZGVmaW5lZCAoeXlvdmVyZmxvdykgXAorICAgICAmJiAoISBkZWZpbmVkIChfX2NwbHVzcGx1cykgXAorCSB8fCAoWVlMVFlQRV9JU19UUklWSUFMICYmIFlZU1RZUEVfSVNfVFJJVklBTCkpKQorCisvKiBBIHR5cGUgdGhhdCBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBhbnkgc3RhY2sgbWVtYmVyLiAgKi8KK3VuaW9uIHl5YWxsb2MKK3sKKyAgc2hvcnQgeXlzczsKKyAgWVlTVFlQRSB5eXZzOworIyBpZiBZWUxTUF9ORUVERUQKKyAgWVlMVFlQRSB5eWxzOworIyBlbmRpZgorfTsKKworLyogVGhlIHNpemUgb2YgdGhlIG1heGltdW0gZ2FwIGJldHdlZW4gb25lIGFsaWduZWQgc3RhY2sgYW5kIHRoZSBuZXh0LiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfR0FQX01BWCAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCisKKy8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAorICAgTiBlbGVtZW50cy4gICovCisjIGlmIFlZTFNQX05FRURFRAorIyAgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAorICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQpICsgc2l6ZW9mIChZWVNUWVBFKSArIHNpemVvZiAoWVlMVFlQRSkpCVwKKyAgICAgICsgMiAqIFlZU1RBQ0tfR0FQX01BWCkKKyMgZWxzZQorIyAgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAorICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQpICsgc2l6ZW9mIChZWVNUWVBFKSkJCQkJXAorICAgICAgKyBZWVNUQUNLX0dBUF9NQVgpCisjIGVuZGlmCisKKy8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbworICAgbm90IG92ZXJsYXAuICAqLworIyBpZm5kZWYgWVlDT1BZCisjICBpZiAxIDwgX19HTlVDX18KKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAorICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAorICAgICAgZG8JCQkJCVwKKwl7CQkJCQlcCisJICByZWdpc3RlciBZWVNJWkVfVCB5eWk7CQlcCisJICBmb3IgKHl5aSA9IDA7IHl5aSA8IChDb3VudCk7IHl5aSsrKQlcCisJICAgIChUbylbeXlpXSA9IChGcm9tKVt5eWldOwkJXAorCX0JCQkJCVwKKyAgICAgIHdoaWxlICgwKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogUmVsb2NhdGUgU1RBQ0sgZnJvbSBpdHMgb2xkIGxvY2F0aW9uIHRvIHRoZSBuZXcgb25lLiAgVGhlCisgICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKKyAgIGVsZW1lbnRzIGluIHRoZSBzdGFjaywgYW5kIFlZUFRSIGdpdmVzIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlCisgICBzdGFjay4gIEFkdmFuY2UgWVlQVFIgdG8gYSBwcm9wZXJseSBhbGlnbmVkIGxvY2F0aW9uIGZvciB0aGUgbmV4dAorICAgc3RhY2suICAqLworIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFjaykJCQkJCVwKKyAgICBkbwkJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCisJWVlDT1BZICgmeXlwdHItPlN0YWNrLCBTdGFjaywgeXlzaXplKTsJCQkJXAorCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCisJeXluZXdieXRlcyA9IHl5c3RhY2tzaXplICogc2l6ZW9mICgqU3RhY2spICsgWVlTVEFDS19HQVBfTUFYOwlcCisJeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICB3aGlsZSAoMCkKKworI2VuZGlmCisKKworI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKF9fU0laRV9UWVBFX18pCisjIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChzaXplX3QpCisjIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjIGVuZGlmCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQorIyBkZWZpbmUgWVlTSVpFX1QgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQorI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCisjZGVmaW5lIFlZRU1QVFkJCS0yCisjZGVmaW5lIFlZRU9GCQkwCisjZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKKyNkZWZpbmUgWVlBQk9SVCAJZ290byB5eWFib3J0bGFiCisjZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCisvKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4gIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5CisgICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgorICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLworI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKKyNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQorI2RlZmluZSBZWUJBQ0tVUChUb2tlbiwgVmFsdWUpCQkJCQlcCitkbwkJCQkJCQkJXAorICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIHl5Y2hhciA9IChUb2tlbik7CQkJCQkJXAorICAgICAgeXlsdmFsID0gKFZhbHVlKTsJCQkJCQlcCisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKKyAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAorICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCisgICAgfQkJCQkJCQkJXAorICBlbHNlCQkJCQkJCQlcCisgICAgeyAJCQkJCQkJCVwKKyAgICAgIHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7CQkJXAorICAgICAgWVlFUlJPUjsJCQkJCQkJXAorICAgIH0JCQkJCQkJCVwKK3doaWxlICgwKQorCisjZGVmaW5lIFlZVEVSUk9SCTEKKyNkZWZpbmUgWVlFUlJDT0RFCTI1NgorCisKKy8qIFlZTExPQ19ERUZBVUxUIC0tIENvbXB1dGUgdGhlIGRlZmF1bHQgbG9jYXRpb24gKGJlZm9yZSB0aGUgYWN0aW9ucworICAgYXJlIHJ1bikuCisKKyAgIFdoZW4gWVlMTE9DX0RFRkFVTFQgaXMgcnVuLCBDVVJSRU5UIGlzIHNldCB0aGUgbG9jYXRpb24gb2YgdGhlCisgICBmaXJzdCB0b2tlbi4gIEJ5IGRlZmF1bHQsIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciByYW5nZXMsIGV4dGVuZAorICAgaXRzIHJhbmdlIHRvIHRoZSBsYXN0IHN5bWJvbC4gICovCisKKyNpZm5kZWYgWVlMTE9DX0RFRkFVTFQKKyMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikgICAgICAgCVwKKyAgIEN1cnJlbnQubGFzdF9saW5lICAgPSBSaHNbTl0ubGFzdF9saW5lOwlcCisgICBDdXJyZW50Lmxhc3RfY29sdW1uID0gUmhzW05dLmxhc3RfY29sdW1uOworI2VuZGlmCisKKworLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCisKKyNpZiBZWVBVUkUKKyMgaWYgWVlMU1BfTkVFREVECisjICBpZmRlZiBZWUxFWF9QQVJBTQorIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwsICZ5eWxsb2MpCisjICBlbmRpZgorIyBlbHNlIC8qICFZWUxTUF9ORUVERUQgKi8KKyMgIGlmZGVmIFlZTEVYX1BBUkFNCisjICAgZGVmaW5lIFlZTEVYCQl5eWxleCAoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCisjICBlbHNlCisjICAgZGVmaW5lIFlZTEVYCQl5eWxleCAoJnl5bHZhbCkKKyMgIGVuZGlmCisjIGVuZGlmIC8qICFZWUxTUF9ORUVERUQgKi8KKyNlbHNlIC8qICFZWVBVUkUgKi8KKyMgZGVmaW5lIFlZTEVYCQkJeXlsZXggKCkKKyNlbmRpZiAvKiAhWVlQVVJFICovCisKKworLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLworI2lmIFlZREVCVUcKKworIyBpZm5kZWYgWVlGUFJJTlRGCisjICBpbmNsdWRlIDxzdGRpby5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlGUFJJTlRGIGZwcmludGYKKyMgZW5kaWYKKworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCQkJXAorZG8gewkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQlcCisgICAgWVlGUFJJTlRGIEFyZ3M7CQkJCVwKK30gd2hpbGUgKDApCisvKiBOb256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlLiAgSXQgaXMgbGVmdCB1bmluaXRpYWxpemVkIHNvIHRoYXQKKyAgIG11bHRpcGxlIHBhcnNlcnMgY2FuIGNvZXhpc3QuICAqLworaW50IHl5ZGVidWc7CisjZWxzZSAvKiAhWVlERUJVRyAqLworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCisjZW5kaWYgLyogIVlZREVCVUcgKi8KKworLyogWVlJTklUREVQVEggLS0gaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MuICAqLworI2lmbmRlZglZWUlOSVRERVBUSAorIyBkZWZpbmUgWVlJTklUREVQVEggMjAwCisjZW5kaWYKKworLyogWVlNQVhERVBUSCAtLSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0byAoZWZmZWN0aXZlIG9ubHkKKyAgIGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLgorCisgICBEbyBub3QgbWFrZSB0aGlzIHZhbHVlIHRvbyBsYXJnZTsgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpZgorICAgU0laRV9NQVggPCBZWVNUQUNLX0JZVEVTIChZWU1BWERFUFRIKQorICAgZXZhbHVhdGVkIHdpdGggaW5maW5pdGUtcHJlY2lzaW9uIGludGVnZXIgYXJpdGhtZXRpYy4gICovCisKKyNpZiBZWU1BWERFUFRIID09IDAKKyMgdW5kZWYgWVlNQVhERVBUSAorI2VuZGlmCisKKyNpZm5kZWYgWVlNQVhERVBUSAorIyBkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAorI2VuZGlmCisKKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKworIyBpZm5kZWYgeXlzdHJsZW4KKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKQorIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KKyMgIGVsc2UKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFlZU1RSLiAgKi8KK3N0YXRpYyBZWVNJWkVfVAorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKKyMgICBlbHNlCit5eXN0cmxlbiAoeXlzdHIpCisgICAgIGNvbnN0IGNoYXIgKnl5c3RyOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3RyOworCisgIHdoaWxlICgqeXlzKysgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlzIC0geXlzdHIgLSAxOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgeXlzdHBjcHkKKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKSAmJiBkZWZpbmVkIChfR05VX1NPVVJDRSkKKyMgICBkZWZpbmUgeXlzdHBjcHkgc3RwY3B5CisjICBlbHNlCisvKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCisgICBZWURFU1QuICAqLworc3RhdGljIGNoYXIgKgorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQorIyAgIGVsc2UKK3l5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQorICAgICBjaGFyICp5eWRlc3Q7CisgICAgIGNvbnN0IGNoYXIgKnl5c3JjOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzcmM7CisKKyAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5ZCAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNsaW5lIDMxNSAiL3Vzci9sb2NhbC9zaGFyZS9iaXNvbi9iaXNvbi5zaW1wbGUiCisKKworLyogVGhlIHVzZXIgY2FuIGRlZmluZSBZWVBBUlNFX1BBUkFNIGFzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAorICAgaW50byB5eXBhcnNlLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIHR5cGUgdm9pZCAqLgorICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KKyAgIEdyYW1tYXIgYWN0aW9ucyBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSBieSBjYXN0aW5nIGl0CisgICB0byB0aGUgcHJvcGVyIHBvaW50ZXIgdHlwZS4gICovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCisjIGVsc2UKKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07CisjIGVuZGlmCisjZWxzZSAvKiAhWVlQQVJTRV9QQVJBTSAqLworIyBkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKKyMgZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorI2VuZGlmIC8qICFZWVBBUlNFX1BBUkFNICovCisKKy8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBpZmRlZiBZWVBBUlNFX1BBUkFNCitpbnQgeXlwYXJzZSAodm9pZCAqKTsKKyMgZWxzZQoraW50IHl5cGFyc2UgKHZvaWQpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIFlZX0RFQ0xfVkFSSUFCTEVTIC0tIGRlcGVuZGluZyB3aGV0aGVyIHdlIHVzZSBhIHB1cmUgcGFyc2VyLAorICAgdmFyaWFibGVzIGFyZSBnbG9iYWwsIG9yIGxvY2FsIHRvIFlZUEFSU0UuICAqLworCisjZGVmaW5lIFlZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMJCQlcCisvKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCQkJCVwKK2ludCB5eWNoYXI7CQkJCQkJXAorCQkJCQkJCVwKKy8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9va2FoZWFkIHN5bWJvbC4gKi8JXAorWVlTVFlQRSB5eWx2YWw7CQkJCQkJXAorCQkJCQkJCVwKKy8qIE51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyLiAgKi8JCQlcCitpbnQgeXluZXJyczsKKworI2lmIFlZTFNQX05FRURFRAorIyBkZWZpbmUgWVlfREVDTF9WQVJJQUJMRVMJCQlcCitZWV9ERUNMX05PTl9MU1BfVkFSSUFCTEVTCQkJXAorCQkJCQkJXAorLyogTG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwlcCitZWUxUWVBFIHl5bGxvYzsKKyNlbHNlCisjIGRlZmluZSBZWV9ERUNMX1ZBUklBQkxFUwkJCVwKK1lZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMKKyNlbmRpZgorCisKKy8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlLiAqLworCisjaWYgIVlZUFVSRQorWVlfREVDTF9WQVJJQUJMRVMKKyNlbmRpZiAgLyogIVlZUFVSRSAqLworCitpbnQKK3l5cGFyc2UgKFlZUEFSU0VfUEFSQU1fQVJHKQorICAgICBZWVBBUlNFX1BBUkFNX0RFQ0wKK3sKKyAgLyogSWYgcmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUuICovCisjaWYgWVlQVVJFCisgIFlZX0RFQ0xfVkFSSUFCTEVTCisjZW5kaWYgIC8qICFZWVBVUkUgKi8KKworICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKKyAgcmVnaXN0ZXIgaW50IHl5bjsKKyAgaW50IHl5cmVzdWx0OworICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KKyAgaW50IHl5ZXJyc3RhdHVzOworICAvKiBMb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlci4gICovCisgIGludCB5eWNoYXIxID0gMDsKKworICAvKiBUaHJlZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLAorICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLAorICAgICBgeXlscyc6IHJlbGF0ZWQgdG8gbG9jYXRpb25zLgorCisgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KKworICAvKiBUaGUgc3RhdGUgc3RhY2suICovCisgIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsKKyAgc2hvcnQgKnl5c3MgPSB5eXNzYTsKKyAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOworCisgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOworICBZWVNUWVBFICp5eXZzID0geXl2c2E7CisgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworCisjaWYgWVlMU1BfTkVFREVECisgIC8qIFRoZSBsb2NhdGlvbiBzdGFjay4gICovCisgIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOworICBZWUxUWVBFICp5eWxzID0geXlsc2E7CisgIFlZTFRZUEUgKnl5bHNwOworI2VuZGlmCisKKyNpZiBZWUxTUF9ORUVERUQKKyMgZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSwgeXlsc3AtLSkKKyNlbHNlCisjIGRlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisjZW5kaWYKKworICBZWVNJWkVfVCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCisKKyAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKKyAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KKyAgWVlTVFlQRSB5eXZhbDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgWVlMVFlQRSB5eWxvYzsKKyNlbmRpZgorCisgIC8qIFdoZW4gcmVkdWNpbmcsIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkCisgICAgIHJ1bGUuICovCisgIGludCB5eWxlbjsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIikpOworCisgIHl5c3RhdGUgPSAwOworICB5eWVycnN0YXR1cyA9IDA7CisgIHl5bmVycnMgPSAwOworICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KKworICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgorICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKKyAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgorICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCisKKyAgeXlzc3AgPSB5eXNzOworICB5eXZzcCA9IHl5dnM7CisjaWYgWVlMU1BfTkVFREVECisgIHl5bHNwID0geXlsczsKKyNlbmRpZgorICBnb3RvIHl5c2V0c3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB5eW5ld3N0YXRlOgorICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuCisgICAgICovCisgIHl5c3NwKys7CisKKyB5eXNldHN0YXRlOgorICAqeXlzc3AgPSB5eXN0YXRlOworCisgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLworICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIHsKKwkvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2suIFVzZSBjb3BpZXMgb2YKKwkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCisJICAgbWVtb3J5LiAgKi8KKwlZWVNUWVBFICp5eXZzMSA9IHl5dnM7CisJc2hvcnQgKnl5c3MxID0geXlzczsKKworCS8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mIHRoZQorCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgKi8KKyMgaWYgWVlMU1BfTkVFREVECisJWVlMVFlQRSAqeXlsczEgPSB5eWxzOworCS8qIFRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywKKwkgICBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKwl5eW92ZXJmbG93ICgicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAorCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisJCSAgICAmeXlsczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisJeXlscyA9IHl5bHMxOworIyBlbHNlCisJeXlvdmVyZmxvdyAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCisJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAorCQkgICAgJnl5c3RhY2tzaXplKTsKKyMgZW5kaWYKKwl5eXNzID0geXlzczE7CisJeXl2cyA9IHl5dnMxOworICAgICAgfQorI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLworIyBpZm5kZWYgWVlTVEFDS19SRUxPQ0FURQorICAgICAgZ290byB5eW92ZXJmbG93bGFiOworIyBlbHNlCisgICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KKyAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQorCWdvdG8geXlvdmVyZmxvd2xhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXNob3J0ICp5eXNzMSA9IHl5c3M7CisJdW5pb24geXlhbGxvYyAqeXlwdHIgPQorCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKKwlpZiAoISB5eXB0cikKKwkgIGdvdG8geXlvdmVyZmxvd2xhYjsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXZzKTsKKyMgaWYgWVlMU1BfTkVFREVECisJWVlTVEFDS19SRUxPQ0FURSAoeXlscyk7CisjIGVuZGlmCisjIHVuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKwlpZiAoeXlzczEgIT0geXlzc2EpCisJICBZWVNUQUNLX0ZSRUUgKHl5c3MxKTsKKyAgICAgIH0KKyMgZW5kaWYKKyNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCisKKyAgICAgIHl5c3NwID0geXlzcyArIHl5c2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyB5eXNpemUgLSAxOworI2lmIFlZTFNQX05FRURFRAorICAgICAgeXlsc3AgPSB5eWxzICsgeXlzaXplIC0gMTsKKyNlbmRpZgorCisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOworCisgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKwlZWUFCT1JUOworICAgIH0KKworICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOworCisgIGdvdG8geXliYWNrdXA7CisKKworLyotLS0tLS0tLS0tLS4KK3wgeXliYWNrdXAuICB8CitgLS0tLS0tLS0tLS0qLworeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCisgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOworICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCisKKyAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCisgICAgeworICAgICAgeXljaGFyMSA9IDA7CisgICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisKKyNpZiBZWURFQlVHCisgICAgIC8qIFdlIGhhdmUgdG8ga2VlcCB0aGlzIGAjaWYgWVlERUJVRycsIHNpbmNlIHdlIHVzZSB2YXJpYWJsZXMKKwl3aGljaCBhcmUgZGVmaW5lZCBvbmx5IGlmIGBZWURFQlVHJyBpcyBzZXQuICAqLworICAgICAgaWYgKHl5ZGVidWcpCisJeworCSAgWVlGUFJJTlRGIChzdGRlcnIsICJOZXh0IHRva2VuIGlzICVkICglcyIsCisJCSAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKwkgIC8qIEdpdmUgdGhlIGluZGl2aWR1YWwgcGFyc2VyIGEgd2F5IHRvIHByaW50IHRoZSBwcmVjaXNlCisJICAgICBtZWFuaW5nIG9mIGEgdG9rZW4sIGZvciBmdXJ0aGVyIGRlYnVnZ2luZyBpbmZvLiAgKi8KKyMgaWZkZWYgWVlQUklOVAorCSAgWVlQUklOVCAoc3RkZXJyLCB5eWNoYXIsIHl5bHZhbCk7CisjIGVuZGlmCisJICBZWUZQUklOVEYgKHN0ZGVyciwgIilcbiIpOworCX0KKyNlbmRpZgorICAgIH0KKworICB5eW4gKz0geXljaGFyMTsKKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIHl5biA9IHl5dGFibGVbeXluXTsKKworICAvKiB5eW4gaXMgd2hhdCB0byBkbyBmb3IgdGhpcyB0b2tlbiB0eXBlIGluIHRoaXMgc3RhdGUuCisgICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KKyAgICAgUG9zaXRpdmUgPT4gc2hpZnQsIHl5biBpcyBuZXcgc3RhdGUuCisgICAgICAgTmV3IHN0YXRlIGlzIGZpbmFsIHN0YXRlID0+IGRvbid0IGJvdGhlciB0byBzaGlmdCwKKyAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgorICAgICAwLCBvciBtb3N0IG5lZ2F0aXZlIG51bWJlciA9PiBlcnJvci4gICovCisKKyAgaWYgKHl5biA8IDApCisgICAgeworICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCisJZ290byB5eWVycmxhYjsKKyAgICAgIHl5biA9IC15eW47CisgICAgICBnb3RvIHl5cmVkdWNlOworICAgIH0KKyAgZWxzZSBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKworICBpZiAoeXluID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlNoaWZ0aW5nIHRva2VuICVkICglcyksICIsCisJICAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKSk7CisKKyAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KKyAgaWYgKHl5Y2hhciAhPSBZWUVPRikKKyAgICB5eWNoYXIgPSBZWUVNUFRZOworCisgICorK3l5dnNwID0geXlsdmFsOworI2lmIFlZTFNQX05FRURFRAorICAqKyt5eWxzcCA9IHl5bGxvYzsKKyNlbmRpZgorCisgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKKyAgICAgc3RhdHVzLiAgKi8KKyAgaWYgKHl5ZXJyc3RhdHVzKQorICAgIHl5ZXJyc3RhdHVzLS07CisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZGVmYXVsdCAtLSBkbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZGVmYXVsdDoKKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gMCkKKyAgICBnb3RvIHl5ZXJybGFiOworICBnb3RvIHl5cmVkdWNlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cmVkdWNlIC0tIERvIGEgcmVkdWN0aW9uLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5cmVkdWNlOgorICAvKiB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworICB5eWxlbiA9IHl5cjJbeXluXTsKKworICAvKiBJZiBZWUxFTiBpcyBub256ZXJvLCBpbXBsZW1lbnQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbjoKKyAgICAgYCQkID0gJDEnLgorCisgICAgIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNldHMgWVlWQUwgdG8gdGhlIHNlbWFudGljIHZhbHVlIG9mCisgICAgIHRoZSBsb29rYWhlYWQgdG9rZW4uICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKyAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCisgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCisgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisKKyNpZiBZWUxTUF9ORUVERUQKKyAgLyogU2ltaWxhcmx5IGZvciB0aGUgZGVmYXVsdCBsb2NhdGlvbi4gIExldCB0aGUgdXNlciBydW4gYWRkaXRpb25hbAorICAgICBjb21tYW5kcyBpZiBmb3IgaW5zdGFuY2UgbG9jYXRpb25zIGFyZSByYW5nZXMuICAqLworICB5eWxvYyA9IHl5bHNwWzEteXlsZW5dOworICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWxzcCAtIHl5bGVuKSwgeXlsZW4pOworI2VuZGlmCisKKyNpZiBZWURFQlVHCisgIC8qIFdlIGhhdmUgdG8ga2VlcCB0aGlzIGAjaWYgWVlERUJVRycsIHNpbmNlIHdlIHVzZSB2YXJpYWJsZXMgd2hpY2gKKyAgICAgYXJlIGRlZmluZWQgb25seSBpZiBgWVlERUJVRycgaXMgc2V0LiAgKi8KKyAgaWYgKHl5ZGVidWcpCisgICAgeworICAgICAgaW50IHl5aTsKKworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJSZWR1Y2luZyB2aWEgcnVsZSAlZCAobGluZSAlZCksICIsCisJCSB5eW4sIHl5cmxpbmVbeXluXSk7CisKKyAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICAgICAgZm9yICh5eWkgPSB5eXByaHNbeXluXTsgeXlyaHNbeXlpXSA+IDA7IHl5aSsrKQorCVlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1t5eWldXSk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKKyAgICB9CisjZW5kaWYKKworICBzd2l0Y2ggKHl5bikgeworCitjYXNlIDE6CisjbGluZSAxNTEgInBsdXJhbC55IgoreworCSAgICBpZiAoeXl2c3BbMF0uZXhwID09IE5VTEwpCisJICAgICAgWVlBQk9SVDsKKwkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSB5eXZzcFswXS5leHA7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDI6CisjbGluZSAxNTkgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzMgKHFtb3AsIHl5dnNwWy00XS5leHAsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDM6CisjbGluZSAxNjMgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKGxvciwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgNDoKKyNsaW5lIDE2NyAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAobGFuZCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgNToKKyNsaW5lIDE3MSAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSA2OgorI2xpbmUgMTc1ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yICh5eXZzcFstMV0ub3AsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDc6CisjbGluZSAxNzkgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKHl5dnNwWy0xXS5vcCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgODoKKyNsaW5lIDE4MyAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSA5OgorI2xpbmUgMTg3ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8xIChsbm90LCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSAxMDoKKyNsaW5lIDE5MSAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMCAodmFyKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgMTE6CisjbGluZSAxOTUgInBsdXJhbC55IgoreworCSAgICBpZiAoKHl5dmFsLmV4cCA9IG5ld19leHBfMCAobnVtKSkgIT0gTlVMTCkKKwkgICAgICB5eXZhbC5leHAtPnZhbC5udW0gPSB5eXZzcFswXS5udW07CisJICB9CisgICAgYnJlYWs7CitjYXNlIDEyOgorI2xpbmUgMjAwICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0geXl2c3BbLTFdLmV4cDsKKwkgIH0KKyAgICBicmVhazsKK30KKworI2xpbmUgNzA1ICIvdXNyL2xvY2FsL3NoYXJlL2Jpc29uL2Jpc29uLnNpbXBsZSIKKworCisgIHl5dnNwIC09IHl5bGVuOworICB5eXNzcCAtPSB5eWxlbjsKKyNpZiBZWUxTUF9ORUVERUQKKyAgeXlsc3AgLT0geXlsZW47CisjZW5kaWYKKworI2lmIFlZREVCVUcKKyAgaWYgKHl5ZGVidWcpCisgICAgeworICAgICAgc2hvcnQgKnl5c3NwMSA9IHl5c3MgLSAxOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKKyAgICAgIHdoaWxlICh5eXNzcDEgIT0geXlzc3ApCisJWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCAqKyt5eXNzcDEpOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOworICAgIH0KKyNlbmRpZgorCisgICorK3l5dnNwID0geXl2YWw7CisjaWYgWVlMU1BfTkVFREVECisgICorK3l5bHNwID0geXlsb2M7CisjZW5kaWYKKworICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQorICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKKyAgICAgbnVtYmVyIHJlZHVjZWQgYnkuICAqLworCisgIHl5biA9IHl5cjFbeXluXTsKKworICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UQkFTRV0gKyAqeXlzc3A7CisgIGlmICh5eXN0YXRlID49IDAgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCisgICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07CisgIGVsc2UKKyAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRCQVNFXTsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWI6CisgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLworICBpZiAoIXl5ZXJyc3RhdHVzKQorICAgIHsKKyAgICAgICsreXluZXJyczsKKworI2lmZGVmIFlZRVJST1JfVkVSQk9TRQorICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOworCisgICAgICBpZiAoeXluID4gWVlGTEFHICYmIHl5biA8IFlZTEFTVCkKKwl7CisJICBZWVNJWkVfVCB5eXNpemUgPSAwOworCSAgY2hhciAqeXltc2c7CisJICBpbnQgeXl4LCB5eWNvdW50OworCisJICB5eWNvdW50ID0gMDsKKwkgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKwkgICAgIFlZQ0hFQ0suICAqLworCSAgZm9yICh5eXggPSB5eW4gPCAwID8gLXl5biA6IDA7CisJICAgICAgIHl5eCA8IChpbnQpIChzaXplb2YgKHl5dG5hbWUpIC8gc2l6ZW9mIChjaGFyICopKTsgeXl4KyspCisJICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4KQorCSAgICAgIHl5c2l6ZSArPSB5eXN0cmxlbiAoeXl0bmFtZVt5eXhdKSArIDE1LCB5eWNvdW50Kys7CisJICB5eXNpemUgKz0geXlzdHJsZW4gKCJwYXJzZSBlcnJvciwgdW5leHBlY3RlZCAiKSArIDE7CisJICB5eXNpemUgKz0geXlzdHJsZW4gKHl5dG5hbWVbWVlUUkFOU0xBVEUgKHl5Y2hhcildKTsKKwkgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlzaXplKTsKKwkgIGlmICh5eW1zZyAhPSAwKQorCSAgICB7CisJICAgICAgY2hhciAqeXlwID0geXlzdHBjcHkgKHl5bXNnLCAicGFyc2UgZXJyb3IsIHVuZXhwZWN0ZWQgIik7CisJICAgICAgeXlwID0geXlzdHBjcHkgKHl5cCwgeXl0bmFtZVtZWVRSQU5TTEFURSAoeXljaGFyKV0pOworCisJICAgICAgaWYgKHl5Y291bnQgPCA1KQorCQl7CisJCSAgeXljb3VudCA9IDA7CisJCSAgZm9yICh5eXggPSB5eW4gPCAwID8gLXl5biA6IDA7CisJCSAgICAgICB5eXggPCAoaW50KSAoc2l6ZW9mICh5eXRuYW1lKSAvIHNpemVvZiAoY2hhciAqKSk7CisJCSAgICAgICB5eXgrKykKKwkJICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4KQorCQkgICAgICB7CisJCQljb25zdCBjaGFyICp5eXEgPSAhIHl5Y291bnQgPyAiLCBleHBlY3RpbmcgIiA6ICIgb3IgIjsKKwkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5cSk7CisJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5eF0pOworCQkJeXljb3VudCsrOworCQkgICAgICB9CisJCX0KKwkgICAgICB5eWVycm9yICh5eW1zZyk7CisJICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeXllcnJvciAoInBhcnNlIGVycm9yOyBhbHNvIHZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpICovCisJeXllcnJvciAoInBhcnNlIGVycm9yIik7CisgICAgfQorICBnb3RvIHl5ZXJybGFiMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYjEgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjE6CisgIGlmICh5eWVycnN0YXR1cyA9PSAzKQorICAgIHsKKyAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KKwkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLworCisgICAgICAvKiByZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQgKi8KKyAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCisJWVlBQk9SVDsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIkRpc2NhcmRpbmcgdG9rZW4gJWQgKCVzKS5cbiIsCisJCSAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKSk7CisgICAgICB5eWNoYXIgPSBZWUVNUFRZOworICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKKyAgICAgdG9rZW4uICAqLworCisgIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLworCisgIGdvdG8geXllcnJoYW5kbGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmRlZmF1bHQgLS0gY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGUgfAorfCBlcnJvciB0b2tlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJkZWZhdWx0OgorI2lmIDAKKyAgLyogVGhpcyBpcyB3cm9uZzsgb25seSBzdGF0ZXMgdGhhdCBleHBsaWNpdGx5IHdhbnQgZXJyb3IgdG9rZW5zCisgICAgIHNob3VsZCBzaGlmdCB0aGVtLiAgKi8KKworICAvKiBJZiBpdHMgZGVmYXVsdCBpcyB0byBhY2NlcHQgYW55IHRva2VuLCBvay4gIE90aGVyd2lzZSBwb3AgaXQuICAqLworICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5bikKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycnBvcCAtLSBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSB8Cit8IGVycm9yIHRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJwb3A6CisgIGlmICh5eXNzcCA9PSB5eXNzKQorICAgIFlZQUJPUlQ7CisgIHl5dnNwLS07CisgIHl5c3RhdGUgPSAqLS15eXNzcDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgeXlsc3AtLTsKKyNlbmRpZgorCisjaWYgWVlERUJVRworICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBzaG9ydCAqeXlzc3AxID0geXlzcyAtIDE7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIkVycm9yOiBzdGF0ZSBzdGFjayBub3ciKTsKKyAgICAgIHdoaWxlICh5eXNzcDEgIT0geXlzc3ApCisJWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCAqKyt5eXNzcDEpOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOworICAgIH0KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmhhbmRsZS4gIHwKK2AtLS0tLS0tLS0tLS0tLSovCit5eWVycmhhbmRsZToKKyAgeXluID0geXlwYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IFlZRkxBRykKKyAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKKworICB5eW4gKz0gWVlURVJST1I7CisgIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0gWVlURVJST1IpCisgICAgZ290byB5eWVycmRlZmF1bHQ7CisKKyAgeXluID0geXl0YWJsZVt5eW5dOworICBpZiAoeXluIDwgMCkKKyAgICB7CisgICAgICBpZiAoeXluID09IFlZRkxBRykKKwlnb3RvIHl5ZXJycG9wOworICAgICAgeXluID0gLXl5bjsKKyAgICAgIGdvdG8geXlyZWR1Y2U7CisgICAgfQorICBlbHNlIGlmICh5eW4gPT0gMCkKKyAgICBnb3RvIHl5ZXJycG9wOworCisgIGlmICh5eW4gPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIikpOworCisgICorK3l5dnNwID0geXlsdmFsOworI2lmIFlZTFNQX05FRURFRAorICAqKyt5eWxzcCA9IHl5bGxvYzsKKyNlbmRpZgorCisgIHl5c3RhdGUgPSB5eW47CisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5YWNjZXB0bGFiIC0tIFlZQUNDRVBUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWFjY2VwdGxhYjoKKyAgeXlyZXN1bHQgPSAwOworICBnb3RvIHl5cmV0dXJuOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFib3J0bGFiIC0tIFlZQUJPUlQgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWFib3J0bGFiOgorICB5eXJlc3VsdCA9IDE7CisgIGdvdG8geXlyZXR1cm47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW92ZXJmbG93YWIgLS0gcGFyc2VyIG92ZXJmbG93IGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5b3ZlcmZsb3dsYWI6CisgIHl5ZXJyb3IgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKKyAgeXlyZXN1bHQgPSAyOworICAvKiBGYWxsIHRocm91Z2guICAqLworCit5eXJldHVybjoKKyNpZm5kZWYgeXlvdmVyZmxvdworICBpZiAoeXlzcyAhPSB5eXNzYSkKKyAgICBZWVNUQUNLX0ZSRUUgKHl5c3MpOworI2VuZGlmCisgIHJldHVybiB5eXJlc3VsdDsKK30KKyNsaW5lIDIwNSAicGx1cmFsLnkiCisKKwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK0ZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKK3sKKyAgaWYgKGV4cCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBIYW5kbGUgdGhlIHJlY3Vyc2l2ZSBjYXNlLiAgKi8KKyAgc3dpdGNoIChleHAtPm5hcmdzKQorICAgIHsKKyAgICBjYXNlIDM6CisgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMl0pOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIDI6CisgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMV0pOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIDE6CisgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMF0pOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIGZyZWUgKGV4cCk7Cit9CisKKworc3RhdGljIGludAoreXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKQoreworICBjb25zdCBjaGFyICpleHAgPSAqcGV4cDsKKyAgaW50IHJlc3VsdDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoZXhwWzBdID09ICdcMCcpCisJeworCSAgKnBleHAgPSBleHA7CisJICByZXR1cm4gWVlFT0Y7CisJfQorCisgICAgICBpZiAoZXhwWzBdICE9ICcgJyAmJiBleHBbMF0gIT0gJ1x0JykKKwlicmVhazsKKworICAgICAgKytleHA7CisgICAgfQorCisgIHJlc3VsdCA9ICpleHArKzsKKyAgc3dpdGNoIChyZXN1bHQpCisgICAgeworICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICB7CisJdW5zaWduZWQgbG9uZyBpbnQgbiA9IHJlc3VsdCAtICcwJzsKKwl3aGlsZSAoZXhwWzBdID49ICcwJyAmJiBleHBbMF0gPD0gJzknKQorCSAgeworCSAgICBuICo9IDEwOworCSAgICBuICs9IGV4cFswXSAtICcwJzsKKwkgICAgKytleHA7CisJICB9CisJbHZhbC0+bnVtID0gbjsKKwlyZXN1bHQgPSBOVU1CRVI7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJz0nOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGVxdWFsOworCSAgcmVzdWx0ID0gRVFVT1AyOworCX0KKyAgICAgIGVsc2UKKwlyZXN1bHQgPSBZWUVSUkNPREU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyEnOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IG5vdF9lcXVhbDsKKwkgIHJlc3VsdCA9IEVRVU9QMjsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyYnOgorICAgIGNhc2UgJ3wnOgorICAgICAgaWYgKGV4cFswXSA9PSByZXN1bHQpCisJKytleHA7CisgICAgICBlbHNlCisJcmVzdWx0ID0gWVlFUlJDT0RFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc8JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBsZXNzX29yX2VxdWFsOworCX0KKyAgICAgIGVsc2UKKwlsdmFsLT5vcCA9IGxlc3NfdGhhbjsKKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPic6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gZ3JlYXRlcl9vcl9lcXVhbDsKKwl9CisgICAgICBlbHNlCisJbHZhbC0+b3AgPSBncmVhdGVyX3RoYW47CisgICAgICByZXN1bHQgPSBDTVBPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyonOgorICAgICAgbHZhbC0+b3AgPSBtdWx0OworICAgICAgcmVzdWx0ID0gTVVMT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcvJzoKKyAgICAgIGx2YWwtPm9wID0gZGl2aWRlOworICAgICAgcmVzdWx0ID0gTVVMT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICclJzoKKyAgICAgIGx2YWwtPm9wID0gbW9kdWxlOworICAgICAgcmVzdWx0ID0gTVVMT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcrJzoKKyAgICAgIGx2YWwtPm9wID0gcGx1czsKKyAgICAgIHJlc3VsdCA9IEFERE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnLSc6CisgICAgICBsdmFsLT5vcCA9IG1pbnVzOworICAgICAgcmVzdWx0ID0gQURET1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICduJzoKKyAgICBjYXNlICc/JzoKKyAgICBjYXNlICc6JzoKKyAgICBjYXNlICcoJzoKKyAgICBjYXNlICcpJzoKKyAgICAgIC8qIE5vdGhpbmcsIGp1c3QgcmV0dXJuIHRoZSBjaGFyYWN0ZXIuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc7JzoKKyAgICBjYXNlICdcbic6CisgICAgY2FzZSAnXDAnOgorICAgICAgLyogQmUgc2FmZSBhbmQgbGV0IHRoZSB1c2VyIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2Fpbi4gICovCisgICAgICAtLWV4cDsKKyAgICAgIHJlc3VsdCA9IFlZRU9GOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gWVlFUlJDT0RFOworI2lmIFlZREVCVUcgIT0gMAorICAgICAgLS1leHA7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKworICAqcGV4cCA9IGV4cDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkCit5eWVycm9yIChjb25zdCBjaGFyICpzdHIpCit7CisgIC8qIERvIG5vdGhpbmcuICBXZSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlLiAgKi8KK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wbHVyYWwueSBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wbHVyYWwueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDMzYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3BsdXJhbC55CkBAIC0wLDAgKzEsMzgxIEBACisleworLyogRXhwcmVzc2lvbiBwYXJzaW5nIGZvciBwbHVyYWwgZm9ybSBzZWxlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUaGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNlciB1c2VzIGFsbG9jYS4gIEFJWCAzIGZvcmNlcyB1cyB0byBwdXQgdGhpcworICAgZGVjbGFyYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZSBkZWNsYXJhdGlvbiBpbiBiaXNvbidzCisgICBza2VsZXRvbiBmaWxlIGNvbWVzIHRvbyBsYXRlLiAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4KKyAgIGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZSBhcmJpdHJhcnkgc3lzdGVtIGhlYWRlcnMuICAqLworI2lmIGRlZmluZWQgX0FJWCAmJiAhZGVmaW5lZCBfX0dOVUNfXworICNwcmFnbWEgYWxsb2NhCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKKworLyogVGhlIG1haW4gZnVuY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIgaXMgY2FsbGVkIF9fZ2V0dGV4dHBhcnNlLAorICAgYnV0IHdlIHdhbnQgaXQgdG8gYmUgY2FsbGVkIFBMVVJBTF9QQVJTRS4gICovCisjaWZuZGVmIF9MSUJDCisjIGRlZmluZSBfX2dldHRleHRwYXJzZSBQTFVSQUxfUEFSU0UKKyNlbmRpZgorCisjZGVmaW5lIFlZTEVYX1BBUkFNCSYoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPmNwCisjZGVmaW5lIFlZUEFSU0VfUEFSQU0JYXJnCislfQorJXB1cmVfcGFyc2VyCislZXhwZWN0IDcKKworJXVuaW9uIHsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbnVtOworICBlbnVtIG9wZXJhdG9yIG9wOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworfQorCisleworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBpbnQgeXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKTsKK3N0YXRpYyB2b2lkIHl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qIEFsbG9jYXRpb24gb2YgZXhwcmVzc2lvbnMuICAqLworCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cCAoaW50IG5hcmdzLCBlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqIGNvbnN0ICphcmdzKQoreworICBpbnQgaTsKKyAgc3RydWN0IGV4cHJlc3Npb24gKm5ld3A7CisKKyAgLyogSWYgYW55IG9mIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgbWFsbG9jJ2VkLCBqdXN0IHJldHVybiBOVUxMLiAgKi8KKyAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKyAgICBpZiAoYXJnc1tpXSA9PSBOVUxMKQorICAgICAgZ290byBmYWlsOworCisgIC8qIEFsbG9jYXRlIGEgbmV3IGV4cHJlc3Npb24uICAqLworICBuZXdwID0gKHN0cnVjdCBleHByZXNzaW9uICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOworICBpZiAobmV3cCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5ld3AtPm5hcmdzID0gbmFyZ3M7CisgICAgICBuZXdwLT5vcGVyYXRpb24gPSBvcDsKKyAgICAgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisJbmV3cC0+dmFsLmFyZ3NbaV0gPSBhcmdzW2ldOworICAgICAgcmV0dXJuIG5ld3A7CisgICAgfQorCisgZmFpbDoKKyAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKyAgICBGUkVFX0VYUFJFU1NJT04gKGFyZ3NbaV0pOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMCAoZW51bSBvcGVyYXRvciBvcCkKK3sKKyAgcmV0dXJuIG5ld19leHAgKDAsIG9wLCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzEgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMV07CisKKyAgYXJnc1swXSA9IHJpZ2h0OworICByZXR1cm4gbmV3X2V4cCAoMSwgb3AsIGFyZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8yIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqbGVmdCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1syXTsKKworICBhcmdzWzBdID0gbGVmdDsKKyAgYXJnc1sxXSA9IHJpZ2h0OworICByZXR1cm4gbmV3X2V4cCAoMiwgb3AsIGFyZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMyAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmJleHAsCisJICAgc3RydWN0IGV4cHJlc3Npb24gKnRicmFuY2gsIHN0cnVjdCBleHByZXNzaW9uICpmYnJhbmNoKQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1szXTsKKworICBhcmdzWzBdID0gYmV4cDsKKyAgYXJnc1sxXSA9IHRicmFuY2g7CisgIGFyZ3NbMl0gPSBmYnJhbmNoOworICByZXR1cm4gbmV3X2V4cCAoMywgb3AsIGFyZ3MpOworfQorCislfQorCisvKiBUaGlzIGRlY2xhcmVzIHRoYXQgYWxsIG9wZXJhdG9ycyBoYXZlIHRoZSBzYW1lIGFzc29jaWF0aXZpdHkgYW5kIHRoZQorICAgcHJlY2VkZW5jZSBvcmRlciBhcyBpbiBDLiAgU2VlIFtIYXJiaXNvbiwgU3RlZWxlOiBDLCBBIFJlZmVyZW5jZSBNYW51YWxdLgorICAgVGhlcmUgaXMgbm8gdW5hcnkgbWludXMgYW5kIG5vIGJpdHdpc2Ugb3BlcmF0b3JzLgorICAgT3BlcmF0b3JzIHdpdGggdGhlIHNhbWUgc3ludGFjdGljIGJlaGF2aW91ciBoYXZlIGJlZW4gbWVyZ2VkIGludG8gYSBzaW5nbGUKKyAgIHRva2VuLCB0byBzYXZlIHNwYWNlIGluIHRoZSBhcnJheSBnZW5lcmF0ZWQgYnkgYmlzb24uICAqLworJXJpZ2h0ICc/JwkJLyogICA/CQkqLworJWxlZnQgJ3wnCQkvKiAgIHx8CQkqLworJWxlZnQgJyYnCQkvKiAgICYmCQkqLworJWxlZnQgRVFVT1AyCQkvKiAgID09ICE9CSovCislbGVmdCBDTVBPUDIJCS8qICAgPCA+IDw9ID49CSovCislbGVmdCBBRERPUDIJCS8qICAgKyAtCSovCislbGVmdCBNVUxPUDIJCS8qICAgKiAvICUJKi8KKyVyaWdodCAnIScJCS8qICAgIQkJKi8KKworJXRva2VuIDxvcD4gRVFVT1AyIENNUE9QMiBBRERPUDIgTVVMT1AyCisldG9rZW4gPG51bT4gTlVNQkVSCisldHlwZSA8ZXhwPiBleHAKKworJSUKKworc3RhcnQ6CSAgZXhwCisJICB7CisJICAgIGlmICgkMSA9PSBOVUxMKQorCSAgICAgIFlZQUJPUlQ7CisJICAgICgoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+cmVzID0gJDE7CisJICB9CisJOworCitleHA6CSAgZXhwICc/JyBleHAgJzonIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMyAocW1vcCwgJDEsICQzLCAkNSk7CisJICB9CisJfCBleHAgJ3wnIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMiAobG9yLCAkMSwgJDMpOworCSAgfQorCXwgZXhwICcmJyBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKGxhbmQsICQxLCAkMyk7CisJICB9CisJfCBleHAgRVFVT1AyIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7CisJICB9CisJfCBleHAgQ01QT1AyIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7CisJICB9CisJfCBleHAgQURET1AyIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7CisJICB9CisJfCBleHAgTVVMT1AyIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7CisJICB9CisJfCAnIScgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8xIChsbm90LCAkMik7CisJICB9CisJfCAnbicKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzAgKHZhcik7CisJICB9CisJfCBOVU1CRVIKKwkgIHsKKwkgICAgaWYgKCgkJCA9IG5ld19leHBfMCAobnVtKSkgIT0gTlVMTCkKKwkgICAgICAkJC0+dmFsLm51bSA9ICQxOworCSAgfQorCXwgJygnIGV4cCAnKScKKwkgIHsKKwkgICAgJCQgPSAkMjsKKwkgIH0KKwk7CisKKyUlCisKK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uCitGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCit7CisgIGlmIChleHAgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogSGFuZGxlIHRoZSByZWN1cnNpdmUgY2FzZS4gICovCisgIHN3aXRjaCAoZXhwLT5uYXJncykKKyAgICB7CisgICAgY2FzZSAzOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzJdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAyOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzFdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAxOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzBdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmcmVlIChleHApOworfQorCisKK3N0YXRpYyBpbnQKK3l5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCkKK3sKKyAgY29uc3QgY2hhciAqZXhwID0gKnBleHA7CisgIGludCByZXN1bHQ7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKGV4cFswXSA9PSAnXDAnKQorCXsKKwkgICpwZXhwID0gZXhwOworCSAgcmV0dXJuIFlZRU9GOworCX0KKworICAgICAgaWYgKGV4cFswXSAhPSAnICcgJiYgZXhwWzBdICE9ICdcdCcpCisJYnJlYWs7CisKKyAgICAgICsrZXhwOworICAgIH0KKworICByZXN1bHQgPSAqZXhwKys7CisgIHN3aXRjaCAocmVzdWx0KQorICAgIHsKKyAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgeworCXVuc2lnbmVkIGxvbmcgaW50IG4gPSByZXN1bHQgLSAnMCc7CisJd2hpbGUgKGV4cFswXSA+PSAnMCcgJiYgZXhwWzBdIDw9ICc5JykKKwkgIHsKKwkgICAgbiAqPSAxMDsKKwkgICAgbiArPSBleHBbMF0gLSAnMCc7CisJICAgICsrZXhwOworCSAgfQorCWx2YWwtPm51bSA9IG47CisJcmVzdWx0ID0gTlVNQkVSOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc9JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBlcXVhbDsKKwkgIHJlc3VsdCA9IEVRVU9QMjsKKwl9CisgICAgICBlbHNlCisJcmVzdWx0ID0gWVlFUlJDT0RFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICchJzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBub3RfZXF1YWw7CisJICByZXN1bHQgPSBFUVVPUDI7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcmJzoKKyAgICBjYXNlICd8JzoKKyAgICAgIGlmIChleHBbMF0gPT0gcmVzdWx0KQorCSsrZXhwOworICAgICAgZWxzZQorCXJlc3VsdCA9IFlZRVJSQ09ERTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPCc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gbGVzc19vcl9lcXVhbDsKKwl9CisgICAgICBlbHNlCisJbHZhbC0+b3AgPSBsZXNzX3RoYW47CisgICAgICByZXN1bHQgPSBDTVBPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGdyZWF0ZXJfb3JfZXF1YWw7CisJfQorICAgICAgZWxzZQorCWx2YWwtPm9wID0gZ3JlYXRlcl90aGFuOworICAgICAgcmVzdWx0ID0gQ01QT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcqJzoKKyAgICAgIGx2YWwtPm9wID0gbXVsdDsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnLyc6CisgICAgICBsdmFsLT5vcCA9IGRpdmlkZTsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJSc6CisgICAgICBsdmFsLT5vcCA9IG1vZHVsZTsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKyc6CisgICAgICBsdmFsLT5vcCA9IHBsdXM7CisgICAgICByZXN1bHQgPSBBRERPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy0nOgorICAgICAgbHZhbC0+b3AgPSBtaW51czsKKyAgICAgIHJlc3VsdCA9IEFERE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbic6CisgICAgY2FzZSAnPyc6CisgICAgY2FzZSAnOic6CisgICAgY2FzZSAnKCc6CisgICAgY2FzZSAnKSc6CisgICAgICAvKiBOb3RoaW5nLCBqdXN0IHJldHVybiB0aGUgY2hhcmFjdGVyLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnOyc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1wwJzoKKyAgICAgIC8qIEJlIHNhZmUgYW5kIGxldCB0aGUgdXNlciBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4uICAqLworICAgICAgLS1leHA7CisgICAgICByZXN1bHQgPSBZWUVPRjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9IFlZRVJSQ09ERTsKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIC0tZXhwOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICB9CisKKyAgKnBleHAgPSBleHA7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZAoreXllcnJvciAoY29uc3QgY2hhciAqc3RyKQoreworICAvKiBEbyBub3RoaW5nLiAgV2UgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZS4gICovCit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcHJpbnRmLWFyZ3MuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wcmludGYtYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjMyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcHJpbnRmLWFyZ3MuYwpAQCAtMCwwICsxLDExOSBAQAorLyogRGVjb21wb3NlZCBwcmludGYgYXJndW1lbnQgbGlzdC4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworLyogU3BlY2lmaWNhdGlvbi4gICovCisjaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKKworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZW5kaWYKK2ludAorcHJpbnRmX2ZldGNoYXJncyAodmFfbGlzdCBhcmdzLCBhcmd1bWVudHMgKmEpCit7CisgIHNpemVfdCBpOworICBhcmd1bWVudCAqYXA7CisKKyAgZm9yIChpID0gMCwgYXAgPSAmYS0+YXJnWzBdOyBpIDwgYS0+Y291bnQ7IGkrKywgYXArKykKKyAgICBzd2l0Y2ggKGFwLT50eXBlKQorICAgICAgeworICAgICAgY2FzZSBUWVBFX1NDSEFSOgorCWFwLT5hLmFfc2NoYXIgPSB2YV9hcmcgKGFyZ3MsIC8qc2lnbmVkIGNoYXIqLyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1VDSEFSOgorCWFwLT5hLmFfdWNoYXIgPSB2YV9hcmcgKGFyZ3MsIC8qdW5zaWduZWQgY2hhciovIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfU0hPUlQ6CisJYXAtPmEuYV9zaG9ydCA9IHZhX2FyZyAoYXJncywgLypzaG9ydCovIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfVVNIT1JUOgorCWFwLT5hLmFfdXNob3J0ID0gdmFfYXJnIChhcmdzLCAvKnVuc2lnbmVkIHNob3J0Ki8gaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9JTlQ6CisJYXAtPmEuYV9pbnQgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfVUlOVDoKKwlhcC0+YS5hX3VpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKKwlhcC0+YS5hX2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VTE9OR0lOVDoKKwlhcC0+YS5hX3Vsb25naW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nIGludCk7CisJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICAgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKKwlhcC0+YS5hX2xvbmdsb25naW50ID0gdmFfYXJnIChhcmdzLCBsb25nIGxvbmcgaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6CisJYXAtPmEuYV91bG9uZ2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpOworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorCWFwLT5hLmFfZG91YmxlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOworCWJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKyAgICAgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgorCWFwLT5hLmFfbG9uZ2RvdWJsZSA9IHZhX2FyZyAoYXJncywgbG9uZyBkb3VibGUpOworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIFRZUEVfQ0hBUjoKKwlhcC0+YS5hX2NoYXIgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisJYnJlYWs7CisjaWZkZWYgSEFWRV9XSU5UX1QKKyAgICAgIGNhc2UgVFlQRV9XSURFX0NIQVI6CisJYXAtPmEuYV93aWRlX2NoYXIgPSB2YV9hcmcgKGFyZ3MsIHdpbnRfdCk7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGNhc2UgVFlQRV9TVFJJTkc6CisJYXAtPmEuYV9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7CisJYnJlYWs7CisjaWZkZWYgSEFWRV9XQ0hBUl9UCisgICAgICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6CisJYXAtPmEuYV93aWRlX3N0cmluZyA9IHZhX2FyZyAoYXJncywgY29uc3Qgd2NoYXJfdCAqKTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSBUWVBFX1BPSU5URVI6CisJYXAtPmEuYV9wb2ludGVyID0gdmFfYXJnIChhcmdzLCB2b2lkICopOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI6CisJYXAtPmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaWduZWQgY2hhciAqKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSOgorCWFwLT5hLmFfY291bnRfc2hvcnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgc2hvcnQgKik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09VTlRfSU5UX1BPSU5URVI6CisJYXAtPmEuYV9jb3VudF9pbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgaW50ICopOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjoKKwlhcC0+YS5hX2NvdW50X2xvbmdpbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQgKik7CisJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOgorCWFwLT5hLmFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgbG9uZyBsb25nIGludCAqKTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKwkvKiBVbmtub3duIHR5cGUuICAqLworCXJldHVybiAtMTsKKyAgICAgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcHJpbnRmLWFyZ3MuaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wcmludGYtYXJncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMWU2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcHJpbnRmLWFyZ3MuaApAQCAtMCwwICsxLDEzNyBAQAorLyogRGVjb21wb3NlZCBwcmludGYgYXJndW1lbnQgbGlzdC4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJJTlRGX0FSR1NfSAorI2RlZmluZSBfUFJJTlRGX0FSR1NfSAorCisvKiBHZXQgc2l6ZV90LiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IHdjaGFyX3QuICAqLworI2lmZGVmIEhBVkVfV0NIQVJfVAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisvKiBHZXQgd2ludF90LiAgKi8KKyNpZmRlZiBIQVZFX1dJTlRfVAorIyBpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmCisKKy8qIEdldCB2YV9saXN0LiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworCisvKiBBcmd1bWVudCB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRZUEVfTk9ORSwKKyAgVFlQRV9TQ0hBUiwKKyAgVFlQRV9VQ0hBUiwKKyAgVFlQRV9TSE9SVCwKKyAgVFlQRV9VU0hPUlQsCisgIFRZUEVfSU5ULAorICBUWVBFX1VJTlQsCisgIFRZUEVfTE9OR0lOVCwKKyAgVFlQRV9VTE9OR0lOVCwKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICBUWVBFX0xPTkdMT05HSU5ULAorICBUWVBFX1VMT05HTE9OR0lOVCwKKyNlbmRpZgorICBUWVBFX0RPVUJMRSwKKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisgIFRZUEVfTE9OR0RPVUJMRSwKKyNlbmRpZgorICBUWVBFX0NIQVIsCisjaWZkZWYgSEFWRV9XSU5UX1QKKyAgVFlQRV9XSURFX0NIQVIsCisjZW5kaWYKKyAgVFlQRV9TVFJJTkcsCisjaWZkZWYgSEFWRV9XQ0hBUl9UCisgIFRZUEVfV0lERV9TVFJJTkcsCisjZW5kaWYKKyAgVFlQRV9QT0lOVEVSLAorICBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVIsCisgIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUiwKKyAgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUiwKKyAgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVIKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworLCBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVIKKyNlbmRpZgorfSBhcmdfdHlwZTsKKworLyogUG9seW1vcnBoaWMgYXJndW1lbnQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGFyZ190eXBlIHR5cGU7CisgIHVuaW9uCisgIHsKKyAgICBzaWduZWQgY2hhcgkJCWFfc2NoYXI7CisgICAgdW5zaWduZWQgY2hhcgkJYV91Y2hhcjsKKyAgICBzaG9ydAkJCWFfc2hvcnQ7CisgICAgdW5zaWduZWQgc2hvcnQJCWFfdXNob3J0OworICAgIGludAkJCQlhX2ludDsKKyAgICB1bnNpZ25lZCBpbnQJCWFfdWludDsKKyAgICBsb25nIGludAkJCWFfbG9uZ2ludDsKKyAgICB1bnNpZ25lZCBsb25nIGludAkJYV91bG9uZ2ludDsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgIGxvbmcgbG9uZyBpbnQJCWFfbG9uZ2xvbmdpbnQ7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGludAlhX3Vsb25nbG9uZ2ludDsKKyNlbmRpZgorICAgIGZsb2F0CQkJYV9mbG9hdDsKKyAgICBkb3VibGUJCQlhX2RvdWJsZTsKKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisgICAgbG9uZyBkb3VibGUJCQlhX2xvbmdkb3VibGU7CisjZW5kaWYKKyAgICBpbnQJCQkJYV9jaGFyOworI2lmZGVmIEhBVkVfV0lOVF9UCisgICAgd2ludF90CQkJYV93aWRlX2NoYXI7CisjZW5kaWYKKyAgICBjb25zdCBjaGFyKgkJCWFfc3RyaW5nOworI2lmZGVmIEhBVkVfV0NIQVJfVAorICAgIGNvbnN0IHdjaGFyX3QqCQlhX3dpZGVfc3RyaW5nOworI2VuZGlmCisgICAgdm9pZCoJCQlhX3BvaW50ZXI7CisgICAgc2lnbmVkIGNoYXIgKgkJYV9jb3VudF9zY2hhcl9wb2ludGVyOworICAgIHNob3J0ICoJCQlhX2NvdW50X3Nob3J0X3BvaW50ZXI7CisgICAgaW50ICoJCQlhX2NvdW50X2ludF9wb2ludGVyOworICAgIGxvbmcgaW50ICoJCQlhX2NvdW50X2xvbmdpbnRfcG9pbnRlcjsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgIGxvbmcgbG9uZyBpbnQgKgkJYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyOworI2VuZGlmCisgIH0KKyAgYTsKK30KK2FyZ3VtZW50OworCit0eXBlZGVmIHN0cnVjdAoreworICBzaXplX3QgY291bnQ7CisgIGFyZ3VtZW50ICphcmc7Cit9Cithcmd1bWVudHM7CisKKworLyogRmV0Y2ggdGhlIGFyZ3VtZW50cywgcHV0dGluZyB0aGVtIGludG8gYS4gKi8KKyNpZmRlZiBTVEFUSUMKK1NUQVRJQworI2Vsc2UKK2V4dGVybgorI2VuZGlmCitpbnQgcHJpbnRmX2ZldGNoYXJncyAodmFfbGlzdCBhcmdzLCBhcmd1bWVudHMgKmEpOworCisjZW5kaWYgLyogX1BSSU5URl9BUkdTX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wcmludGYtcGFyc2UuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wcmludGYtcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZkZWRhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3ByaW50Zi1wYXJzZS5jCkBAIC0wLDAgKzEsNTM1IEBACisvKiBGb3JtYXR0ZWQgb3V0cHV0IHRvIHN0cmluZ3MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworLyogU3BlY2lmaWNhdGlvbi4gICovCisjaWYgV0lERV9DSEFSX1ZFUlNJT04KKyMgaW5jbHVkZSAid3ByaW50Zi1wYXJzZS5oIgorI2Vsc2UKKyMgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCisjZW5kaWYKKworLyogR2V0IHNpemVfdCwgTlVMTC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCBpbnRtYXhfdC4gICovCisjaWYgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVgKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0hfV0lUSF9VSU5UTUFYCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworLyogbWFsbG9jKCksIHJlYWxsb2MoKSwgZnJlZSgpLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLiAgKi8KKyNpbmNsdWRlICJ4c2l6ZS5oIgorCisjaWYgV0lERV9DSEFSX1ZFUlNJT04KKyMgZGVmaW5lIFBSSU5URl9QQVJTRSB3cHJpbnRmX3BhcnNlCisjIGRlZmluZSBDSEFSX1Qgd2NoYXJfdAorIyBkZWZpbmUgRElSRUNUSVZFIHdjaGFyX3RfZGlyZWN0aXZlCisjIGRlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcworI2Vsc2UKKyMgZGVmaW5lIFBSSU5URl9QQVJTRSBwcmludGZfcGFyc2UKKyMgZGVmaW5lIENIQVJfVCBjaGFyCisjIGRlZmluZSBESVJFQ1RJVkUgY2hhcl9kaXJlY3RpdmUKKyMgZGVmaW5lIERJUkVDVElWRVMgY2hhcl9kaXJlY3RpdmVzCisjZW5kaWYKKworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZW5kaWYKK2ludAorUFJJTlRGX1BBUlNFIChjb25zdCBDSEFSX1QgKmZvcm1hdCwgRElSRUNUSVZFUyAqZCwgYXJndW1lbnRzICphKQoreworICBjb25zdCBDSEFSX1QgKmNwID0gZm9ybWF0OwkJLyogcG9pbnRlciBpbnRvIGZvcm1hdCAqLworICBzaXplX3QgYXJnX3Bvc24gPSAwOwkJLyogbnVtYmVyIG9mIHJlZ3VsYXIgYXJndW1lbnRzIGNvbnN1bWVkICovCisgIHNpemVfdCBkX2FsbG9jYXRlZDsJCQkvKiBhbGxvY2F0ZWQgZWxlbWVudHMgb2YgZC0+ZGlyICovCisgIHNpemVfdCBhX2FsbG9jYXRlZDsJCQkvKiBhbGxvY2F0ZWQgZWxlbWVudHMgb2YgYS0+YXJnICovCisgIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoID0gMDsKKyAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoID0gMDsKKworICBkLT5jb3VudCA9IDA7CisgIGRfYWxsb2NhdGVkID0gMTsKKyAgZC0+ZGlyID0gbWFsbG9jIChkX2FsbG9jYXRlZCAqIHNpemVvZiAoRElSRUNUSVZFKSk7CisgIGlmIChkLT5kaXIgPT0gTlVMTCkKKyAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KKyAgICByZXR1cm4gLTE7CisKKyAgYS0+Y291bnQgPSAwOworICBhX2FsbG9jYXRlZCA9IDA7CisgIGEtPmFyZyA9IE5VTEw7CisKKyNkZWZpbmUgUkVHSVNURVJfQVJHKF9pbmRleF8sX3R5cGVfKSBcCisgIHsJCQkJCQkJCQlcCisgICAgc2l6ZV90IG4gPSAoX2luZGV4Xyk7CQkJCQkJXAorICAgIGlmIChuID49IGFfYWxsb2NhdGVkKQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJc2l6ZV90IG1lbW9yeV9zaXplOwkJCQkJCVwKKwlhcmd1bWVudCAqbWVtb3J5OwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlhX2FsbG9jYXRlZCA9IHh0aW1lcyAoYV9hbGxvY2F0ZWQsIDIpOwkJCQlcCisJaWYgKGFfYWxsb2NhdGVkIDw9IG4pCQkJCQkJXAorCSAgYV9hbGxvY2F0ZWQgPSB4c3VtIChuLCAxKTsJCQkJCVwKKwltZW1vcnlfc2l6ZSA9IHh0aW1lcyAoYV9hbGxvY2F0ZWQsIHNpemVvZiAoYXJndW1lbnQpKTsJCVwKKwlpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCQkJCVwKKwkgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwkJCVwKKwkgIGdvdG8gZXJyb3I7CQkJCQkJCVwKKwltZW1vcnkgPSAoYS0+YXJnCQkJCQkJXAorCQkgID8gcmVhbGxvYyAoYS0+YXJnLCBtZW1vcnlfc2l6ZSkJCQlcCisJCSAgOiBtYWxsb2MgKG1lbW9yeV9zaXplKSk7CQkJCVwKKwlpZiAobWVtb3J5ID09IE5VTEwpCQkJCQkJXAorCSAgLyogT3V0IG9mIG1lbW9yeS4gICovCQkJCQkJXAorCSAgZ290byBlcnJvcjsJCQkJCQkJXAorCWEtPmFyZyA9IG1lbW9yeTsJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHdoaWxlIChhLT5jb3VudCA8PSBuKQkJCQkJCVwKKyAgICAgIGEtPmFyZ1thLT5jb3VudCsrXS50eXBlID0gVFlQRV9OT05FOwkJCQlcCisgICAgaWYgKGEtPmFyZ1tuXS50eXBlID09IFRZUEVfTk9ORSkJCQkJCVwKKyAgICAgIGEtPmFyZ1tuXS50eXBlID0gKF90eXBlXyk7CQkJCQlcCisgICAgZWxzZSBpZiAoYS0+YXJnW25dLnR5cGUgIT0gKF90eXBlXykpCQkJCVwKKyAgICAgIC8qIEFtYmlndW91cyB0eXBlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8JCQlcCisgICAgICBnb3RvIGVycm9yOwkJCQkJCQlcCisgIH0KKworICB3aGlsZSAoKmNwICE9ICdcMCcpCisgICAgeworICAgICAgQ0hBUl9UIGMgPSAqY3ArKzsKKyAgICAgIGlmIChjID09ICclJykKKwl7CisJICBzaXplX3QgYXJnX2luZGV4ID0gQVJHX05PTkU7CisJICBESVJFQ1RJVkUgKmRwID0gJmQtPmRpcltkLT5jb3VudF07LyogcG9pbnRlciB0byBuZXh0IGRpcmVjdGl2ZSAqLworCisJICAvKiBJbml0aWFsaXplIHRoZSBuZXh0IGRpcmVjdGl2ZS4gICovCisJICBkcC0+ZGlyX3N0YXJ0ID0gY3AgLSAxOworCSAgZHAtPmZsYWdzID0gMDsKKwkgIGRwLT53aWR0aF9zdGFydCA9IE5VTEw7CisJICBkcC0+d2lkdGhfZW5kID0gTlVMTDsKKwkgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBBUkdfTk9ORTsKKwkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBOVUxMOworCSAgZHAtPnByZWNpc2lvbl9lbmQgPSBOVUxMOworCSAgZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPSBBUkdfTk9ORTsKKwkgIGRwLT5hcmdfaW5kZXggPSBBUkdfTk9ORTsKKworCSAgLyogVGVzdCBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCisJICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorCSAgICB7CisJICAgICAgY29uc3QgQ0hBUl9UICpucDsKKworCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorCQk7CisJICAgICAgaWYgKCpucCA9PSAnJCcpCisJCXsKKwkJICBzaXplX3QgbiA9IDA7CisKKwkJICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKwkJICAgIG4gPSB4c3VtICh4dGltZXMgKG4sIDEwKSwgKm5wIC0gJzAnKTsKKwkJICBpZiAobiA9PSAwKQorCQkgICAgLyogUG9zaXRpb25hbCBhcmd1bWVudCAwLiAgKi8KKwkJICAgIGdvdG8gZXJyb3I7CisJCSAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisJCSAgICAvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5IGxhdGVyLiAgKi8KKwkJICAgIGdvdG8gZXJyb3I7CisJCSAgYXJnX2luZGV4ID0gbiAtIDE7CisJCSAgY3AgPSBucCArIDE7CisJCX0KKwkgICAgfQorCisJICAvKiBSZWFkIHRoZSBmbGFncy4gICovCisJICBmb3IgKDs7KQorCSAgICB7CisJICAgICAgaWYgKCpjcCA9PSAnXCcnKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfR1JPVVA7CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnLScpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19MRUZUOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJysnKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfU0hPV1NJR047CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnICcpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19TUEFDRTsKKwkJICBjcCsrOworCQl9CisJICAgICAgZWxzZSBpZiAoKmNwID09ICcjJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX0FMVDsKKwkJICBjcCsrOworCQl9CisJICAgICAgZWxzZSBpZiAoKmNwID09ICcwJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX1pFUk87CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UKKwkJYnJlYWs7CisJICAgIH0KKworCSAgLyogUGFyc2UgdGhlIGZpZWxkIHdpZHRoLiAgKi8KKwkgIGlmICgqY3AgPT0gJyonKQorCSAgICB7CisJICAgICAgZHAtPndpZHRoX3N0YXJ0ID0gY3A7CisJICAgICAgY3ArKzsKKwkgICAgICBkcC0+d2lkdGhfZW5kID0gY3A7CisJICAgICAgaWYgKG1heF93aWR0aF9sZW5ndGggPCAxKQorCQltYXhfd2lkdGhfbGVuZ3RoID0gMTsKKworCSAgICAgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLworCSAgICAgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJCXsKKwkJICBjb25zdCBDSEFSX1QgKm5wOworCisJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCSAgICA7CisJCSAgaWYgKCpucCA9PSAnJCcpCisJCSAgICB7CisJCSAgICAgIHNpemVfdCBuID0gMDsKKworCQkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKwkJCW4gPSB4c3VtICh4dGltZXMgKG4sIDEwKSwgKm5wIC0gJzAnKTsKKwkJICAgICAgaWYgKG4gPT0gMCkKKwkJCS8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCisJCQlnb3RvIGVycm9yOworCQkgICAgICBpZiAoc2l6ZV9vdmVyZmxvd19wIChuKSkKKwkJCS8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkgbGF0ZXIuICAqLworCQkJZ290byBlcnJvcjsKKwkJICAgICAgZHAtPndpZHRoX2FyZ19pbmRleCA9IG4gLSAxOworCQkgICAgICBjcCA9IG5wICsgMTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ID09IEFSR19OT05FKQorCQl7CisJCSAgZHAtPndpZHRoX2FyZ19pbmRleCA9IGFyZ19wb3NuKys7CisJCSAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggPT0gQVJHX05PTkUpCisJCSAgICAvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCisJCSAgICBnb3RvIGVycm9yOworCQl9CisJICAgICAgUkVHSVNURVJfQVJHIChkcC0+d2lkdGhfYXJnX2luZGV4LCBUWVBFX0lOVCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKKwkgICAgeworCSAgICAgIHNpemVfdCB3aWR0aF9sZW5ndGg7CisKKwkgICAgICBkcC0+d2lkdGhfc3RhcnQgPSBjcDsKKwkgICAgICBmb3IgKDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzknOyBjcCsrKQorCQk7CisJICAgICAgZHAtPndpZHRoX2VuZCA9IGNwOworCSAgICAgIHdpZHRoX2xlbmd0aCA9IGRwLT53aWR0aF9lbmQgLSBkcC0+d2lkdGhfc3RhcnQ7CisJICAgICAgaWYgKG1heF93aWR0aF9sZW5ndGggPCB3aWR0aF9sZW5ndGgpCisJCW1heF93aWR0aF9sZW5ndGggPSB3aWR0aF9sZW5ndGg7CisJICAgIH0KKworCSAgLyogUGFyc2UgdGhlIHByZWNpc2lvbi4gICovCisJICBpZiAoKmNwID09ICcuJykKKwkgICAgeworCSAgICAgIGNwKys7CisJICAgICAgaWYgKCpjcCA9PSAnKicpCisJCXsKKwkJICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gY3AgLSAxOworCQkgIGNwKys7CisJCSAgZHAtPnByZWNpc2lvbl9lbmQgPSBjcDsKKwkJICBpZiAobWF4X3ByZWNpc2lvbl9sZW5ndGggPCAyKQorCQkgICAgbWF4X3ByZWNpc2lvbl9sZW5ndGggPSAyOworCisJCSAgLyogVGVzdCBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCisJCSAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKKwkJICAgIHsKKwkJICAgICAgY29uc3QgQ0hBUl9UICpucDsKKworCQkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKwkJCTsKKwkJICAgICAgaWYgKCpucCA9PSAnJCcpCisJCQl7CisJCQkgIHNpemVfdCBuID0gMDsKKworCQkJICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKwkJCSAgICBuID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7CisJCQkgIGlmIChuID09IDApCisJCQkgICAgLyogUG9zaXRpb25hbCBhcmd1bWVudCAwLiAgKi8KKwkJCSAgICBnb3RvIGVycm9yOworCQkJICBpZiAoc2l6ZV9vdmVyZmxvd19wIChuKSkKKwkJCSAgICAvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5CisJCQkgICAgICAgbGF0ZXIuICAqLworCQkJICAgIGdvdG8gZXJyb3I7CisJCQkgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gbiAtIDE7CisJCQkgIGNwID0gbnAgKyAxOworCQkJfQorCQkgICAgfQorCQkgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJICAgIHsKKwkJICAgICAgZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPSBhcmdfcG9zbisrOworCQkgICAgICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPT0gQVJHX05PTkUpCisJCQkvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCisJCQlnb3RvIGVycm9yOworCQkgICAgfQorCQkgIFJFR0lTVEVSX0FSRyAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXgsIFRZUEVfSU5UKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHNpemVfdCBwcmVjaXNpb25fbGVuZ3RoOworCisJCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IGNwIC0gMTsKKwkJICBmb3IgKDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzknOyBjcCsrKQorCQkgICAgOworCQkgIGRwLT5wcmVjaXNpb25fZW5kID0gY3A7CisJCSAgcHJlY2lzaW9uX2xlbmd0aCA9IGRwLT5wcmVjaXNpb25fZW5kIC0gZHAtPnByZWNpc2lvbl9zdGFydDsKKwkJICBpZiAobWF4X3ByZWNpc2lvbl9sZW5ndGggPCBwcmVjaXNpb25fbGVuZ3RoKQorCQkgICAgbWF4X3ByZWNpc2lvbl9sZW5ndGggPSBwcmVjaXNpb25fbGVuZ3RoOworCQl9CisJICAgIH0KKworCSAgeworCSAgICBhcmdfdHlwZSB0eXBlOworCisJICAgIC8qIFBhcnNlIGFyZ3VtZW50IHR5cGUvc2l6ZSBzcGVjaWZpZXJzLiAgKi8KKwkgICAgeworCSAgICAgIGludCBmbGFncyA9IDA7CisKKwkgICAgICBmb3IgKDs7KQorCQl7CisJCSAgaWYgKCpjcCA9PSAnaCcpCisJCSAgICB7CisJCSAgICAgIGZsYWdzIHw9ICgxIDw8IChmbGFncyAmIDEpKTsKKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgqY3AgPT0gJ0wnKQorCQkgICAgeworCQkgICAgICBmbGFncyB8PSA0OworCQkgICAgICBjcCsrOworCQkgICAgfQorCQkgIGVsc2UgaWYgKCpjcCA9PSAnbCcpCisJCSAgICB7CisJCSAgICAgIGZsYWdzICs9IDg7CisJCSAgICAgIGNwKys7CisJCSAgICB9CisjaWZkZWYgSEFWRV9JTlRNQVhfVAorCQkgIGVsc2UgaWYgKCpjcCA9PSAnaicpCisJCSAgICB7CisJCSAgICAgIGlmIChzaXplb2YgKGludG1heF90KSA+IHNpemVvZiAobG9uZykpCisJCQl7CisJCQkgIC8qIGludG1heF90ID0gbG9uZyBsb25nICovCisJCQkgIGZsYWdzICs9IDE2OworCQkJfQorCQkgICAgICBlbHNlIGlmIChzaXplb2YgKGludG1heF90KSA+IHNpemVvZiAoaW50KSkKKwkJCXsKKwkJCSAgLyogaW50bWF4X3QgPSBsb25nICovCisJCQkgIGZsYWdzICs9IDg7CisJCQl9CisJCSAgICAgIGNwKys7CisJCSAgICB9CisjZW5kaWYKKwkJICBlbHNlIGlmICgqY3AgPT0gJ3onIHx8ICpjcCA9PSAnWicpCisJCSAgICB7CisJCSAgICAgIC8qICd6JyBpcyBzdGFuZGFyZGl6ZWQgaW4gSVNPIEMgOTksIGJ1dCBnbGliYyB1c2VzICdaJworCQkJIGJlY2F1c2UgdGhlIHdhcm5pbmcgZmFjaWxpdHkgaW4gZ2NjLTIuOTUuMiB1bmRlcnN0YW5kcworCQkJIG9ubHkgJ1onIChzZWUgZ2NjLTIuOTUuMi9nY2MvYy1jb21tb24uYzoxNzg0KS4gICovCisJCSAgICAgIGlmIChzaXplb2YgKHNpemVfdCkgPiBzaXplb2YgKGxvbmcpKQorCQkJeworCQkJICAvKiBzaXplX3QgPSBsb25nIGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gMTY7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKHNpemVvZiAoc2l6ZV90KSA+IHNpemVvZiAoaW50KSkKKwkJCXsKKwkJCSAgLyogc2l6ZV90ID0gbG9uZyAqLworCQkJICBmbGFncyArPSA4OworCQkJfQorCQkgICAgICBjcCsrOworCQkgICAgfQorCQkgIGVsc2UgaWYgKCpjcCA9PSAndCcpCisJCSAgICB7CisJCSAgICAgIGlmIChzaXplb2YgKHB0cmRpZmZfdCkgPiBzaXplb2YgKGxvbmcpKQorCQkJeworCQkJICAvKiBwdHJkaWZmX3QgPSBsb25nIGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gMTY7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKHNpemVvZiAocHRyZGlmZl90KSA+IHNpemVvZiAoaW50KSkKKwkJCXsKKwkJCSAgLyogcHRyZGlmZl90ID0gbG9uZyAqLworCQkJICBmbGFncyArPSA4OworCQkJfQorCQkgICAgICBjcCsrOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGJyZWFrOworCQl9CisKKwkgICAgICAvKiBSZWFkIHRoZSBjb252ZXJzaW9uIGNoYXJhY3Rlci4gICovCisJICAgICAgYyA9ICpjcCsrOworCSAgICAgIHN3aXRjaCAoYykKKwkJeworCQljYXNlICdkJzogY2FzZSAnaSc6CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisJCSAgICB0eXBlID0gVFlQRV9MT05HTE9OR0lOVDsKKwkJICBlbHNlCisjZW5kaWYKKwkJICBpZiAoZmxhZ3MgPj0gOCkKKwkJICAgIHR5cGUgPSBUWVBFX0xPTkdJTlQ7CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiAyKQorCQkgICAgdHlwZSA9IFRZUEVfU0NIQVI7CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQorCQkgICAgdHlwZSA9IFRZUEVfU0hPUlQ7CisJCSAgZWxzZQorCQkgICAgdHlwZSA9IFRZUEVfSU5UOworCQkgIGJyZWFrOworCQljYXNlICdvJzogY2FzZSAndSc6IGNhc2UgJ3gnOiBjYXNlICdYJzoKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgIGlmIChmbGFncyA+PSAxNiB8fCAoZmxhZ3MgJiA0KSkKKwkJICAgIHR5cGUgPSBUWVBFX1VMT05HTE9OR0lOVDsKKwkJICBlbHNlCisjZW5kaWYKKwkJICBpZiAoZmxhZ3MgPj0gOCkKKwkJICAgIHR5cGUgPSBUWVBFX1VMT05HSU5UOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKKwkJICAgIHR5cGUgPSBUWVBFX1VDSEFSOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKKwkJICAgIHR5cGUgPSBUWVBFX1VTSE9SVDsKKwkJICBlbHNlCisJCSAgICB0eXBlID0gVFlQRV9VSU5UOworCQkgIGJyZWFrOworCQljYXNlICdmJzogY2FzZSAnRic6IGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgorCQljYXNlICdhJzogY2FzZSAnQSc6CisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorCQkgIGlmIChmbGFncyA+PSAxNiB8fCAoZmxhZ3MgJiA0KSkKKwkJICAgIHR5cGUgPSBUWVBFX0xPTkdET1VCTEU7CisJCSAgZWxzZQorI2VuZGlmCisJCSAgdHlwZSA9IFRZUEVfRE9VQkxFOworCQkgIGJyZWFrOworCQljYXNlICdjJzoKKwkJICBpZiAoZmxhZ3MgPj0gOCkKKyNpZmRlZiBIQVZFX1dJTlRfVAorCQkgICAgdHlwZSA9IFRZUEVfV0lERV9DSEFSOworI2Vsc2UKKwkJICAgIGdvdG8gZXJyb3I7CisjZW5kaWYKKwkJICBlbHNlCisJCSAgICB0eXBlID0gVFlQRV9DSEFSOworCQkgIGJyZWFrOworI2lmZGVmIEhBVkVfV0lOVF9UCisJCWNhc2UgJ0MnOgorCQkgIHR5cGUgPSBUWVBFX1dJREVfQ0hBUjsKKwkJICBjID0gJ2MnOworCQkgIGJyZWFrOworI2VuZGlmCisJCWNhc2UgJ3MnOgorCQkgIGlmIChmbGFncyA+PSA4KQorI2lmZGVmIEhBVkVfV0NIQVJfVAorCQkgICAgdHlwZSA9IFRZUEVfV0lERV9TVFJJTkc7CisjZWxzZQorCQkgICAgZ290byBlcnJvcjsKKyNlbmRpZgorCQkgIGVsc2UKKwkJICAgIHR5cGUgPSBUWVBFX1NUUklORzsKKwkJICBicmVhazsKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKwkJY2FzZSAnUyc6CisJCSAgdHlwZSA9IFRZUEVfV0lERV9TVFJJTkc7CisJCSAgYyA9ICdzJzsKKwkJICBicmVhazsKKyNlbmRpZgorCQljYXNlICdwJzoKKwkJICB0eXBlID0gVFlQRV9QT0lOVEVSOworCQkgIGJyZWFrOworCQljYXNlICduJzoKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgIGlmIChmbGFncyA+PSAxNiB8fCAoZmxhZ3MgJiA0KSkKKwkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI7CisJCSAgZWxzZQorI2VuZGlmCisJCSAgaWYgKGZsYWdzID49IDgpCisJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI7CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiAyKQorCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjsKKwkJICBlbHNlIGlmIChmbGFncyAmIDEpCisJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSOworCQkgIGVsc2UKKwkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOworCQkgIGJyZWFrOworCQljYXNlICclJzoKKwkJICB0eXBlID0gVFlQRV9OT05FOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIC8qIFVua25vd24gY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgfQorCisJICAgIGlmICh0eXBlICE9IFRZUEVfTk9ORSkKKwkgICAgICB7CisJCWRwLT5hcmdfaW5kZXggPSBhcmdfaW5kZXg7CisJCWlmIChkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKQorCQkgIHsKKwkJICAgIGRwLT5hcmdfaW5kZXggPSBhcmdfcG9zbisrOworCQkgICAgaWYgKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpCisJCSAgICAgIC8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KKwkJICAgICAgZ290byBlcnJvcjsKKwkJICB9CisJCVJFR0lTVEVSX0FSRyAoZHAtPmFyZ19pbmRleCwgdHlwZSk7CisJICAgICAgfQorCSAgICBkcC0+Y29udmVyc2lvbiA9IGM7CisJICAgIGRwLT5kaXJfZW5kID0gY3A7CisJICB9CisKKwkgIGQtPmNvdW50Kys7CisJICBpZiAoZC0+Y291bnQgPj0gZF9hbGxvY2F0ZWQpCisJICAgIHsKKwkgICAgICBzaXplX3QgbWVtb3J5X3NpemU7CisJICAgICAgRElSRUNUSVZFICptZW1vcnk7CisKKwkgICAgICBkX2FsbG9jYXRlZCA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIDIpOworCSAgICAgIG1lbW9yeV9zaXplID0geHRpbWVzIChkX2FsbG9jYXRlZCwgc2l6ZW9mIChESVJFQ1RJVkUpKTsKKwkgICAgICBpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCisJCS8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLworCQlnb3RvIGVycm9yOworCSAgICAgIG1lbW9yeSA9IHJlYWxsb2MgKGQtPmRpciwgbWVtb3J5X3NpemUpOworCSAgICAgIGlmIChtZW1vcnkgPT0gTlVMTCkKKwkJLyogT3V0IG9mIG1lbW9yeS4gICovCisJCWdvdG8gZXJyb3I7CisJICAgICAgZC0+ZGlyID0gbWVtb3J5OworCSAgICB9CisJfQorICAgIH0KKyAgZC0+ZGlyW2QtPmNvdW50XS5kaXJfc3RhcnQgPSBjcDsKKworICBkLT5tYXhfd2lkdGhfbGVuZ3RoID0gbWF4X3dpZHRoX2xlbmd0aDsKKyAgZC0+bWF4X3ByZWNpc2lvbl9sZW5ndGggPSBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKKyAgcmV0dXJuIDA7CisKK2Vycm9yOgorICBmcmVlIChhLT5hcmcpOworICBmcmVlIChkLT5kaXIpOworICByZXR1cm4gLTE7Cit9CisKKyN1bmRlZiBESVJFQ1RJVkVTCisjdW5kZWYgRElSRUNUSVZFCisjdW5kZWYgQ0hBUl9UCisjdW5kZWYgUFJJTlRGX1BBUlNFCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcHJpbnRmLXBhcnNlLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcHJpbnRmLXBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlYzUwZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wcmludGYtcGFyc2UuaApAQCAtMCwwICsxLDc1IEBACisvKiBQYXJzZSBwcmludGYgZm9ybWF0IHN0cmluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJJTlRGX1BBUlNFX0gKKyNkZWZpbmUgX1BSSU5URl9QQVJTRV9ICisKKyNpbmNsdWRlICJwcmludGYtYXJncy5oIgorCisKKy8qIEZsYWdzICovCisjZGVmaW5lIEZMQUdfR1JPVVAJIDEJLyogJyBmbGFnICovCisjZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19TSE9XU0lHTgkgNAkvKiArIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19TUEFDRQkgOAkvKiBzcGFjZSBmbGFnICovCisjZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLworI2RlZmluZSBGTEFHX1pFUk8JMzIKKworLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCisjZGVmaW5lIEFSR19OT05FCSh+KHNpemVfdCkwKQorCisvKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciogZGlyX3N0YXJ0OworICBjb25zdCBjaGFyKiBkaXJfZW5kOworICBpbnQgZmxhZ3M7CisgIGNvbnN0IGNoYXIqIHdpZHRoX3N0YXJ0OworICBjb25zdCBjaGFyKiB3aWR0aF9lbmQ7CisgIHNpemVfdCB3aWR0aF9hcmdfaW5kZXg7CisgIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9zdGFydDsKKyAgY29uc3QgY2hhciogcHJlY2lzaW9uX2VuZDsKKyAgc2l6ZV90IHByZWNpc2lvbl9hcmdfaW5kZXg7CisgIGNoYXIgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCisgIHNpemVfdCBhcmdfaW5kZXg7Cit9CitjaGFyX2RpcmVjdGl2ZTsKKworLyogQSBwYXJzZWQgZm9ybWF0IHN0cmluZy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBzaXplX3QgY291bnQ7CisgIGNoYXJfZGlyZWN0aXZlICpkaXI7CisgIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoOworICBzaXplX3QgbWF4X3ByZWNpc2lvbl9sZW5ndGg7Cit9CitjaGFyX2RpcmVjdGl2ZXM7CisKKworLyogUGFyc2VzIHRoZSBmb3JtYXQgc3RyaW5nLiAgRmlsbHMgaW4gdGhlIG51bWJlciBOIG9mIGRpcmVjdGl2ZXMsIGFuZCBmaWxscworICAgaW4gZGlyZWN0aXZlc1swXSwgLi4uLCBkaXJlY3RpdmVzW04tMV0sIGFuZCBzZXRzIGRpcmVjdGl2ZXNbTl0uZGlyX3N0YXJ0CisgICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQorICAgYXJndW1lbnRzIGFuZCB0aGUgbmVlZGVkIGNvdW50IG9mIGFyZ3VtZW50cy4gICovCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbHNlCitleHRlcm4KKyNlbmRpZgoraW50IHByaW50Zl9wYXJzZSAoY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyX2RpcmVjdGl2ZXMgKmQsIGFyZ3VtZW50cyAqYSk7CisKKyNlbmRpZiAvKiBfUFJJTlRGX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wcmludGYuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg2NDZjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3ByaW50Zi5jCkBAIC0wLDAgKzEsMzcxIEBACisvKiBGb3JtYXR0ZWQgb3V0cHV0IHRvIHN0cmluZ3MsIHVzaW5nIFBPU0lYL1hTSSBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiAhSEFWRV9QT1NJWF9QUklOVEYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBXaGVuIGJ1aWxkaW5nIGEgRExMLCB3ZSBtdXN0IGV4cG9ydCBzb21lIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBiZWNhdXNlCisgICB0aGUgZnVuY3Rpb25zIGFyZSBvbmx5IGRlZmluZWQgZm9yIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZQorICAgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGluIGFueSBjYXNlLiAgKi8KKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIEJVSUxESU5HX0RMTAorIyBkZWZpbmUgRExMX0VYUE9SVEVEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2Vsc2UKKyMgZGVmaW5lIERMTF9FWFBPUlRFRAorI2VuZGlmCisKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworCisvKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAicHJpbnRmLWFyZ3MuaCIuICAqLworI2luY2x1ZGUgInByaW50Zi1hcmdzLmMiCisKKy8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJwcmludGYtcGFyc2UuaCIuICAqLworI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgorCisvKiBEZWZpbmUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ2YXNucHJpbnRmLmgiLiAgKi8KKyNkZWZpbmUgdmFzbnByaW50ZiBsaWJpbnRsX3Zhc25wcmludGYKKyNpbmNsdWRlICJ2YXNucHJpbnRmLmMiCisjaWYgMCAvKiBub3QgbmVlZGVkICovCisjZGVmaW5lIGFzbnByaW50ZiBsaWJpbnRsX2FzbnByaW50ZgorI2luY2x1ZGUgImFzbnByaW50Zi5jIgorI2VuZGlmCisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ZmcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKyAgICByZXR1cm4gdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBsZW5ndGg7CisgICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgICAgICBpbnQgcmV0dmFsID0gLTE7CisgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisJeworCSAgaWYgKGZ3cml0ZSAocmVzdWx0LCAxLCBsZW5ndGgsIHN0cmVhbSkgPT0gbGVuZ3RoKQorCSAgICByZXR2YWwgPSBsZW5ndGg7CisJICBmcmVlIChyZXN1bHQpOworCX0KKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9mcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdnByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHJldHVybiBsaWJpbnRsX3ZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92cHJpbnRmIChmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92c3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisgICAgcmV0dXJuIHZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgbGVuZ3RoID0gKHNpemVfdCkgfjAgLyAoNCAqIHNpemVvZiAoY2hhcikpOworICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKKwl7CisJICBmcmVlIChyZXN1bHQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gbGVuZ3RoOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfc3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3ZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZiBIQVZFX1NOUFJJTlRGCisKKyMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgorICAgLyogV2luZG93cy4gICovCisjICBkZWZpbmUgc3lzdGVtX3ZzbnByaW50ZiBfdnNucHJpbnRmCisjIGVsc2UKKyAgIC8qIFVuaXguICAqLworIyAgZGVmaW5lIHN5c3RlbV92c25wcmludGYgdnNucHJpbnRmCisjIGVuZGlmCisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ZzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisgICAgcmV0dXJuIHN5c3RlbV92c25wcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IG1heGxlbmd0aCA9IGxlbmd0aDsKKyAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCisJeworCSAgaWYgKG1heGxlbmd0aCA+IDApCisJICAgIHsKKwkgICAgICBpZiAobGVuZ3RoIDwgbWF4bGVuZ3RoKQorCQlhYm9ydCAoKTsKKwkgICAgICBtZW1jcHkgKHJlc3VsdGJ1ZiwgcmVzdWx0LCBtYXhsZW5ndGggLSAxKTsKKwkgICAgICByZXN1bHRidWZbbWF4bGVuZ3RoIC0gMV0gPSAnXDAnOworCSAgICB9CisJICBmcmVlIChyZXN1bHQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gbGVuZ3RoOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92c25wcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYKKworI2lmIEhBVkVfQVNQUklOVEYKKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdmFzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHNpemVfdCBsZW5ndGg7CisgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgKnJlc3VsdHAgPSByZXN1bHQ7CisgIHJldHVybiBsZW5ndGg7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX2FzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92YXNwcmludGYgKHJlc3VsdHAsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZgorCisjaWYgSEFWRV9GV1BSSU5URgorCisjaW5jbHVkZSA8d2NoYXIuaD4KKworI2RlZmluZSBXSURFX0NIQVJfVkVSU0lPTiAxCisKKy8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ3cHJpbnRmLXBhcnNlLmgiLiAgKi8KKyNpbmNsdWRlICJwcmludGYtcGFyc2UuYyIKKworLyogRGVmaW5lIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAidmFzbnByaW50Zi5oIi4gICovCisjZGVmaW5lIHZhc253cHJpbnRmIGxpYmludGxfdmFzbndwcmludGYKKyNpbmNsdWRlICJ2YXNucHJpbnRmLmMiCisjaWYgMCAvKiBub3QgbmVlZGVkICovCisjZGVmaW5lIGFzbndwcmludGYgbGliaW50bF9hc253cHJpbnRmCisjaW5jbHVkZSAiYXNucHJpbnRmLmMiCisjZW5kaWYKKworIyBpZiBIQVZFX0RFQ0xfX1NOV1BSSU5URgorICAgLyogV2luZG93cy4gICovCisjICBkZWZpbmUgc3lzdGVtX3Zzd3ByaW50ZiBfdnNud3ByaW50ZgorIyBlbHNlCisgICAvKiBVbml4LiAgKi8KKyMgIGRlZmluZSBzeXN0ZW1fdnN3cHJpbnRmIHZzd3ByaW50ZgorIyBlbmRpZgorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92ZndwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIGlmICh3Y3NjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorICAgIHJldHVybiB2ZndwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBsZW5ndGg7CisgICAgICB3Y2hhcl90ICpyZXN1bHQgPSBsaWJpbnRsX3Zhc253cHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaW50IHJldHZhbCA9IC0xOworICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCXsKKwkgIHNpemVfdCBpOworCSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCSAgICBpZiAoZnB1dHdjIChyZXN1bHRbaV0sIHN0cmVhbSkgPT0gV0VPRikKKwkgICAgICBicmVhazsKKwkgIGlmIChpID09IGxlbmd0aCkKKwkgICAgcmV0dmFsID0gbGVuZ3RoOworCSAgZnJlZSAocmVzdWx0KTsKKwl9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfZndwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92ZndwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdndwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICByZXR1cm4gbGliaW50bF92ZndwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcmdzKTsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfd3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92d3ByaW50ZiAoZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdnN3cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAod2NzY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKyAgICByZXR1cm4gc3lzdGVtX3Zzd3ByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgbWF4bGVuZ3RoID0gbGVuZ3RoOworICAgICAgd2NoYXJfdCAqcmVzdWx0ID0gbGliaW50bF92YXNud3ByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCisJeworCSAgaWYgKG1heGxlbmd0aCA+IDApCisJICAgIHsKKwkgICAgICBpZiAobGVuZ3RoIDwgbWF4bGVuZ3RoKQorCQlhYm9ydCAoKTsKKwkgICAgICBtZW1jcHkgKHJlc3VsdGJ1ZiwgcmVzdWx0LCAobWF4bGVuZ3RoIC0gMSkgKiBzaXplb2YgKHdjaGFyX3QpKTsKKwkgICAgICByZXN1bHRidWZbbWF4bGVuZ3RoIC0gMV0gPSAwOworCSAgICB9CisJICBmcmVlIChyZXN1bHQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gbGVuZ3RoOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfc3dwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92c3dwcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcmVmLWFkZC5zaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcmVmLWFkZC5zaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3Mzc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9yZWYtYWRkLnNpbgpAQCAtMCwwICsxLDMxIEBACisjIEFkZCB0aGlzIHBhY2thZ2UgdG8gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgorIworIyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjICAgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyAgIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCisjCisvXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAvIHsKKyAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLworICB0YQorICA6YQorICBzLyBAUEFDS0FHRUAgLyBAUEFDS0FHRUAgLworICB0YgorICBzLyAkLyBAUEFDS0FHRUAgLworICA6YgorICBzL14vIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6LworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3JlZi1kZWwuc2luIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3JlZi1kZWwuc2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2NmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcmVmLWRlbC5zaW4KQEAgLTAsMCArMSwyNiBAQAorIyBSZW1vdmUgdGhpcyBwYWNrYWdlIGZyb20gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgorIworIyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjICAgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyAgIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCisjCisvXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAvIHsKKyAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLworICBzLyBAUEFDS0FHRUAgLyAvCisgIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcmVsb2NhdGFibGUuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9yZWxvY2F0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmN2M3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvcmVsb2NhdGFibGUuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyogUHJvdmlkZSByZWxvY2F0YWJsZSBwYWNrYWdlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworCisvKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIGdldGxpbmUoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2luY2x1ZGUgInJlbG9jYXRhYmxlLmgiCisKKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBOT19YTUFMTE9DCisjIGRlZmluZSB4bWFsbG9jIG1hbGxvYworI2Vsc2UKKyMgaW5jbHVkZSAieGFsbG9jLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWYgREVQRU5EU19PTl9MSUJDSEFSU0VUCisjIGluY2x1ZGUgPGxpYmNoYXJzZXQuaD4KKyNlbmRpZgorI2lmIERFUEVORFNfT05fTElCSUNPTlYgJiYgSEFWRV9JQ09OVgorIyBpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisjaWYgREVQRU5EU19PTl9MSUJJTlRMICYmIEVOQUJMRV9OTFMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2VuZGlmCisKKy8qIEZha2VkIGNoZWFwICdib29sJy4gICovCisjdW5kZWYgYm9vbAorI3VuZGVmIGZhbHNlCisjdW5kZWYgdHJ1ZQorI2RlZmluZSBib29sIGludAorI2RlZmluZSBmYWxzZSAwCisjZGVmaW5lIHRydWUgMQorCisvKiBQYXRobmFtZSBzdXBwb3J0LgorICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICBJU19QQVRIX1dJVEhfRElSKFApICB0ZXN0cyB3aGV0aGVyIFAgY29udGFpbnMgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KKyAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorICAgICAmJiAoUClbMV0gPT0gJzonKQorIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSBcCisgICAgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMIHx8IHN0cmNociAoUCwgJ1xcJykgIT0gTlVMTCB8fCBIQVNfREVWSUNFIChQKSkKKyMgZGVmaW5lIEZJTEVTWVNURU1fUFJFRklYX0xFTihQKSAoSEFTX0RFVklDRSAoUCkgPyAyIDogMCkKKyNlbHNlCisgIC8qIFVuaXggKi8KKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCisjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKKyMgZGVmaW5lIEZJTEVTWVNURU1fUFJFRklYX0xFTihQKSAwCisjZW5kaWYKKworLyogT3JpZ2luYWwgaW5zdGFsbGF0aW9uIHByZWZpeC4gICovCitzdGF0aWMgY2hhciAqb3JpZ19wcmVmaXg7CitzdGF0aWMgc2l6ZV90IG9yaWdfcHJlZml4X2xlbjsKKy8qIEN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeC4gICovCitzdGF0aWMgY2hhciAqY3Vycl9wcmVmaXg7CitzdGF0aWMgc2l6ZV90IGN1cnJfcHJlZml4X2xlbjsKKy8qIFRoZXNlIHByZWZpeGVzIGRvIG5vdCBlbmQgaW4gYSBzbGFzaC4gIEFueXRoaW5nIHRoYXQgd2lsbCBiZSBjb25jYXRlbmF0ZWQKKyAgIHRvIHRoZW0gbXVzdCBzdGFydCB3aXRoIGEgc2xhc2guICAqLworCisvKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGlzIG1vZHVsZS4KKyAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4CisgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgorICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KK3N0YXRpYyB2b2lkCitzZXRfdGhpc19yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXhfYXJnLAorCQkJICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2FyZykKK3sKKyAgaWYgKG9yaWdfcHJlZml4X2FyZyAhPSBOVUxMICYmIGN1cnJfcHJlZml4X2FyZyAhPSBOVUxMCisgICAgICAvKiBPcHRpbWl6YXRpb246IGlmIG9yaWdfcHJlZml4IGFuZCBjdXJyX3ByZWZpeCBhcmUgZXF1YWwsIHRoZQorCSByZWxvY2F0aW9uIGlzIGEgbm9wLiAgKi8KKyAgICAgICYmIHN0cmNtcCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpICE9IDApCisgICAgeworICAgICAgLyogRHVwbGljYXRlIHRoZSBhcmd1bWVudCBzdHJpbmdzLiAgKi8KKyAgICAgIGNoYXIgKm1lbW9yeTsKKworICAgICAgb3JpZ19wcmVmaXhfbGVuID0gc3RybGVuIChvcmlnX3ByZWZpeF9hcmcpOworICAgICAgY3Vycl9wcmVmaXhfbGVuID0gc3RybGVuIChjdXJyX3ByZWZpeF9hcmcpOworICAgICAgbWVtb3J5ID0gKGNoYXIgKikgeG1hbGxvYyAob3JpZ19wcmVmaXhfbGVuICsgMSArIGN1cnJfcHJlZml4X2xlbiArIDEpOworI2lmZGVmIE5PX1hNQUxMT0MKKyAgICAgIGlmIChtZW1vcnkgIT0gTlVMTCkKKyNlbmRpZgorCXsKKwkgIG1lbWNweSAobWVtb3J5LCBvcmlnX3ByZWZpeF9hcmcsIG9yaWdfcHJlZml4X2xlbiArIDEpOworCSAgb3JpZ19wcmVmaXggPSBtZW1vcnk7CisJICBtZW1vcnkgKz0gb3JpZ19wcmVmaXhfbGVuICsgMTsKKwkgIG1lbWNweSAobWVtb3J5LCBjdXJyX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2xlbiArIDEpOworCSAgY3Vycl9wcmVmaXggPSBtZW1vcnk7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgb3JpZ19wcmVmaXggPSBOVUxMOworICBjdXJyX3ByZWZpeCA9IE5VTEw7CisgIC8qIERvbid0IHdvcnJ5IGFib3V0IHdhc3RlZCBtZW1vcnkgaGVyZSAtIHRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBvbmx5CisgICAgIGNhbGxlZCBvbmNlLiAgKi8KK30KKworLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisgICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAorICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKyAgIGluc3RlYWQgb2YgIi8iKS4gICovCit2b2lkCitzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYXJnKQoreworICBzZXRfdGhpc19yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOworCisgIC8qIE5vdyBub3RpZnkgYWxsIGRlcGVuZGVudCBsaWJyYXJpZXMuICAqLworI2lmIERFUEVORFNfT05fTElCQ0hBUlNFVAorICBsaWJjaGFyc2V0X3NldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOworI2VuZGlmCisjaWYgREVQRU5EU19PTl9MSUJJQ09OViAmJiBIQVZFX0lDT05WICYmIF9MSUJJQ09OVl9WRVJTSU9OID49IDB4MDEwOQorICBsaWJpY29udl9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKyNlbmRpZgorI2lmIERFUEVORFNfT05fTElCSU5UTCAmJiBFTkFCTEVfTkxTICYmIGRlZmluZWQgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXgKKyAgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKyNlbmRpZgorfQorCisjaWYgIWRlZmluZWQgSU5fTElCUkFSWSB8fCAoZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSKQorCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKKyAgIENvbXB1dGVzIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXgsIGJhc2VkIG9uIHRoZSBvcmlnaW5hbAorICAgaW5zdGFsbGF0aW9uIHByZWZpeCwgdGhlIG9yaWdpbmFsIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYSBwYXJ0aWN1bGFyCisgICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCisjaWZkZWYgSU5fTElCUkFSWQorI2RlZmluZSBjb21wdXRlX2N1cnJfcHJlZml4IGxvY2FsX2NvbXB1dGVfY3Vycl9wcmVmaXgKK3N0YXRpYworI2VuZGlmCitjb25zdCBjaGFyICoKK2NvbXB1dGVfY3Vycl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCwKKwkJICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIsCisJCSAgICAgY29uc3QgY2hhciAqY3Vycl9wYXRobmFtZSkKK3sKKyAgY29uc3QgY2hhciAqY3Vycl9pbnN0YWxsZGlyOworICBjb25zdCBjaGFyICpyZWxfaW5zdGFsbGRpcjsKKworICBpZiAoY3Vycl9wYXRobmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIERldGVybWluZSB0aGUgcmVsYXRpdmUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgcmVsYXRpdmUgdG8gdGhlIHByZWZpeC4KKyAgICAgVGhpcyBpcyBzaW1wbHkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnX2luc3RhbGxwcmVmaXggYW5kCisgICAgIG9yaWdfaW5zdGFsbGRpci4gICovCisgIGlmIChzdHJuY21wIChvcmlnX2luc3RhbGxwcmVmaXgsIG9yaWdfaW5zdGFsbGRpciwgc3RybGVuIChvcmlnX2luc3RhbGxwcmVmaXgpKQorICAgICAgIT0gMCkKKyAgICAvKiBTaG91bGRuJ3QgaGFwcGVuIC0gbm90aGluZyBzaG91bGQgYmUgaW5zdGFsbGVkIG91dHNpZGUgJChwcmVmaXgpLiAgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgcmVsX2luc3RhbGxkaXIgPSBvcmlnX2luc3RhbGxkaXIgKyBzdHJsZW4gKG9yaWdfaW5zdGFsbHByZWZpeCk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuICAqLworICB7CisgICAgY29uc3QgY2hhciAqcF9iYXNlID0gY3Vycl9wYXRobmFtZSArIEZJTEVTWVNURU1fUFJFRklYX0xFTiAoY3Vycl9wYXRobmFtZSk7CisgICAgY29uc3QgY2hhciAqcCA9IGN1cnJfcGF0aG5hbWUgKyBzdHJsZW4gKGN1cnJfcGF0aG5hbWUpOworICAgIGNoYXIgKnE7CisKKyAgICB3aGlsZSAocCA+IHBfYmFzZSkKKyAgICAgIHsKKwlwLS07CisJaWYgKElTU0xBU0ggKCpwKSkKKwkgIGJyZWFrOworICAgICAgfQorCisgICAgcSA9IChjaGFyICopIHhtYWxsb2MgKHAgLSBjdXJyX3BhdGhuYW1lICsgMSk7CisjaWZkZWYgTk9fWE1BTExPQworICAgIGlmIChxID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIG1lbWNweSAocSwgY3Vycl9wYXRobmFtZSwgcCAtIGN1cnJfcGF0aG5hbWUpOworICAgIHFbcCAtIGN1cnJfcGF0aG5hbWVdID0gJ1wwJzsKKyAgICBjdXJyX2luc3RhbGxkaXIgPSBxOworICB9CisKKyAgLyogQ29tcHV0ZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IGJ5IHJlbW92aW5nIHRoZSB0cmFpbGluZworICAgICByZWxfaW5zdGFsbGRpciBmcm9tIGl0LiAgKi8KKyAgeworICAgIGNvbnN0IGNoYXIgKnJwID0gcmVsX2luc3RhbGxkaXIgKyBzdHJsZW4gKHJlbF9pbnN0YWxsZGlyKTsKKyAgICBjb25zdCBjaGFyICpjcCA9IGN1cnJfaW5zdGFsbGRpciArIHN0cmxlbiAoY3Vycl9pbnN0YWxsZGlyKTsKKyAgICBjb25zdCBjaGFyICpjcF9iYXNlID0KKyAgICAgIGN1cnJfaW5zdGFsbGRpciArIEZJTEVTWVNURU1fUFJFRklYX0xFTiAoY3Vycl9pbnN0YWxsZGlyKTsKKworICAgIHdoaWxlIChycCA+IHJlbF9pbnN0YWxsZGlyICYmIGNwID4gY3BfYmFzZSkKKyAgICAgIHsKKwlib29sIHNhbWUgPSBmYWxzZTsKKwljb25zdCBjaGFyICpycGkgPSBycDsKKwljb25zdCBjaGFyICpjcGkgPSBjcDsKKworCXdoaWxlIChycGkgPiByZWxfaW5zdGFsbGRpciAmJiBjcGkgPiBjcF9iYXNlKQorCSAgeworCSAgICBycGktLTsKKwkgICAgY3BpLS07CisJICAgIGlmIChJU1NMQVNIICgqcnBpKSB8fCBJU1NMQVNIICgqY3BpKSkKKwkgICAgICB7CisJCWlmIChJU1NMQVNIICgqcnBpKSAmJiBJU1NMQVNIICgqY3BpKSkKKwkJICBzYW1lID0gdHJ1ZTsKKwkJYnJlYWs7CisJICAgICAgfQorI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworCSAgICAvKiBXaW4zMiwgT1MvMiwgRE9TIC0gY2FzZSBpbnNpZ25pZmljYW50IGZpbGVzeXN0ZW0gKi8KKwkgICAgaWYgKCgqcnBpID49ICdhJyAmJiAqcnBpIDw9ICd6JyA/ICpycGkgLSAnYScgKyAnQScgOiAqcnBpKQorCQkhPSAoKmNwaSA+PSAnYScgJiYgKmNwaSA8PSAneicgPyAqY3BpIC0gJ2EnICsgJ0EnIDogKmNwaSkpCisJICAgICAgYnJlYWs7CisjZWxzZQorCSAgICBpZiAoKnJwaSAhPSAqY3BpKQorCSAgICAgIGJyZWFrOworI2VuZGlmCisJICB9CisJaWYgKCFzYW1lKQorCSAgYnJlYWs7CisJLyogVGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50IHdhcyB0aGUgc2FtZS4gIG9waSBhbmQgY3BpIG5vdyBwb2ludAorCSAgIHRvIHRoZSBzbGFzaCBiZWZvcmUgaXQuICAqLworCXJwID0gcnBpOworCWNwID0gY3BpOworICAgICAgfQorCisgICAgaWYgKHJwID4gcmVsX2luc3RhbGxkaXIpCisgICAgICAvKiBVbmV4cGVjdGVkOiBUaGUgY3Vycl9pbnN0YWxsZGlyIGRvZXMgbm90IGVuZCB3aXRoIHJlbF9pbnN0YWxsZGlyLiAgKi8KKyAgICAgIHJldHVybiBOVUxMOworCisgICAgeworICAgICAgc2l6ZV90IGN1cnJfcHJlZml4X2xlbiA9IGNwIC0gY3Vycl9pbnN0YWxsZGlyOworICAgICAgY2hhciAqY3Vycl9wcmVmaXg7CisKKyAgICAgIGN1cnJfcHJlZml4ID0gKGNoYXIgKikgeG1hbGxvYyAoY3Vycl9wcmVmaXhfbGVuICsgMSk7CisjaWZkZWYgTk9fWE1BTExPQworICAgICAgaWYgKGN1cnJfcHJlZml4ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICAgIG1lbWNweSAoY3Vycl9wcmVmaXgsIGN1cnJfaW5zdGFsbGRpciwgY3Vycl9wcmVmaXhfbGVuKTsKKyAgICAgIGN1cnJfcHJlZml4W2N1cnJfcHJlZml4X2xlbl0gPSAnXDAnOworCisgICAgICByZXR1cm4gY3Vycl9wcmVmaXg7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiAhSU5fTElCUkFSWSB8fCBQSUMgKi8KKworI2lmIGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUgorCisvKiBGdWxsIHBhdGhuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5LCBvciBOVUxMLiAgKi8KK3N0YXRpYyBjaGFyICpzaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisKKy8qIERldGVybWluZSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hlbiBpdCBpcyBsb2FkZWQuICAqLworCitCT09MIFdJTkFQSQorRGxsTWFpbiAoSElOU1RBTkNFIG1vZHVsZV9oYW5kbGUsIERXT1JEIGV2ZW50LCBMUFZPSUQgcmVzZXJ2ZWQpCit7CisgICh2b2lkKSByZXNlcnZlZDsKKworICBpZiAoZXZlbnQgPT0gRExMX1BST0NFU1NfQVRUQUNIKQorICAgIHsKKyAgICAgIC8qIFRoZSBETEwgaXMgYmVpbmcgbG9hZGVkIGludG8gYW4gYXBwbGljYXRpb24ncyBhZGRyZXNzIHJhbmdlLiAgKi8KKyAgICAgIHN0YXRpYyBjaGFyIGxvY2F0aW9uW01BWF9QQVRIXTsKKworICAgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZSAobW9kdWxlX2hhbmRsZSwgbG9jYXRpb24sIHNpemVvZiAobG9jYXRpb24pKSkKKwkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghSVNfUEFUSF9XSVRIX0RJUiAobG9jYXRpb24pKQorCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCXJldHVybiBGQUxTRTsKKworICAgICAgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSBzdHJkdXAgKGxvY2F0aW9uKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbHNlIC8qIFVuaXggKi8KKworc3RhdGljIHZvaWQKK2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkKK3sKKyNpZiBkZWZpbmVkIF9fbGludXhfXyAmJiBfX0dMSUJDX18gPj0gMgorICAvKiBMaW51eCBoYXMgL3Byb2Mvc2VsZi9tYXBzLiBnbGliYyAyIGhhcyB0aGUgZ2V0bGluZSgpIGZ1bmN0aW9uLiAgKi8KKyAgRklMRSAqZnA7CisKKyAgLyogT3BlbiB0aGUgY3VycmVudCBwcm9jZXNzJyBtYXBzIGZpbGUuICBJdCBkZXNjcmliZXMgb25lIFZNQSBwZXIgbGluZS4gICovCisgIGZwID0gZm9wZW4gKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOworICBpZiAoZnApCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpICZmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOworICAgICAgZm9yICg7OykKKwl7CisJICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisJICBpbnQgYzsKKworCSAgaWYgKGZzY2FuZiAoZnAsICIlbHgtJWx4IiwgJnN0YXJ0LCAmZW5kKSAhPSAyKQorCSAgICBicmVhazsKKwkgIGlmIChhZGRyZXNzID49IHN0YXJ0ICYmIGFkZHJlc3MgPD0gZW5kIC0gMSkKKwkgICAgeworCSAgICAgIC8qIEZvdW5kIGl0LiAgTm93IHNlZSBpZiB0aGlzIGxpbmUgY29udGFpbnMgYSBmaWxlbmFtZS4gICovCisJICAgICAgd2hpbGUgKGMgPSBnZXRjIChmcCksIGMgIT0gRU9GICYmIGMgIT0gJ1xuJyAmJiBjICE9ICcvJykKKwkJY29udGludWU7CisJICAgICAgaWYgKGMgPT0gJy8nKQorCQl7CisJCSAgc2l6ZV90IHNpemU7CisJCSAgaW50IGxlbjsKKworCQkgIHVuZ2V0YyAoYywgZnApOworCQkgIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gTlVMTDsgc2l6ZSA9IDA7CisJCSAgbGVuID0gZ2V0bGluZSAoJnNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lLCAmc2l6ZSwgZnApOworCQkgIGlmIChsZW4gPj0gMCkKKwkJICAgIHsKKwkJICAgICAgLyogU3VjY2VzczogZmlsbGVkIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lLiAgKi8KKwkJICAgICAgaWYgKGxlbiA+IDAgJiYgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCXNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lW2xlbiAtIDFdID0gJ1wwJzsKKwkJICAgIH0KKwkJfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorCSAgICBjb250aW51ZTsKKwl9CisgICAgICBmY2xvc2UgKGZwKTsKKyAgICB9CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFdJTjMyIC8gVW5peCAqLworCisvKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGN1cnJlbnQgc2hhcmVkIGxpYnJhcnkuCisgICBSZXR1cm4gTlVMTCBpZiB1bmtub3duLgorICAgR3VhcmFudGVlZCB0byB3b3JrIG9ubHkgb24gTGludXggYW5kIFdvZTMyLiAgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKQoreworI2lmICEoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pCisgIHN0YXRpYyBib29sIHRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7CisgIGlmICghdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSkKKyAgICB7CisgICAgICBmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpOworICAgICAgdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHRydWU7CisgICAgfQorI2VuZGlmCisgIHJldHVybiBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKK30KKworI2VuZGlmIC8qIFBJQyAqLworCisvKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KKyAgIGRpcmVjdG9yeS4gICovCitjb25zdCBjaGFyICoKK3JlbG9jYXRlIChjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKyNpZiBkZWZpbmVkIFBJQyAmJiBkZWZpbmVkIElOU1RBTExESVIKKyAgc3RhdGljIGludCBpbml0aWFsaXplZDsKKworICAvKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcmlnX3ByZWZpeCBhbmQgY3Vycl9wcmVmaXggbGlrZWx5IGhhdmUgYWxyZWFkeSBiZWVuCisJIHNldCB0aHJvdWdoIHRoZSBtYWluIHByb2dyYW0ncyBzZXRfcHJvZ3JhbV9uYW1lX2FuZF9pbnN0YWxsZGlyCisJIGZ1bmN0aW9uLiAgVGhpcyBpcyBzdWZmaWNpZW50IGluIHRoZSBjYXNlIHRoYXQgdGhlIGxpYnJhcnkgaGFzCisJIGluaXRpYWxseSBiZWVuIGluc3RhbGxlZCBpbiB0aGUgc2FtZSBvcmlnX3ByZWZpeC4gIEJ1dCB3ZSBjYW4gZG8KKwkgYmV0dGVyLCB0byBhbHNvIGNvdmVyIHRoZSBjYXNlcyB0aGF0IDEuIGl0IGhhcyBiZWVuIGluc3RhbGxlZAorCSBpbiBhIGRpZmZlcmVudCBwcmVmaXggYmVmb3JlIGJlaW5nIG1vdmVkIHRvIG9yaWdfcHJlZml4IGFuZCAobGF0ZXIpCisJIHRvIGN1cnJfcHJlZml4LCAyLiB1bmxpa2UgdGhlIHByb2dyYW0sIGl0IGhhcyBub3QgbW92ZWQgYXdheSBmcm9tCisJIG9yaWdfcHJlZml4LiAgKi8KKyAgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCA9IElOU1RBTExQUkVGSVg7CisgICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIgPSBJTlNUQUxMRElSOworICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYmV0dGVyOworCisgICAgICBjdXJyX3ByZWZpeF9iZXR0ZXIgPQorCWNvbXB1dGVfY3Vycl9wcmVmaXggKG9yaWdfaW5zdGFsbHByZWZpeCwgb3JpZ19pbnN0YWxsZGlyLAorCQkJICAgICBnZXRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkpOworICAgICAgaWYgKGN1cnJfcHJlZml4X2JldHRlciA9PSBOVUxMKQorCWN1cnJfcHJlZml4X2JldHRlciA9IGN1cnJfcHJlZml4OworCisgICAgICBzZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfaW5zdGFsbHByZWZpeCwgY3Vycl9wcmVmaXhfYmV0dGVyKTsKKworICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KKyNlbmRpZgorCisgIC8qIE5vdGU6IEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcGVyZm9ybSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24gaGVyZSwKKyAgICAgZXZlbiBmb3IgRE9TLWxpa2UgZmlsZXN5c3RlbXMsIGJlY2F1c2UgdGhlIHBhdGhuYW1lIGFyZ3VtZW50IHdhcworICAgICB0eXBpY2FsbHkgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIE1ha2VmaWxlIHZhcmlhYmxlIGFzIG9yaWdfcHJlZml4IGNhbWUKKyAgICAgZnJvbS4gICovCisgIGlmIChvcmlnX3ByZWZpeCAhPSBOVUxMICYmIGN1cnJfcHJlZml4ICE9IE5VTEwKKyAgICAgICYmIHN0cm5jbXAgKHBhdGhuYW1lLCBvcmlnX3ByZWZpeCwgb3JpZ19wcmVmaXhfbGVuKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dID09ICdcMCcpCisJLyogcGF0aG5hbWUgZXF1YWxzIG9yaWdfcHJlZml4LiAgKi8KKwlyZXR1cm4gY3Vycl9wcmVmaXg7CisgICAgICBpZiAoSVNTTEFTSCAocGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXSkpCisJeworCSAgLyogcGF0aG5hbWUgc3RhcnRzIHdpdGggb3JpZ19wcmVmaXguICAqLworCSAgY29uc3QgY2hhciAqcGF0aG5hbWVfdGFpbCA9ICZwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dOworCSAgY2hhciAqcmVzdWx0ID0KKwkgICAgKGNoYXIgKikgeG1hbGxvYyAoY3Vycl9wcmVmaXhfbGVuICsgc3RybGVuIChwYXRobmFtZV90YWlsKSArIDEpOworCisjaWZkZWYgTk9fWE1BTExPQworCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQorI2VuZGlmCisJICAgIHsKKwkgICAgICBtZW1jcHkgKHJlc3VsdCwgY3Vycl9wcmVmaXgsIGN1cnJfcHJlZml4X2xlbik7CisJICAgICAgc3RyY3B5IChyZXN1bHQgKyBjdXJyX3ByZWZpeF9sZW4sIHBhdGhuYW1lX3RhaWwpOworCSAgICAgIHJldHVybiByZXN1bHQ7CisJICAgIH0KKwl9CisgICAgfQorICAvKiBOb3RoaW5nIHRvIHJlbG9jYXRlLiAgKi8KKyAgcmV0dXJuIHBhdGhuYW1lOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9yZWxvY2F0YWJsZS5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3JlbG9jYXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjNWI3MQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC9yZWxvY2F0YWJsZS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1JFTE9DQVRBQkxFX0gKKyNkZWZpbmUgX1JFTE9DQVRBQkxFX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFRoaXMgY2FuIGJlIGVuYWJsZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlIC0tZW5hYmxlLXJlbG9jYXRhYmxlIG9wdGlvbi4gICovCisjaWYgRU5BQkxFX1JFTE9DQVRBQkxFCisKKy8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKKyAgIHRoaXMgaXMgYSBwcml2YXRlIC5oIGZpbGUsIHdlIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAgaW4gYW55IGNhc2UuICAqLworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCisjIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZWxzZQorIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVECisjZW5kaWYKKworLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisgICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAorICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKyAgIGluc3RlYWQgb2YgIi8iKS4gICovCitleHRlcm4gUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVEIHZvaWQKKyAgICAgICBzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAorCQkJICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXgpOworCisvKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KKyAgIGRpcmVjdG9yeS4gICovCitleHRlcm4gY29uc3QgY2hhciAqIHJlbG9jYXRlIChjb25zdCBjaGFyICpwYXRobmFtZSk7CisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50OiByZWxvY2F0ZSgpIGxlYWtzIG1lbW9yeSwgYmVjYXVzZSBpdCBoYXMgdG8gY29uc3RydWN0CisgICBhIGZyZXNoIHBhdGhuYW1lLiAgSWYgdGhpcyBpcyBhIHByb2JsZW0gYmVjYXVzZSB5b3VyIHByb2dyYW0gY2FsbHMKKyAgIHJlbG9jYXRlKCkgZnJlcXVlbnRseSwgdGhpbmsgYWJvdXQgY2FjaGluZyB0aGUgcmVzdWx0LiAgKi8KKworLyogQ29udmVuaWVuY2UgZnVuY3Rpb246CisgICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKKyAgIGluc3RhbGxhdGlvbiBwcmVmaXgsIHRoZSBvcmlnaW5hbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgcGFydGljdWxhcgorICAgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBhdGhuYW1lIG9mIHRoaXMgZmlsZS4gIFJldHVybnMgTlVMTCB1cG9uIGZhaWx1cmUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCisJCQkJCSBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIsCisJCQkJCSBjb25zdCBjaGFyICpjdXJyX3BhdGhuYW1lKTsKKworI2Vsc2UKKworLyogQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBoYXJkd2lyZWQgcGF0aG5hbWVzLiAgKi8KKyNkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKKworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9SRUxPQ0FUQUJMRV9IICovCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvdGV4dGRvbWFpbi5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3RleHRkb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQ1YTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3RleHRkb21haW4uYwpAQCAtMCwwICsxLDE0MSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworI2lmZGVmIF9MSUJDCisvKiBXZSBoYXZlIHRvIGhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLworIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgorI2Vsc2UKKy8qIFByb3ZpZGUgZHVtbXkgaW1wbGVtZW50YXRpb24gaWYgdGhpcyBpcyBvdXRzaWRlIGdsaWJjLiAgKi8KKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lKENMQVNTLCBOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja193cmxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCisjZW5kaWYKKworLyogVGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhbG9uZSBsaWJpbnRsLmEgbXVzdCBoYXZlIGRpZmZlcmVudAorICAgbmFtZXMgdGhhbiB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIEdOVSBsaWJjLCBvdGhlcndpc2UgcHJvZ3JhbXMKKyAgIHVzaW5nIGxpYmludGwuYSBjYW5ub3QgYmUgbGlua2VkIHN0YXRpY2FsbHkuICAqLworI2lmICFkZWZpbmVkIF9MSUJDCisjIGRlZmluZSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4KKyMgZGVmaW5lIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGxpYmludGxfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCitleHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdIGF0dHJpYnV0ZV9oaWRkZW47CisKKy8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW47CisKKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBURVhURE9NQUlOIF9fdGV4dGRvbWFpbgorIyBpZm5kZWYgc3RyZHVwCisjICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBURVhURE9NQUlOIGxpYmludGxfdGV4dGRvbWFpbgorI2VuZGlmCisKKy8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLworX19saWJjX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKworLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCisgICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCitjaGFyICoKK1RFWFRET01BSU4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCit7CisgIGNoYXIgKm5ld19kb21haW47CisgIGNoYXIgKm9sZF9kb21haW47CisKKyAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIF9fbGliY19yd2xvY2tfd3Jsb2NrIChfbmxfc3RhdGVfbG9jayk7CisKKyAgb2xkX2RvbWFpbiA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIC8qIElmIGRvbWFpbiBuYW1lIGlzIHRoZSBudWxsIHN0cmluZyBzZXQgdG8gZGVmYXVsdCBkb21haW4gIm1lc3NhZ2VzIi4gICovCisgIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcKKyAgICAgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pID09IDApCisgICAgeworICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKKyAgICAgIG5ld19kb21haW4gPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoZG9tYWlubmFtZSwgb2xkX2RvbWFpbikgPT0gMCkKKyAgICAvKiBUaGlzIGNhbiBoYXBwZW4gYW5kIHBlb3BsZSB3aWxsIHVzZSBpdCB0byBzaWduYWwgdGhhdCBzb21lCisgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hhbmdlZC4gICovCisgICAgbmV3X2RvbWFpbiA9IG9sZF9kb21haW47CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgZm9sbG93aW5nIG1hbGxvYyBmYWlscyBgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4nCisJIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQorCSBhcmUgb3V0IG9mIGNvcmUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorICAgICAgbmV3X2RvbWFpbiA9IHN0cmR1cCAoZG9tYWlubmFtZSk7CisjZWxzZQorICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOworICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKyAgICAgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCisJbWVtY3B5IChuZXdfZG9tYWluLCBkb21haW5uYW1lLCBsZW4pOworI2VuZGlmCisKKyAgICAgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCisJX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBuZXdfZG9tYWluOworICAgIH0KKworICAvKiBXZSB1c2UgdGhpcyBwb3NzaWJpbGl0eSB0byBzaWduYWwgYSBjaGFuZ2Ugb2YgdGhlIGxvYWRlZCBjYXRhbG9ncworICAgICBzaW5jZSB0aGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBjYXNlIGFuZCB0aGVyZSBpcyBubyBvdGhlciBlYXN5IHdlCisgICAgIHRvIGRvIGl0LiAgRG8gaXQgb25seSB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KKyAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKKyAgICB7CisgICAgICArK19ubF9tc2dfY2F0X2NudHI7CisKKyAgICAgIGlmIChvbGRfZG9tYWluICE9IG5ld19kb21haW4gJiYgb2xkX2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKKwlmcmVlIChvbGRfZG9tYWluKTsKKyAgICB9CisKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICByZXR1cm4gbmV3X2RvbWFpbjsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fdGV4dGRvbWFpbiwgdGV4dGRvbWFpbik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC92YXNucHJpbnRmLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvdmFzbnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYmZiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvdmFzbnByaW50Zi5jCkBAIC0wLDAgKzEsODg0IEBACisvKiB2c3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGVsbCBnbGliYydzIDxzdGRpby5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBzbnByaW50ZigpLgorICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCisgICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpZm5kZWYgSU5fTElCSU5UTAorIyBpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgorCisvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKyNpZiBXSURFX0NIQVJfVkVSU0lPTgorIyBpbmNsdWRlICJ2YXNud3ByaW50Zi5oIgorI2Vsc2UKKyMgaW5jbHVkZSAidmFzbnByaW50Zi5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgkvKiBzbnByaW50ZigpLCBzcHJpbnRmKCkgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4JLyogYWJvcnQoKSwgbWFsbG9jKCksIHJlYWxsb2MoKSwgZnJlZSgpICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CS8qIG1lbWNweSgpLCBzdHJsZW4oKSAqLworI2luY2x1ZGUgPGVycm5vLmg+CS8qIGVycm5vICovCisjaW5jbHVkZSA8bGltaXRzLmg+CS8qIENIQVJfQklUICovCisjaW5jbHVkZSA8ZmxvYXQuaD4JLyogREJMX01BWF9FWFAsIExEQkxfTUFYX0VYUCAqLworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKKyNlbHNlCisjIGluY2x1ZGUgInByaW50Zi1wYXJzZS5oIgorI2VuZGlmCisKKy8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCisjaW5jbHVkZSAieHNpemUuaCIKKworI2lmZGVmIEhBVkVfV0NIQVJfVAorIyBpZmRlZiBIQVZFX1dDU0xFTgorIyAgZGVmaW5lIGxvY2FsX3djc2xlbiB3Y3NsZW4KKyMgZWxzZQorICAgLyogU29sYXJpcyAyLjUuMSBoYXMgd2NzbGVuKCkgaW4gYSBzZXBhcmF0ZSBsaWJyYXJ5IGxpYncuc28uIFRvIGF2b2lkCisgICAgICBhIGRlcGVuZGVuY3kgdG93YXJkcyB0aGlzIGxpYnJhcnksIGhlcmUgaXMgYSBsb2NhbCBzdWJzdGl0dXRlLgorICAgICAgRGVmaW5lIHRoaXMgc3Vic3RpdHV0ZSBvbmx5IG9uY2UsIGV2ZW4gaWYgdGhpcyBmaWxlIGlzIGluY2x1ZGVkCisgICAgICB0d2ljZSBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0LiAgKi8KKyMgIGlmbmRlZiBsb2NhbF93Y3NsZW5fZGVmaW5lZAorIyAgIGRlZmluZSBsb2NhbF93Y3NsZW5fZGVmaW5lZCAxCitzdGF0aWMgc2l6ZV90Citsb2NhbF93Y3NsZW4gKGNvbnN0IHdjaGFyX3QgKnMpCit7CisgIGNvbnN0IHdjaGFyX3QgKnB0cjsKKworICBmb3IgKHB0ciA9IHM7ICpwdHIgIT0gKHdjaGFyX3QpIDA7IHB0cisrKQorICAgIDsKKyAgcmV0dXJuIHB0ciAtIHM7Cit9CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBXSURFX0NIQVJfVkVSU0lPTgorIyBkZWZpbmUgVkFTTlBSSU5URiB2YXNud3ByaW50ZgorIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKKyMgZGVmaW5lIERJUkVDVElWRSB3Y2hhcl90X2RpcmVjdGl2ZQorIyBkZWZpbmUgRElSRUNUSVZFUyB3Y2hhcl90X2RpcmVjdGl2ZXMKKyMgZGVmaW5lIFBSSU5URl9QQVJTRSB3cHJpbnRmX3BhcnNlCisjIGRlZmluZSBVU0VfU05QUklOVEYgMQorIyBpZiBIQVZFX0RFQ0xfX1NOV1BSSU5URgorICAgLyogT24gV2luZG93cywgdGhlIGZ1bmN0aW9uIHN3cHJpbnRmKCkgaGFzIGEgZGlmZmVyZW50IHNpZ25hdHVyZSB0aGFuCisgICAgICBvbiBVbml4OyB3ZSB1c2UgdGhlIF9zbndwcmludGYoKSBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KKyMgIGRlZmluZSBTTlBSSU5URiBfc253cHJpbnRmCisjIGVsc2UKKyAgIC8qIFVuaXguICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIHN3cHJpbnRmCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgVkFTTlBSSU5URiB2YXNucHJpbnRmCisjIGRlZmluZSBDSEFSX1QgY2hhcgorIyBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCisjIGRlZmluZSBESVJFQ1RJVkVTIGNoYXJfZGlyZWN0aXZlcworIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHByaW50Zl9wYXJzZQorIyBkZWZpbmUgVVNFX1NOUFJJTlRGIChIQVZFX0RFQ0xfX1NOUFJJTlRGIHx8IEhBVkVfU05QUklOVEYpCisjIGlmIEhBVkVfREVDTF9fU05QUklOVEYKKyAgIC8qIFdpbmRvd3MuICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIF9zbnByaW50ZgorIyBlbHNlCisgICAvKiBVbml4LiAgKi8KKyMgIGRlZmluZSBTTlBSSU5URiBzbnByaW50ZgorIyBlbmRpZgorI2VuZGlmCisKK0NIQVJfVCAqCitWQVNOUFJJTlRGIChDSEFSX1QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBDSEFSX1QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBESVJFQ1RJVkVTIGQ7CisgIGFyZ3VtZW50cyBhOworCisgIGlmIChQUklOVEZfUEFSU0UgKGZvcm1hdCwgJmQsICZhKSA8IDApCisgICAgeworICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyNkZWZpbmUgQ0xFQU5VUCgpIFwKKyAgZnJlZSAoZC5kaXIpOwkJCQkJCQkJXAorICBpZiAoYS5hcmcpCQkJCQkJCQlcCisgICAgZnJlZSAoYS5hcmcpOworCisgIGlmIChwcmludGZfZmV0Y2hhcmdzIChhcmdzLCAmYSkgPCAwKQorICAgIHsKKyAgICAgIENMRUFOVVAgKCk7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICB7CisgICAgc2l6ZV90IGJ1Zl9uZWVkZWRsZW5ndGg7CisgICAgQ0hBUl9UICpidWY7CisgICAgQ0hBUl9UICpidWZfbWFsbG9jZWQ7CisgICAgY29uc3QgQ0hBUl9UICpjcDsKKyAgICBzaXplX3QgaTsKKyAgICBESVJFQ1RJVkUgKmRwOworICAgIC8qIE91dHB1dCBzdHJpbmcgYWNjdW11bGF0b3IuICAqLworICAgIENIQVJfVCAqcmVzdWx0OworICAgIHNpemVfdCBhbGxvY2F0ZWQ7CisgICAgc2l6ZV90IGxlbmd0aDsKKworICAgIC8qIEFsbG9jYXRlIGEgc21hbGwgYnVmZmVyIHRoYXQgd2lsbCBob2xkIGEgZGlyZWN0aXZlIHBhc3NlZCB0bworICAgICAgIHNwcmludGYgb3Igc25wcmludGYuICAqLworICAgIGJ1Zl9uZWVkZWRsZW5ndGggPQorICAgICAgeHN1bTQgKDcsIGQubWF4X3dpZHRoX2xlbmd0aCwgZC5tYXhfcHJlY2lzaW9uX2xlbmd0aCwgNik7CisjaWYgSEFWRV9BTExPQ0EKKyAgICBpZiAoYnVmX25lZWRlZGxlbmd0aCA8IDQwMDAgLyBzaXplb2YgKENIQVJfVCkpCisgICAgICB7CisJYnVmID0gKENIQVJfVCAqKSBhbGxvY2EgKGJ1Zl9uZWVkZWRsZW5ndGggKiBzaXplb2YgKENIQVJfVCkpOworCWJ1Zl9tYWxsb2NlZCA9IE5VTEw7CisgICAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICB7CisJc2l6ZV90IGJ1Zl9tZW1zaXplID0geHRpbWVzIChidWZfbmVlZGVkbGVuZ3RoLCBzaXplb2YgKENIQVJfVCkpOworCWlmIChzaXplX292ZXJmbG93X3AgKGJ1Zl9tZW1zaXplKSkKKwkgIGdvdG8gb3V0X29mX21lbW9yeV8xOworCWJ1ZiA9IChDSEFSX1QgKikgbWFsbG9jIChidWZfbWVtc2l6ZSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgZ290byBvdXRfb2ZfbWVtb3J5XzE7CisJYnVmX21hbGxvY2VkID0gYnVmOworICAgICAgfQorCisgICAgaWYgKHJlc3VsdGJ1ZiAhPSBOVUxMKQorICAgICAgeworCXJlc3VsdCA9IHJlc3VsdGJ1ZjsKKwlhbGxvY2F0ZWQgPSAqbGVuZ3RocDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJcmVzdWx0ID0gTlVMTDsKKwlhbGxvY2F0ZWQgPSAwOworICAgICAgfQorICAgIGxlbmd0aCA9IDA7CisgICAgLyogSW52YXJpYW50czoKKyAgICAgICByZXN1bHQgaXMgZWl0aGVyID09IHJlc3VsdGJ1ZiBvciA9PSBOVUxMIG9yIG1hbGxvYy1hbGxvY2F0ZWQuCisgICAgICAgSWYgbGVuZ3RoID4gMCwgdGhlbiByZXN1bHQgIT0gTlVMTC4gICovCisKKyAgICAvKiBFbnN1cmVzIHRoYXQgYWxsb2NhdGVkID49IG5lZWRlZC4gIEFib3J0cyB0aHJvdWdoIGEganVtcCB0bworICAgICAgIG91dF9vZl9tZW1vcnkgaWYgbmVlZGVkIGlzIFNJWkVfTUFYIG9yIG90aGVyd2lzZSB0b28gYmlnLiAgKi8KKyNkZWZpbmUgRU5TVVJFX0FMTE9DQVRJT04obmVlZGVkKSBcCisgICAgaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJCSAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgXAorCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQkgICAgIFwKKwlDSEFSX1QgKm1lbW9yeTsJCQkJCQkJICAgICBcCisJCQkJCQkJCQkgICAgIFwKKwlhbGxvY2F0ZWQgPSAoYWxsb2NhdGVkID4gMCA/IHh0aW1lcyAoYWxsb2NhdGVkLCAyKSA6IDEyKTsJICAgICBcCisJaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJICAgICBcCisJICBhbGxvY2F0ZWQgPSAobmVlZGVkKTsJCQkJCQkgICAgIFwKKwltZW1vcnlfc2l6ZSA9IHh0aW1lcyAoYWxsb2NhdGVkLCBzaXplb2YgKENIQVJfVCkpOwkJICAgICBcCisJaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQkJCQkgICAgIFwKKwkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQkgICAgIFwKKwlpZiAocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkJCQkgICAgIFwKKwkgIG1lbW9yeSA9IChDSEFSX1QgKikgbWFsbG9jIChtZW1vcnlfc2l6ZSk7CQkJICAgICBcCisJZWxzZQkJCQkJCQkJICAgICBcCisJICBtZW1vcnkgPSAoQ0hBUl9UICopIHJlYWxsb2MgKHJlc3VsdCwgbWVtb3J5X3NpemUpOwkJICAgICBcCisJaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCSAgICAgXAorCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCSAgICAgXAorCWlmIChyZXN1bHQgPT0gcmVzdWx0YnVmICYmIGxlbmd0aCA+IDApCQkJCSAgICAgXAorCSAgbWVtY3B5IChtZW1vcnksIHJlc3VsdCwgbGVuZ3RoICogc2l6ZW9mIChDSEFSX1QpKTsJCSAgICAgXAorCXJlc3VsdCA9IG1lbW9yeTsJCQkJCQkgICAgIFwKKyAgICAgIH0KKworICAgIGZvciAoY3AgPSBmb3JtYXQsIGkgPSAwLCBkcCA9ICZkLmRpclswXTsgOyBjcCA9IGRwLT5kaXJfZW5kLCBpKyssIGRwKyspCisgICAgICB7CisJaWYgKGNwICE9IGRwLT5kaXJfc3RhcnQpCisJICB7CisJICAgIHNpemVfdCBuID0gZHAtPmRpcl9zdGFydCAtIGNwOworCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgbik7CisKKwkgICAgRU5TVVJFX0FMTE9DQVRJT04gKGF1Z21lbnRlZF9sZW5ndGgpOworCSAgICBtZW1jcHkgKHJlc3VsdCArIGxlbmd0aCwgY3AsIG4gKiBzaXplb2YgKENIQVJfVCkpOworCSAgICBsZW5ndGggPSBhdWdtZW50ZWRfbGVuZ3RoOworCSAgfQorCWlmIChpID09IGQuY291bnQpCisJICBicmVhazsKKworCS8qIEV4ZWN1dGUgYSBzaW5nbGUgZGlyZWN0aXZlLiAgKi8KKwlpZiAoZHAtPmNvbnZlcnNpb24gPT0gJyUnKQorCSAgeworCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aDsKKworCSAgICBpZiAoIShkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKSkKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgMSk7CisJICAgIEVOU1VSRV9BTExPQ0FUSU9OIChhdWdtZW50ZWRfbGVuZ3RoKTsKKwkgICAgcmVzdWx0W2xlbmd0aF0gPSAnJSc7CisJICAgIGxlbmd0aCA9IGF1Z21lbnRlZF9sZW5ndGg7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAoIShkcC0+YXJnX2luZGV4ICE9IEFSR19OT05FKSkKKwkgICAgICBhYm9ydCAoKTsKKworCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ24nKQorCSAgICAgIHsKKwkJc3dpdGNoIChhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlKQorCQkgIHsKKwkJICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfc2NoYXJfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSOgorCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9zaG9ydF9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOgorCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9pbnRfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2xvbmdpbnRfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXIgPSBsZW5ndGg7CisJCSAgICBicmVhazsKKyNlbmRpZgorCQkgIGRlZmF1bHQ6CisJCSAgICBhYm9ydCAoKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlhcmdfdHlwZSB0eXBlID0gYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZTsKKwkJQ0hBUl9UICpwOworCQl1bnNpZ25lZCBpbnQgcHJlZml4X2NvdW50OworCQlpbnQgcHJlZml4ZXNbMl07CisjaWYgIVVTRV9TTlBSSU5URgorCQlzaXplX3QgdG1wX2xlbmd0aDsKKwkJQ0hBUl9UIHRtcGJ1Zls3MDBdOworCQlDSEFSX1QgKnRtcDsKKworCQkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIGZvciBjYWxsaW5nCisJCSAgIHNwcmludGYuICAqLworCQl7CisJCSAgc2l6ZV90IHdpZHRoOworCQkgIHNpemVfdCBwcmVjaXNpb247CisKKwkJICB3aWR0aCA9IDA7CisJCSAgaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQorCQkgICAgeworCQkgICAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKwkJCXsKKwkJCSAgaW50IGFyZzsKKworCQkJICBpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKKwkJCSAgICBhYm9ydCAoKTsKKwkJCSAgYXJnID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKKwkJCSAgd2lkdGggPSAoYXJnIDwgMCA/ICh1bnNpZ25lZCBpbnQpICgtYXJnKSA6IGFyZyk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgY29uc3QgQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7CisKKwkJCSAgZG8KKwkJCSAgICB3aWR0aCA9IHhzdW0gKHh0aW1lcyAod2lkdGgsIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKKwkJCSAgd2hpbGUgKGRpZ2l0cCAhPSBkcC0+d2lkdGhfZW5kKTsKKwkJCX0KKwkJICAgIH0KKworCQkgIHByZWNpc2lvbiA9IDY7CisJCSAgaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCisJCSAgICB7CisJCSAgICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKwkJCXsKKwkJCSAgaW50IGFyZzsKKworCQkJICBpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCisJCQkgICAgYWJvcnQgKCk7CisJCQkgIGFyZyA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OworCQkJICBwcmVjaXNpb24gPSAoYXJnIDwgMCA/IDAgOiBhcmcpOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGNvbnN0IENIQVJfVCAqZGlnaXRwID0gZHAtPnByZWNpc2lvbl9zdGFydCArIDE7CisKKwkJCSAgcHJlY2lzaW9uID0gMDsKKwkJCSAgZG8KKwkJCSAgICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOworCQkJICB3aGlsZSAoZGlnaXRwICE9IGRwLT5wcmVjaXNpb25fZW5kKTsKKwkJCX0KKwkJICAgIH0KKworCQkgIHN3aXRjaCAoZHAtPmNvbnZlcnNpb24pCisJCSAgICB7CisKKwkJICAgIGNhc2UgJ2QnOiBjYXNlICdpJzogY2FzZSAndSc6CisjIGlmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBlbHNlCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnbyc6CisjIGlmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzMzMzM0IC8qIGJpbmFyeSAtPiBvY3RhbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzMzMzM0IC8qIGJpbmFyeSAtPiBvY3RhbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KKwkJICAgICAgZWxzZQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAneCc6IGNhc2UgJ1gnOgorIyBpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybSAqLworCQkgICAgICBlbHNlCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0gKi8KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2YnOiBjYXNlICdGJzoKKyMgaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKExEQkxfTUFYX0VYUAorCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLworCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxMDsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoREJMX01BWF9FWFAKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTA7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLworCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgcHJlY2lzaW9uKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgorCQkgICAgY2FzZSAnYSc6IGNhc2UgJ0EnOgorCQkgICAgICB0bXBfbGVuZ3RoID0KKwkJCTEyOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50LCBleHBvbmVudCBldGMuICovCisJCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCBwcmVjaXNpb24pOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnYyc6CisjIGlmIGRlZmluZWQgSEFWRV9XSU5UX1QgJiYgIVdJREVfQ0hBUl9WRVJTSU9OCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfV0lERV9DSEFSKQorCQkJdG1wX2xlbmd0aCA9IE1CX0NVUl9NQVg7CisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJCXRtcF9sZW5ndGggPSAxOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAncyc6CisjIGlmZGVmIEhBVkVfV0NIQVJfVAorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX1dJREVfU1RSSU5HKQorCQkJeworCQkJICB0bXBfbGVuZ3RoID0KKwkJCSAgICBsb2NhbF93Y3NsZW4gKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX3N0cmluZyk7CisKKyMgIGlmICFXSURFX0NIQVJfVkVSU0lPTgorCQkJICB0bXBfbGVuZ3RoID0geHRpbWVzICh0bXBfbGVuZ3RoLCBNQl9DVVJfTUFYKTsKKyMgIGVuZGlmCisJCQl9CisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJCXRtcF9sZW5ndGggPSBzdHJsZW4gKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zdHJpbmcpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAncCc6CisJCSAgICAgIHRtcF9sZW5ndGggPQorCQkJKHVuc2lnbmVkIGludCkgKHNpemVvZiAodm9pZCAqKSAqIENIQVJfQklUCisJCQkJCSogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KKwkJCQkgICAgICAgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIDB4ICovCisJCSAgICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIH0KKworCQkgIGlmICh0bXBfbGVuZ3RoIDwgd2lkdGgpCisJCSAgICB0bXBfbGVuZ3RoID0gd2lkdGg7CisKKwkJICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7IC8qIGFjY291bnQgZm9yIHRyYWlsaW5nIE5VTCAqLworCQl9CisKKwkJaWYgKHRtcF9sZW5ndGggPD0gc2l6ZW9mICh0bXBidWYpIC8gc2l6ZW9mIChDSEFSX1QpKQorCQkgIHRtcCA9IHRtcGJ1ZjsKKwkJZWxzZQorCQkgIHsKKwkJICAgIHNpemVfdCB0bXBfbWVtc2l6ZSA9IHh0aW1lcyAodG1wX2xlbmd0aCwgc2l6ZW9mIChDSEFSX1QpKTsKKworCQkgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAodG1wX21lbXNpemUpKQorCQkgICAgICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KKwkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworCQkgICAgdG1wID0gKENIQVJfVCAqKSBtYWxsb2MgKHRtcF9tZW1zaXplKTsKKwkJICAgIGlmICh0bXAgPT0gTlVMTCkKKwkJICAgICAgLyogT3V0IG9mIG1lbW9yeS4gICovCisJCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKwkJICB9CisjZW5kaWYKKworCQkvKiBDb25zdHJ1Y3QgdGhlIGZvcm1hdCBzdHJpbmcgZm9yIGNhbGxpbmcgc25wcmludGYgb3IKKwkJICAgc3ByaW50Zi4gICovCisJCXAgPSBidWY7CisJCSpwKysgPSAnJSc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX0dST1VQKQorCQkgICpwKysgPSAnXCcnOworCQlpZiAoZHAtPmZsYWdzICYgRkxBR19MRUZUKQorCQkgICpwKysgPSAnLSc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX1NIT1dTSUdOKQorCQkgICpwKysgPSAnKyc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX1NQQUNFKQorCQkgICpwKysgPSAnICc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX0FMVCkKKwkJICAqcCsrID0gJyMnOworCQlpZiAoZHAtPmZsYWdzICYgRkxBR19aRVJPKQorCQkgICpwKysgPSAnMCc7CisJCWlmIChkcC0+d2lkdGhfc3RhcnQgIT0gZHAtPndpZHRoX2VuZCkKKwkJICB7CisJCSAgICBzaXplX3QgbiA9IGRwLT53aWR0aF9lbmQgLSBkcC0+d2lkdGhfc3RhcnQ7CisJCSAgICBtZW1jcHkgKHAsIGRwLT53aWR0aF9zdGFydCwgbiAqIHNpemVvZiAoQ0hBUl9UKSk7CisJCSAgICBwICs9IG47CisJCSAgfQorCQlpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKKwkJICB7CisJCSAgICBzaXplX3QgbiA9IGRwLT5wcmVjaXNpb25fZW5kIC0gZHAtPnByZWNpc2lvbl9zdGFydDsKKwkJICAgIG1lbWNweSAocCwgZHAtPnByZWNpc2lvbl9zdGFydCwgbiAqIHNpemVvZiAoQ0hBUl9UKSk7CisJCSAgICBwICs9IG47CisJCSAgfQorCisJCXN3aXRjaCAodHlwZSkKKwkJICB7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6CisJCSAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKKwkJICAgICpwKysgPSAnbCc7CisJCSAgICAvKkZBTExUSFJPVUdIKi8KKyNlbmRpZgorCQkgIGNhc2UgVFlQRV9MT05HSU5UOgorCQkgIGNhc2UgVFlQRV9VTE9OR0lOVDoKKyNpZmRlZiBIQVZFX1dJTlRfVAorCQkgIGNhc2UgVFlQRV9XSURFX0NIQVI6CisjZW5kaWYKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKwkJICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6CisjZW5kaWYKKwkJICAgICpwKysgPSAnbCc7CisJCSAgICBicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisJCSAgY2FzZSBUWVBFX0xPTkdET1VCTEU6CisJCSAgICAqcCsrID0gJ0wnOworCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJICBkZWZhdWx0OgorCQkgICAgYnJlYWs7CisJCSAgfQorCQkqcCA9IGRwLT5jb252ZXJzaW9uOworI2lmIFVTRV9TTlBSSU5URgorCQlwWzFdID0gJyUnOworCQlwWzJdID0gJ24nOworCQlwWzNdID0gJ1wwJzsKKyNlbHNlCisJCXBbMV0gPSAnXDAnOworI2VuZGlmCisKKwkJLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgZm9yIGNhbGxpbmcgc25wcmludGYgb3Igc3ByaW50Zi4gICovCisJCXByZWZpeF9jb3VudCA9IDA7CisJCWlmIChkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQorCQkgIHsKKwkJICAgIGlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7CisJCSAgfQorCQlpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCisJCSAgeworCQkgICAgaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OworCQkgIH0KKworI2lmIFVTRV9TTlBSSU5URgorCQkvKiBQcmVwYXJlIGNoZWNraW5nIHdoZXRoZXIgc25wcmludGYgcmV0dXJucyB0aGUgY291bnQKKwkJICAgdmlhICVuLiAgKi8KKwkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgMSkpOworCQlyZXN1bHRbbGVuZ3RoXSA9ICdcMCc7CisjZW5kaWYKKworCQlmb3IgKDs7KQorCQkgIHsKKwkJICAgIHNpemVfdCBtYXhsZW47CisJCSAgICBpbnQgY291bnQ7CisJCSAgICBpbnQgcmV0Y291bnQ7CisKKwkJICAgIG1heGxlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKKwkJICAgIGNvdW50ID0gLTE7CisJCSAgICByZXRjb3VudCA9IDA7CisKKyNpZiBVU0VfU05QUklOVEYKKyMgZGVmaW5lIFNOUFJJTlRGX0JVRihhcmcpIFwKKwkJICAgIHN3aXRjaCAocHJlZml4X2NvdW50KQkJCQkgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMDoJCQkJCQkgICAgXAorCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKKwkJCQkJICAgICBhcmcsICZjb3VudCk7CQkgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCisJCQlyZXRjb3VudCA9IFNOUFJJTlRGIChyZXN1bHQgKyBsZW5ndGgsIG1heGxlbiwgYnVmLCAgXAorCQkJCQkgICAgIHByZWZpeGVzWzBdLCBhcmcsICZjb3VudCk7CSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDI6CQkJCQkJICAgIFwKKwkJCXJldGNvdW50ID0gU05QUklOVEYgKHJlc3VsdCArIGxlbmd0aCwgbWF4bGVuLCBidWYsICBcCisJCQkJCSAgICAgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLCBhcmcsIFwKKwkJCQkJICAgICAmY291bnQpOwkJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCisJCQlhYm9ydCAoKTsJCQkJCSAgICBcCisJCSAgICAgIH0KKyNlbHNlCisjIGRlZmluZSBTTlBSSU5URl9CVUYoYXJnKSBcCisJCSAgICBzd2l0Y2ggKHByZWZpeF9jb3VudCkJCQkJICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDA6CQkJCQkJICAgIFwKKwkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIGFyZyk7CQkgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCisJCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBwcmVmaXhlc1swXSwgYXJnKTsJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgXAorCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLFwKKwkJCQkJIGFyZyk7CQkJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCisJCQlhYm9ydCAoKTsJCQkJCSAgICBcCisJCSAgICAgIH0KKyNlbmRpZgorCisJCSAgICBzd2l0Y2ggKHR5cGUpCisJCSAgICAgIHsKKwkJICAgICAgY2FzZSBUWVBFX1NDSEFSOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3NjaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VDSEFSOgorCQkJeworCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VjaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1NIT1JUOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Nob3J0OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VTSE9SVDoKKwkJCXsKKwkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91c2hvcnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfSU5UOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9VSU5UOgorCQkJeworCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VpbnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKKwkJCXsKKwkJCSAgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdpbnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfVUxPTkdJTlQ6CisJCQl7CisJCQkgIHVuc2lnbmVkIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91bG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICAgICAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgorCQkJeworCQkJICBsb25nIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nbG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6CisJCQl7CisJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Vsb25nbG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJICAgICAgY2FzZSBUWVBFX0RPVUJMRToKKwkJCXsKKwkJCSAgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9kb3VibGU7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKwkJICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6CisJCQl7CisJCQkgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfQ0hBUjoKKwkJCXsKKwkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBIQVZFX1dJTlRfVAorCQkgICAgICBjYXNlIFRZUEVfV0lERV9DSEFSOgorCQkJeworCQkJICB3aW50X3QgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfY2hhcjsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJICAgICAgY2FzZSBUWVBFX1NUUklORzoKKwkJCXsKKwkJCSAgY29uc3QgY2hhciAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3N0cmluZzsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9XQ0hBUl9UCisJCSAgICAgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKKwkJCXsKKwkJCSAgY29uc3Qgd2NoYXJfdCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfc3RyaW5nOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKKwkJCXsKKwkJCSAgdm9pZCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3BvaW50ZXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBkZWZhdWx0OgorCQkJYWJvcnQgKCk7CisJCSAgICAgIH0KKworI2lmIFVTRV9TTlBSSU5URgorCQkgICAgLyogUG9ydGFiaWxpdHk6IE5vdCBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHNucHJpbnRmKCkKKwkJICAgICAgIGFyZSBJU08gQyA5OSBjb21wbGlhbnQuICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZgorCQkgICAgICAgYnl0ZXMgdGhhdCBzbnByaW50ZigpIGhhcyBwcm9kdWNlZCBvciB3b3VsZCBoYXZlCisJCSAgICAgICBwcm9kdWNlZC4gICovCisJCSAgICBpZiAoY291bnQgPj0gMCkKKwkJICAgICAgeworCQkJLyogVmVyaWZ5IHRoYXQgc25wcmludGYoKSBoYXMgTlVMLXRlcm1pbmF0ZWQgaXRzCisJCQkgICByZXN1bHQuICAqLworCQkJaWYgKGNvdW50IDwgbWF4bGVuICYmIHJlc3VsdFtsZW5ndGggKyBjb3VudF0gIT0gJ1wwJykKKwkJCSAgYWJvcnQgKCk7CisJCQkvKiBQb3J0YWJpbGl0eSBoYWNrLiAgKi8KKwkJCWlmIChyZXRjb3VudCA+IGNvdW50KQorCQkJICBjb3VudCA9IHJldGNvdW50OworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCS8qIHNucHJpbnRmKCkgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAnJW4nCisJCQkgICBkaXJlY3RpdmUuICAqLworCQkJaWYgKHBbMV0gIT0gJ1wwJykKKwkJCSAgeworCQkJICAgIC8qIERvbid0IHVzZSB0aGUgJyVuJyBkaXJlY3RpdmU7IGluc3RlYWQsIGxvb2sKKwkJCSAgICAgICBhdCB0aGUgc25wcmludGYoKSByZXR1cm4gdmFsdWUuICAqLworCQkJICAgIHBbMV0gPSAnXDAnOworCQkJICAgIGNvbnRpbnVlOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICAvKiBMb29rIGF0IHRoZSBzbnByaW50ZigpIHJldHVybiB2YWx1ZS4gICovCisJCQkgICAgaWYgKHJldGNvdW50IDwgMCkKKwkJCSAgICAgIHsKKwkJCQkvKiBIUC1VWCAxMC4yMCBzbnByaW50ZigpIGlzIGRvdWJseSBkZWZpY2llbnQ6CisJCQkJICAgSXQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAnJW4nIGRpcmVjdGl2ZSwKKwkJCQkgICAqYW5kKiBpdCByZXR1cm5zIC0xIChyYXRoZXIgdGhhbiB0aGUgbGVuZ3RoCisJCQkJICAgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmVxdWlyZWQpIHdoZW4gdGhlCisJCQkJICAgYnVmZmVyIGlzIHRvbyBzbWFsbC4gICovCisJCQkJc2l6ZV90IGJpZ2dlcl9uZWVkID0KKwkJCQkgIHhzdW0gKHh0aW1lcyAoYWxsb2NhdGVkLCAyKSwgMTIpOworCQkJCUVOU1VSRV9BTExPQ0FUSU9OIChiaWdnZXJfbmVlZCk7CisJCQkJY29udGludWU7CisJCQkgICAgICB9CisJCQkgICAgZWxzZQorCQkJICAgICAgY291bnQgPSByZXRjb3VudDsKKwkJCSAgfQorCQkgICAgICB9CisjZW5kaWYKKworCQkgICAgLyogQXR0ZW1wdCB0byBoYW5kbGUgZmFpbHVyZS4gICovCisJCSAgICBpZiAoY291bnQgPCAwKQorCQkgICAgICB7CisJCQlpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKKwkJCSAgZnJlZSAocmVzdWx0KTsKKwkJCWZyZWUgKGJ1Zl9tYWxsb2NlZCk7CisJCQlDTEVBTlVQICgpOworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gTlVMTDsKKwkJICAgICAgfQorCisjaWYgIVVTRV9TTlBSSU5URgorCQkgICAgaWYgKGNvdW50ID49IHRtcF9sZW5ndGgpCisJCSAgICAgIC8qIHRtcF9sZW5ndGggd2FzIGluY29ycmVjdGx5IGNhbGN1bGF0ZWQgLSBmaXggdGhlCisJCQkgY29kZSBhYm92ZSEgICovCisJCSAgICAgIGFib3J0ICgpOworI2VuZGlmCisKKwkJICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIHJlc3VsdC4gICovCisJCSAgICBpZiAoY291bnQgPj0gbWF4bGVuKQorCQkgICAgICB7CisJCQkvKiBOZWVkIGF0IGxlYXN0IGNvdW50IGJ5dGVzLiAgQnV0IGFsbG9jYXRlCisJCQkgICBwcm9wb3J0aW9uYWxseSwgdG8gYXZvaWQgbG9vcGluZyBldGVybmFsbHkgaWYKKwkJCSAgIHNucHJpbnRmKCkgcmVwb3J0cyBhIHRvbyBzbWFsbCBjb3VudC4gICovCisJCQlzaXplX3QgbiA9CisJCQkgIHhtYXggKHhzdW0gKGxlbmd0aCwgY291bnQpLCB4dGltZXMgKGFsbG9jYXRlZCwgMikpOworCisJCQlFTlNVUkVfQUxMT0NBVElPTiAobik7CisjaWYgVVNFX1NOUFJJTlRGCisJCQljb250aW51ZTsKKyNlbmRpZgorCQkgICAgICB9CisKKyNpZiBVU0VfU05QUklOVEYKKwkJICAgIC8qIFRoZSBzbnByaW50ZigpIHJlc3VsdCBkaWQgZml0LiAgKi8KKyNlbHNlCisJCSAgICAvKiBBcHBlbmQgdGhlIHNwcmludGYoKSByZXN1bHQuICAqLworCQkgICAgbWVtY3B5IChyZXN1bHQgKyBsZW5ndGgsIHRtcCwgY291bnQgKiBzaXplb2YgKENIQVJfVCkpOworCQkgICAgaWYgKHRtcCAhPSB0bXBidWYpCisJCSAgICAgIGZyZWUgKHRtcCk7CisjZW5kaWYKKworCQkgICAgbGVuZ3RoICs9IGNvdW50OworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgIC8qIEFkZCB0aGUgZmluYWwgTlVMLiAgKi8KKyAgICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7CisgICAgcmVzdWx0W2xlbmd0aF0gPSAnXDAnOworCisgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYgJiYgbGVuZ3RoICsgMSA8IGFsbG9jYXRlZCkKKyAgICAgIHsKKwkvKiBTaHJpbmsgdGhlIGFsbG9jYXRlZCBtZW1vcnkgaWYgcG9zc2libGUuICAqLworCUNIQVJfVCAqbWVtb3J5OworCisJbWVtb3J5ID0gKENIQVJfVCAqKSByZWFsbG9jIChyZXN1bHQsIChsZW5ndGggKyAxKSAqIHNpemVvZiAoQ0hBUl9UKSk7CisJaWYgKG1lbW9yeSAhPSBOVUxMKQorCSAgcmVzdWx0ID0gbWVtb3J5OworICAgICAgfQorCisgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKKyAgICBDTEVBTlVQICgpOworICAgICpsZW5ndGhwID0gbGVuZ3RoOworICAgIHJldHVybiByZXN1bHQ7CisKKyAgb3V0X29mX21lbW9yeToKKyAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKKyAgICAgIGZyZWUgKHJlc3VsdCk7CisgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKKyAgb3V0X29mX21lbW9yeV8xOgorICAgIENMRUFOVVAgKCk7CisgICAgZXJybm8gPSBFTk9NRU07CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworI3VuZGVmIFNOUFJJTlRGCisjdW5kZWYgVVNFX1NOUFJJTlRGCisjdW5kZWYgUFJJTlRGX1BBUlNFCisjdW5kZWYgRElSRUNUSVZFUworI3VuZGVmIERJUkVDVElWRQorI3VuZGVmIENIQVJfVAorI3VuZGVmIFZBU05QUklOVEYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC92YXNucHJpbnRmLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvdmFzbnByaW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjFiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvdmFzbnByaW50Zi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIHZzcHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9WQVNOUFJJTlRGX0gKKyNkZWZpbmUgX1ZBU05QUklOVEZfSAorCisvKiBHZXQgdmFfbGlzdC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIEdldCBzaXplX3QuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZuZGVmIF9fYXR0cmlidXRlX18KKy8qIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgaW4gZ2NjIHZlcnNpb25zIDIuNSBhbmQgbGF0ZXIuICAqLworIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA1KSB8fCBfX1NUUklDVF9BTlNJX18KKyMgIGRlZmluZSBfX2F0dHJpYnV0ZV9fKFNwZWMpIC8qIGVtcHR5ICovCisjIGVuZGlmCisvKiBUaGUgX18tcHJvdGVjdGVkIHZhcmlhbnRzIG9mIGBmb3JtYXQnIGFuZCBgcHJpbnRmJyBhdHRyaWJ1dGVzCisgICBhcmUgYWNjZXB0ZWQgYnkgZ2NjIHZlcnNpb25zIDIuNi40IChlZmZlY3RpdmVseSAyLjcpIGFuZCBsYXRlci4gICovCisjIGlmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpCisjICBkZWZpbmUgX19mb3JtYXRfXyBmb3JtYXQKKyMgIGRlZmluZSBfX3ByaW50Zl9fIHByaW50ZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBhIHN0cmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4KKyAgIFlvdSBjYW4gcGFzcyBhIHByZWFsbG9jYXRlZCBidWZmZXIgZm9yIHRoZSByZXN1bHQgaW4gUkVTVUxUQlVGIGFuZCBpdHMKKyAgIHNpemUgaW4gKkxFTkdUSFA7IG90aGVyd2lzZSB5b3UgcGFzcyBSRVNVTFRCVUYgPSBOVUxMLgorICAgSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJpbmcgKHRoaXMgbWF5IGJlID0gUkVTVUxUQlVGCisgICBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHdhcyBuZWNlc3NhcnkpIGFuZCBzZXQgKkxFTkdUSFAgdG8gdGhlCisgICBudW1iZXIgb2YgcmVzdWx0aW5nIGJ5dGVzLCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gIFVwb24gZXJyb3IsIHNldAorICAgZXJybm8gYW5kIHJldHVybiBOVUxMLiAgKi8KK2V4dGVybiBjaGFyICogYXNucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisgICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CitleHRlcm4gY2hhciAqIHZhc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKKyAgICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9WQVNOUFJJTlRGX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC92YXNud3ByaW50Zi5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3Zhc253cHJpbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjZWY0YwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC92YXNud3ByaW50Zi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIHZzd3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfVkFTTldQUklOVEZfSAorI2RlZmluZSBfVkFTTldQUklOVEZfSAorCisvKiBHZXQgdmFfbGlzdC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIEdldCB3Y2hhcl90LCBzaXplX3QuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCisgICBZb3UgY2FuIHBhc3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGluIFJFU1VMVEJVRiBhbmQgaXRzCisgICBzaXplIGluICpMRU5HVEhQOyBvdGhlcndpc2UgeW91IHBhc3MgUkVTVUxUQlVGID0gTlVMTC4KKyAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgorICAgaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB3YXMgbmVjZXNzYXJ5KSBhbmQgc2V0ICpMRU5HVEhQIHRvIHRoZQorICAgbnVtYmVyIG9mIHJlc3VsdGluZyBieXRlcywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICBVcG9uIGVycm9yLCBzZXQKKyAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4gICovCitleHRlcm4gd2NoYXJfdCAqIGFzbndwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLik7CitleHRlcm4gd2NoYXJfdCAqIHZhc253cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1ZBU05XUFJJTlRGX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC93cHJpbnRmLXBhcnNlLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvd3ByaW50Zi1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTJjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2ludGwvd3ByaW50Zi1wYXJzZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIFBhcnNlIHByaW50ZiBmb3JtYXQgc3RyaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9XUFJJTlRGX1BBUlNFX0gKKyNkZWZpbmUgX1dQUklOVEZfUEFSU0VfSAorCisjaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKKworCisvKiBGbGFncyAqLworI2RlZmluZSBGTEFHX0dST1VQCSAxCS8qICcgZmxhZyAqLworI2RlZmluZSBGTEFHX0xFRlQJIDIJLyogLSBmbGFnICovCisjZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCisjZGVmaW5lIEZMQUdfU1BBQ0UJIDgJLyogc3BhY2UgZmxhZyAqLworI2RlZmluZSBGTEFHX0FMVAkxNgkvKiAjIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19aRVJPCTMyCisKKy8qIGFyZ19pbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnQgaXMgY29uc3VtZWQuICAqLworI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKKworLyogQSBwYXJzZWQgZGlyZWN0aXZlLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IHdjaGFyX3QqIGRpcl9zdGFydDsKKyAgY29uc3Qgd2NoYXJfdCogZGlyX2VuZDsKKyAgaW50IGZsYWdzOworICBjb25zdCB3Y2hhcl90KiB3aWR0aF9zdGFydDsKKyAgY29uc3Qgd2NoYXJfdCogd2lkdGhfZW5kOworICBzaXplX3Qgd2lkdGhfYXJnX2luZGV4OworICBjb25zdCB3Y2hhcl90KiBwcmVjaXNpb25fc3RhcnQ7CisgIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9lbmQ7CisgIHNpemVfdCBwcmVjaXNpb25fYXJnX2luZGV4OworICB3Y2hhcl90IGNvbnZlcnNpb247IC8qIGQgaSBvIHUgeCBYIGYgZSBFIGcgRyBjIHMgcCBuIFUgJSBidXQgbm90IEMgUyAqLworICBzaXplX3QgYXJnX2luZGV4OworfQord2NoYXJfdF9kaXJlY3RpdmU7CisKKy8qIEEgcGFyc2VkIGZvcm1hdCBzdHJpbmcuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGNvdW50OworICB3Y2hhcl90X2RpcmVjdGl2ZSAqZGlyOworICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKKyAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoOworfQord2NoYXJfdF9kaXJlY3RpdmVzOworCisKKy8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKKyAgIGluIGRpcmVjdGl2ZXNbMF0sIC4uLiwgZGlyZWN0aXZlc1tOLTFdLCBhbmQgc2V0cyBkaXJlY3RpdmVzW05dLmRpcl9zdGFydAorICAgdG8gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIEFsc28gZmlsbHMgaW4gdGhlIGFyZ190eXBlIGZpZWxkcyBvZiB0aGUKKyAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZWxzZQorZXh0ZXJuCisjZW5kaWYKK2ludCB3cHJpbnRmX3BhcnNlIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHdjaGFyX3RfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKKworI2VuZGlmIC8qIF9XUFJJTlRGX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC94c2l6ZS5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9pbnRsL3hzaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyZTI0YgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvaW50bC94c2l6ZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiB4c2l6ZS5oIC0tIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4KKworICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfWFNJWkVfSAorI2RlZmluZSBfWFNJWkVfSAorCisvKiBHZXQgc2l6ZV90LiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IFNJWkVfTUFYLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qIFRoZSBzaXplIG9mIG1lbW9yeSBvYmplY3RzIGlzIG9mdGVuIGNvbXB1dGVkIHRocm91Z2ggZXhwcmVzc2lvbnMgb2YKKyAgIHR5cGUgc2l6ZV90LiBFeGFtcGxlOgorICAgICAgdm9pZCogcCA9IG1hbGxvYyAoaGVhZGVyX3NpemUgKyBuICogZWxlbWVudF9zaXplKS4KKyAgIFRoZXNlIGNvbXB1dGF0aW9ucyBjYW4gbGVhZCB0byBvdmVyZmxvdy4gIFdoZW4gdGhpcyBoYXBwZW5zLCBtYWxsb2MoKQorICAgcmV0dXJucyBhIHBpZWNlIG9mIG1lbW9yeSB0aGF0IGlzIHdheSB0b28gc21hbGwsIGFuZCB0aGUgcHJvZ3JhbSB0aGVuCisgICBjcmFzaGVzIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCB0aGUgbWVtb3J5LgorICAgVG8gYXZvaWQgdGhpcywgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGluIHRoaXMgZmlsZSBjaGVjayBmb3Igb3ZlcmZsb3cuCisgICBUaGUgY29udmVudGlvbiBpcyB0aGF0IFNJWkVfTUFYIHJlcHJlc2VudHMgb3ZlcmZsb3cuCisgICBtYWxsb2MgKFNJWkVfTUFYKSBpcyBub3QgZ3VhcmFudGVlZCB0byBmYWlsIC0tIHRoaW5rIG9mIGEgbWFsbG9jCisgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbW1hcCAtLSwgaXQncyByZWNvbW1lbmRlZCB0byB1c2Ugc2l6ZV9vdmVyZmxvd19wKCkKKyAgIG9yIHNpemVfaW5fYm91bmRzX3AoKSBiZWZvcmUgaW52b2tpbmcgbWFsbG9jKCkuCisgICBUaGUgZXhhbXBsZSB0aHVzIGJlY29tZXM6CisgICAgICBzaXplX3Qgc2l6ZSA9IHhzdW0gKGhlYWRlcl9zaXplLCB4dGltZXMgKG4sIGVsZW1lbnRfc2l6ZSkpOworICAgICAgdm9pZCAqcCA9IChzaXplX2luX2JvdW5kc19wIChzaXplKSA/IG1hbGxvYyAoc2l6ZSkgOiBOVUxMKTsKKyovCisKKy8qIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHZhbHVlID49IDAgdG8gdHlwZSBzaXplX3QuICAqLworI2RlZmluZSB4Y2FzdF9zaXplX3QoTikgXAorICAoKE4pIDw9IFNJWkVfTUFYID8gKHNpemVfdCkgKE4pIDogU0laRV9NQVgpCisKKy8qIFN1bSBvZiB0d28gc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLworc3RhdGljIGlubGluZSBzaXplX3QKKyNpZiBfX0dOVUNfXyA+PSAzCitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCit4c3VtIChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMikKK3sKKyAgc2l6ZV90IHN1bSA9IHNpemUxICsgc2l6ZTI7CisgIHJldHVybiAoc3VtID49IHNpemUxID8gc3VtIDogU0laRV9NQVgpOworfQorCisvKiBTdW0gb2YgdGhyZWUgc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLworc3RhdGljIGlubGluZSBzaXplX3QKKyNpZiBfX0dOVUNfXyA+PSAzCitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCit4c3VtMyAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIsIHNpemVfdCBzaXplMykKK3sKKyAgcmV0dXJuIHhzdW0gKHhzdW0gKHNpemUxLCBzaXplMiksIHNpemUzKTsKK30KKworLyogU3VtIG9mIGZvdXIgc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLworc3RhdGljIGlubGluZSBzaXplX3QKKyNpZiBfX0dOVUNfXyA+PSAzCitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCit4c3VtNCAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIsIHNpemVfdCBzaXplMywgc2l6ZV90IHNpemU0KQoreworICByZXR1cm4geHN1bSAoeHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpLCBzaXplNCk7Cit9CisKKy8qIE1heGltdW0gb2YgdHdvIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CisjaWYgX19HTlVDX18gPj0gMworX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbmRpZgoreG1heCAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpCit7CisgIC8qIE5vIGV4cGxpY2l0IGNoZWNrIGlzIG5lZWRlZCBoZXJlLCBiZWNhdXNlIGZvciBhbnkgbjoKKyAgICAgbWF4IChTSVpFX01BWCwgbikgPT0gU0laRV9NQVggYW5kIG1heCAobiwgU0laRV9NQVgpID09IFNJWkVfTUFYLiAgKi8KKyAgcmV0dXJuIChzaXplMSA+PSBzaXplMiA/IHNpemUxIDogc2l6ZTIpOworfQorCisvKiBNdWx0aXBsaWNhdGlvbiBvZiBhIGNvdW50IHdpdGggYW4gZWxlbWVudCBzaXplLCB3aXRoIG92ZXJmbG93IGNoZWNrLgorICAgVGhlIGNvdW50IG11c3QgYmUgPj0gMCBhbmQgdGhlIGVsZW1lbnQgc2l6ZSBtdXN0IGJlID4gMC4KKyAgIFRoaXMgaXMgYSBtYWNybywgbm90IGFuIGlubGluZSBmdW5jdGlvbiwgc28gdGhhdCBpdCB3b3JrcyBjb3JyZWN0bHkgZXZlbgorICAgd2hlbiBOIGlzIG9mIGEgd2lkZXIgdHVwZSBhbmQgTiA+IFNJWkVfTUFYLiAgKi8KKyNkZWZpbmUgeHRpbWVzKE4sIEVMU0laRSkgXAorICAoKE4pIDw9IFNJWkVfTUFYIC8gKEVMU0laRSkgPyAoc2l6ZV90KSAoTikgKiAoRUxTSVpFKSA6IFNJWkVfTUFYKQorCisvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICAqLworI2RlZmluZSBzaXplX292ZXJmbG93X3AoU0laRSkgXAorICAoKFNJWkUpID09IFNJWkVfTUFYKQorLyogQ2hlY2sgYWdhaW5zdCBvdmVyZmxvdy4gICovCisjZGVmaW5lIHNpemVfaW5fYm91bmRzX3AoU0laRSkgXAorICAoKFNJWkUpICE9IFNJWkVfTUFYKQorCisjZW5kaWYgLyogX1hTSVpFX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLmJzZC1saWIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9NYWtlZmlsZS5ic2QtbGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTlkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9NYWtlZmlsZS5ic2QtbGliCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgVGhpcyBpcyBhIE1ha2VmaWxlIHN0dWIgd2hpY2ggaGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgQlNEIHNoYXJlZAorIyBsaWJyYXJpZXMuCisjCisjIEluIG9yZGVyIHRvIHVzZSB0aGlzIHN0dWIsIHRoZSBmb2xsb3dpbmcgbWFrZWZpbGUgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZC4KKyMgCisjIEJTRExJQl9WRVJTSU9OID0gMS4wCisjIEJTRExJQl9JTUFHRSA9IGxpYmNlCisjIEJTRExJQl9NWURJUiA9IGV0CisjIEJTRExJQl9JTlNUQUxMX0RJUiA9ICQoU0hMSUJESVIpCisjCisKK2FsbDo6IGltYWdlCisKK3JlYWwtc3ViZGlyczo6IE1ha2VmaWxlCisJQGVjaG8gIglNS0RJUiBwaWMiCisJQG1rZGlyIC1wIHBpYworCitCU0RfTElCID0gJChCU0RMSUJfSU1BR0UpLnNvLiQoQlNETElCX1ZFUlNJT04pCitCU0RMSUJfUElDX0ZMQUcgPSAtZnBpYworCitpbWFnZToJCSQoQlNEX0xJQikKKworJChCU0RfTElCKTogJChPQkpTKQorCShjZCBwaWM7IGxkIC1Cc2hhcmVhYmxlIC1vICQoQlNEX0xJQikgJChPQkpTKSkKKwkkKE1WKSBwaWMvJChCU0RfTElCKSAuCisJJChSTSkgLWYgLi4vJChCU0RfTElCKQorCShjZCAuLjsgJChMTikgJChMSU5LX0JVSUxEX0ZMQUdTKSBcCisJCWBlY2hvICQobXlfZGlyKSB8IHNlZCAtZSAncztsaWIvOzsnYC8kKEJTRF9MSUIpICQoQlNEX0xJQikpCisKK2luc3RhbGwtc2hsaWJzIGluc3RhbGw6OiAkKEJTRF9MSUIpCisJQGVjaG8gIglJTlNUQUxMX1BST0dSQU0gJChCU0RMSUJfSU5TVEFMTF9ESVIpLyQoQlNEX0xJQikiCisJQCQoSU5TVEFMTF9QUk9HUkFNKSAkKEJTRF9MSUIpIFwKKwkJJChERVNURElSKSQoQlNETElCX0lOU1RBTExfRElSKS8kKEJTRF9MSUIpCisJQC0kKExEQ09ORklHKQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisKK2luc3RhbGwtc2hsaWJzLXN0cmlwOiBpbnN0YWxsLXNobGlicworCit1bmluc3RhbGwtc2hsaWJzIHVuaW5zdGFsbDo6CisJJChSTSkgLWYgJChERVNURElSKSQoQlNETElCX0lOU1RBTExfRElSKS8kKEJTRF9MSUIpCisKK2NsZWFuOjoKKwkkKFJNKSAtcmYgcGljCisJJChSTSkgLWYgJChCU0RfTElCKQorCSQoUk0pIC1mIC4uLyQoQlNEX0xJQikKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLmNoZWNrZXIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9NYWtlZmlsZS5jaGVja2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZmYwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9NYWtlZmlsZS5jaGVja2VyCkBAIC0wLDAgKzEsMTcgQEAKK2FsbDo6ICQoTElCUkFSWSlfY2hrLmEKKworcmVhbC1zdWJkaXJzOjogTWFrZWZpbGUKKwkkKEUpICIJTUtESVIgY2hlY2tlciIKKwkkKFEpIG1rZGlyIC1wIGNoZWNrZXIKKworY2xlYW46OgorCSQoUk0pIC1yZiBjaGVja2VyCisKKyQoTElCUkFSWSlfY2hrLmE6ICQoT0JKUykKKwkkKEUpICIJR0VOX0NIRUNLRVJfTElCICRAIgorCSQoUSkgKHRlc3QgLXIgJEAgJiYgJChSTSkgLWYgJEAuYmFrICYmICQoTVYpICRAICRALmJhaykKKwkkKFEpIChjZCBjaGVja2VyOyAkKEFSR0VOKSAkQCAkKE9CSlMpKQorCS0kKFEpICQoUkFOTElCKSAkQAorCSQoUSkgJChSTSkgLWYgLi4vJEAKKwkkKFEpIChjZCAuLiA7ICQoTE4pICQoTElOS19CVUlMRF9GTEFHUykgXAorCSAgICAgYGVjaG8gJChteV9kaXIpIHwgc2VkIC1lICdzO2xpYi87OydgLyRAICRAKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvTWFrZWZpbGUuZGFyd2luLWxpYiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLmRhcndpbi1saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0YTVlNwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLmRhcndpbi1saWIKQEAgLTAsMCArMSw1MSBAQAorIworIyBUaGlzIGlzIGEgTWFrZWZpbGUgc3R1YiB3aGljaCBoYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBEYXJ3aW4gQlNEIHNoYXJlZAorIyBsaWJyYXJpZXMuCisjCisjIEluIG9yZGVyIHRvIHVzZSB0aGlzIHN0dWIsIHRoZSBmb2xsb3dpbmcgbWFrZWZpbGUgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZC4KKyMKKyMgQlNETElCX1ZFUlNJT04gPSAxLjAKKyMgQlNETElCX0lNQUdFID0gbGliY2UKKyMgQlNETElCX01ZRElSID0gZXQKKyMgQlNETElCX0lOU1RBTExfRElSID0gJChTSExJQkRJUikKKyMKKworYWxsOjogaW1hZ2UKKworcmVhbC1zdWJkaXJzOjogTWFrZWZpbGUKKwkkKEUpICIJTUtESVIgcGljIgorCSQoUSkgbWtkaXIgLXAgcGljCisKK0JTRF9MSUIgPSAkKEJTRExJQl9JTUFHRSkuJChCU0RMSUJfVkVSU0lPTikuZHlsaWIKK0JTRExJQl9QSUNfRkxBRyA9IC1mUElDCisKK2ltYWdlOgkJJChCU0RfTElCKQorCiskKEJTRF9MSUIpOiAkKE9CSlMpCisJJChFKSAiCUdFTl9CU0RfU09MSUIgJChCU0RfTElCKSIKKwkkKFEpIChjZCBwaWM7ICQoQ0MpIC1keW5hbWljbGliIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gMS4wIC1jdXJyZW50X3ZlcnNpb24gJChCU0RMSUJfVkVSU0lPTikgXAorCQktZmxhdF9uYW1lc3BhY2UgLXVuZGVmaW5lZCB3YXJuaW5nIC1vICQoQlNEX0xJQikgJChPQkpTKSkKKwkkKFEpICQoTVYpIHBpYy8kKEJTRF9MSUIpIC4KKwkkKFEpICQoUk0pIC1mIC4uLyQoQlNEX0xJQikKKwkkKFEpIChjZCAuLjsgJChMTikgJChMSU5LX0JVSUxEX0ZMQUdTKSBcCisJCWBlY2hvICQobXlfZGlyKSB8IHNlZCAtZSAncztsaWIvOzsnYC8kKEJTRF9MSUIpICQoQlNEX0xJQikpCisJJChRKSAoY2QgLi47ICQoTE4pICQoTElOS19CVUlMRF9GTEFHUykgJChCU0RfTElCKSAkKEJTRExJQl9JTUFHRSkuZHlsaWIpCisKK2luc3RhbGwtc2hsaWJzIGluc3RhbGw6OiAkKEJTRF9MSUIpCisJJChFKSAiCUlOU1RBTExfUFJPR1JBTSAkKEJTRExJQl9JTlNUQUxMX0RJUikvJChCU0RfTElCKSIKKwkkKFEpICQoSU5TVEFMTF9QUk9HUkFNKSAkKEJTRF9MSUIpIFwKKwkJJChERVNURElSKSQoQlNETElCX0lOU1RBTExfRElSKS8kKEJTRF9MSUIpCisJLSQoUSkgJChMRENPTkZJRykKKworaW5zdGFsbC1zdHJpcDogaW5zdGFsbAorCitpbnN0YWxsLXNobGlicy1zdHJpcDogaW5zdGFsbC1zaGxpYnMKKwordW5pbnN0YWxsLXNobGlicyB1bmluc3RhbGw6OgorCSQoUk0pIC1mICQoREVTVERJUikkKEJTRExJQl9JTlNUQUxMX0RJUikvJChCU0RfTElCKQorCitjbGVhbjo6CisJJChSTSkgLXJmIHBpYworCSQoUk0pIC1mICQoQlNEX0xJQikKKwkkKFJNKSAtZiAuLi8kKEJTRF9MSUIpCisJJChSTSkgLWYgLi4vJChCU0RMSUJfSU1BR0UpLmR5bGliCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9NYWtlZmlsZS5lbGYtbGliIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvTWFrZWZpbGUuZWxmLWxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTYwMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvTWFrZWZpbGUuZWxmLWxpYgpAQCAtMCwwICsxLDc3IEBACisjCisjIFRoaXMgaXMgYSBNYWtlZmlsZSBzdHViIHdoaWNoIGhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIExpbnV4IEVMRiBzaGFyZWQKKyMgbGlicmFyaWVzLgorIworIyBJbiBvcmRlciB0byB1c2UgdGhpcyBzdHViLCB0aGUgZm9sbG93aW5nIG1ha2VmaWxlIHZhcmlhYmxlcyBtdXN0IGJlIGRlZmluZWQuCisjIAorIyBFTEZfVkVSU0lPTiA9IDEuMAorIyBFTEZfU09fVkVSU0lPTiA9IDEKKyMgRUxGX0lNQUdFID0gbGliY2UKKyMgRUxGX01ZRElSID0gZXQKKyMgRUxGX0lOU1RBTExfRElSID0gJChTSExJQkRJUikKKyMgRUxGX09USEVSX0xJQlMgPSAtbGMKKworYWxsOjogaW1hZ2UKKworcmVhbC1zdWJkaXJzOjogTWFrZWZpbGUKKwkkKEUpICIJTUtESVIgZWxmc2hhcmVkIgorCSQoUSkgbWtkaXIgLXAgZWxmc2hhcmVkCisKK0VMRl9MSUIgPSAkKEVMRl9JTUFHRSkuc28uJChFTEZfVkVSU0lPTikKK0VMRl9TT05BTUUgPSAkKEVMRl9JTUFHRSkuc28uJChFTEZfU09fVkVSU0lPTikKKworaW1hZ2U6CQkkKEVMRl9MSUIpCisKKyQoRUxGX0xJQik6ICQoT0JKUykKKwkkKEUpICIJR0VOX0VMRl9TT0xJQiAkKEVMRl9MSUIpIgorCSQoUSkgKGNkIGVsZnNoYXJlZDsgJChDQykgLS1zaGFyZWQgLW8gJChFTEZfTElCKSAkKExERkxBR1MpIFwKKwkJLVdsLC1zb25hbWUsJChFTEZfU09OQU1FKSAkKE9CSlMpICQoRUxGX09USEVSX0xJQlMpKQorCSQoUSkgJChNVikgZWxmc2hhcmVkLyQoRUxGX0xJQikgLgorCSQoUSkgJChSTSkgLWYgLi4vJChFTEZfTElCKSAuLi8kKEVMRl9JTUFHRSkuc28gLi4vJChFTEZfU09OQU1FKQorCSQoUSkgKGNkIC4uOyAkKExOKSAkKExJTktfQlVJTERfRkxBR1MpIFwKKwkJYGVjaG8gJChteV9kaXIpIHwgc2VkIC1lICdzO2xpYi87OydgLyQoRUxGX0xJQikgJChFTEZfTElCKSkKKwkkKFEpIChjZCAuLjsgJChMTikgJChMSU5LX0JVSUxEX0ZMQUdTKSAkKEVMRl9MSUIpICQoRUxGX0lNQUdFKS5zbykKKwkkKFEpIChjZCAuLjsgJChMTikgJChMSU5LX0JVSUxEX0ZMQUdTKSAkKEVMRl9MSUIpICQoRUxGX1NPTkFNRSkpCisKK2luc3RhbGxkaXJzLWVsZi1saWI6OgorCSQoRSkgIglNS0lOU1RBTExESVJTICQoRUxGX0lOU1RBTExfRElSKSAkKGxpYmRpcikiCisJJChRKSAkKE1LSU5TVEFMTERJUlMpICQoREVTVERJUikkKEVMRl9JTlNUQUxMX0RJUikgXAorCQkkKERFU1RESVIpJChsaWJkaXIpCisKK2luc3RhbGxkaXJzOjogaW5zdGFsbGRpcnMtZWxmLWxpYgorCitpbnN0YWxsLXNobGlicyBpbnN0YWxsOjogJChFTEZfTElCKSBpbnN0YWxsZGlycy1lbGYtbGliCisJJChFKSAiCUlOU1RBTEwtRUxGLUxJQiAkKEVMRl9JTlNUQUxMX0RJUikvJChFTEZfTElCKSIKKwkkKFEpICQoSU5TVEFMTF9QUk9HUkFNKSAkKEVMRl9MSUIpICQoREVTVERJUikkKEVMRl9JTlNUQUxMX0RJUikvJChFTEZfTElCKQorCSQoRSkgIglTWU1MSU5LICQoRUxGX0lOU1RBTExfRElSKS8kKEVMRl9TT05BTUUpIgorCSQoUSkgJChMTl9TKSAtZiAkKEVMRl9MSUIpICQoREVTVERJUikkKEVMRl9JTlNUQUxMX0RJUikvJChFTEZfU09OQU1FKQorCSQoRSkgIglTWU1MSU5LICQobGliZGlyKS8kKEVMRl9JTUFHRSkuc28iCisJJChRKSBpZiB0ZXN0ICIkKEVMRl9JTlNUQUxMX0RJUikiID0gIiQobGliZGlyKSI7IHRoZW4gXAorCQkkKExOX1MpIC1mICQoRUxGX1NPTkFNRSkgJChERVNURElSKSQobGliZGlyKS8kKEVMRl9JTUFHRSkuc28gOyBcCisJZWxzZSBcCisJCSQoTE5fUykgLWYgJChFTEZfSU5TVEFMTF9ESVIpLyQoRUxGX1NPTkFNRSkgXAorCQkJJChERVNURElSKSQobGliZGlyKS8kKEVMRl9JTUFHRSkuc287IFwKKwlmaQkJCQorCSQoRSkgIglMRENPTkZJRyIKKwkkKFEpIC0kKExEQ09ORklHKQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisJJChFKSAiCVNUUklQLUxJQiAkKEVMRl9JTlNUQUxMX0RJUikvJChFTEZfTElCKSIKKwkkKFEpICQoU1RSSVApIC0tc3RyaXAtdW5uZWVkZWQgLS1yZW1vdmUtc2VjdGlvbj0uY29tbWVudCBcCisJCS0tcmVtb3ZlLXNlY3Rpb249Lm5vdGUgJChERVNURElSKSQoRUxGX0lOU1RBTExfRElSKS8kKEVMRl9MSUIpCisKK2luc3RhbGwtc2hsaWJzLXN0cmlwOiBpbnN0YWxsLXNobGlicworCSQoRSkgIglTVFJJUC1MSUIgJChFTEZfSU5TVEFMTF9ESVIpLyQoRUxGX0xJQikiCisJJChRKSAkKFNUUklQKSAtLXN0cmlwLXVubmVlZGVkIC0tcmVtb3ZlLXNlY3Rpb249LmNvbW1lbnQgXAorCQktLXJlbW92ZS1zZWN0aW9uPS5ub3RlICQoREVTVERJUikkKEVMRl9JTlNUQUxMX0RJUikvJChFTEZfTElCKQorCit1bmluc3RhbGwtc2hsaWJzIHVuaW5zdGFsbDo6CisJJChSTSkgLWYgJChERVNURElSKSQoRUxGX0lOU1RBTExfRElSKS8kKEVMRl9MSUIpIFwKKwkJJChERVNURElSKSQoRUxGX0lOU1RBTExfRElSKS8kKEVMRl9TT05BTUUpIFwKKwkJJChERVNURElSKSQobGliZGlyKS8kKEVMRl9JTUFHRSkuc28KKwktJChMRENPTkZJRykKKworY2xlYW46OgorCSQoUk0pIC1yZiBlbGZzaGFyZWQKKwkkKFJNKSAtZiAkKEVMRl9MSUIpCisJJChSTSkgLWYgLi4vJChFTEZfTElCKSAuLi8kKEVMRl9JTUFHRSkuc28gLi4vJChFTEZfU09OQU1FKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvTWFrZWZpbGUubGlicmFyeSBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLmxpYnJhcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4NmIwMgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLmxpYnJhcnkKQEAgLTAsMCArMSwyNSBAQAorYWxsOjogc3ViZGlycyAkKExJQlJBUlkpLmEKKworaW5zdGFsbC1zaGxpYnM6OgorCit1bmluc3RhbGwtc2hsaWJzOjoKKworcmVhbC1zdWJkaXJzOjoKKworc3ViZGlyczo6IE1ha2VmaWxlCisJJChRKSAkKE1BS0UpIC1zIHJlYWwtc3ViZGlycworCSQoUSkgdG91Y2ggc3ViZGlycworCitjbGVhbjo6CisJJChRKSAkKFJNKSAtZiBzdWJkaXJzCisKKyQoTElCUkFSWSkuYTogJChPQkpTKQorCSQoRSkgIglHRU5fTElCICRAIgorCSQoUSkgKGlmIHRlc3QgLXIgJEA7IHRoZW4gJChSTSkgLWYgJEAuYmFrICYmICQoTVYpICRAICRALmJhazsgZmkpCisJJChRKSAkKEFSR0VOKSAkQCAkKE9CSlMpCisJLUAkKFJBTkxJQikgJEAKKwkkKFEpICQoUk0pIC1mIC4uLyRACisJJChRKSAoY2QgLi47ICQoTE4pICQoTElOS19CVUlMRF9GTEFHUykgXAorCQlgZWNobyAkKG15X2RpcikgfCBzZWQgLWUgJ3M7bGliLzs7J2AvJEAgJEApCisKKyQoTElCKS8kKExJQlJBUlkpLmE6ICQoTElCUkFSWSkuYQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvTWFrZWZpbGUucHJvZmlsZSBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLnByb2ZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZjViYwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLnByb2ZpbGUKQEAgLTAsMCArMSwyNyBAQAorYWxsOjogJChMSUJSQVJZKV9wLmEKKworcmVhbC1zdWJkaXJzOjogTWFrZWZpbGUKKwkkKEUpICIJTUtESVIgcHJvZmlsZWQiCisJJChRKSBta2RpciAtcCBwcm9maWxlZAorCitjbGVhbjo6CisJJChSTSkgLXJmIHByb2ZpbGVkCisJJChSTSkgLWYgJChMSUJSQVJZKV9wLmEgLi4vJChMSUJSQVJZKV9wLmEKKworJChMSUJSQVJZKV9wLmE6ICQoT0JKUykKKwkkKEUpICIJR0VOX1BST0ZJTEVEX0xJQiAkKEVMRl9MSUIpIgorCSQoUSkgKGlmIHRlc3QgLXIgJEA7IHRoZW4gJChSTSkgLWYgJEAuYmFrICYmICQoTVYpICRAICRALmJhazsgZmkpCisJJChRKSAoY2QgcHJvZmlsZWQ7ICQoQVJVUEQpIC4uLyRAICQoT0JKUykpCisJLSQoUSkgJChSQU5MSUIpICRACisJJChRKSAkKFJNKSAtZiAuLi8kQAorCSQoUSkgKGNkIC4uOyAkKExOKSAkKExJTktfQlVJTERfRkxBR1MpIFwKKwkJYGVjaG8gJChteV9kaXIpIHwgc2VkIC1lICdzO2xpYi87OydgLyRAICRAKQorCitpbnN0YWxsOjogJChMSUJSQVJZKV9wLmEgaW5zdGFsbGRpcnMKKwkkKEUpICIJSU5TVEFMTF9EQVRBICQobGliZGlyKS8kKExJQlJBUlkpX3AuYSIKKwkkKFEpICQoSU5TVEFMTF9EQVRBKSAkKExJQlJBUlkpX3AuYSAkKERFU1RESVIpJChsaWJkaXIpLyQoTElCUkFSWSlfcC5hCisJLSQoUSkgJChSQU5MSUIpICQoREVTVERJUikkKGxpYmRpcikvJChMSUJSQVJZKV9wLmEKKwkkKFEpICQoQ0hNT0QpICQoTElCTU9ERSkgJChERVNURElSKSQobGliZGlyKS8kKExJQlJBUlkpX3AuYQorCit1bmluc3RhbGw6OgorCSQoUk0pIC1mICQoREVTVERJUikkKGxpYmRpcikvJChMSUJSQVJZKV9wLmEKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLnNvbGFyaXMtbGliIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvTWFrZWZpbGUuc29sYXJpcy1saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiZGJlMgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL01ha2VmaWxlLnNvbGFyaXMtbGliCkBAIC0wLDAgKzEsNjQgQEAKKyMKKyMgVGhpcyBpcyBhIE1ha2VmaWxlIHN0dWIgd2hpY2ggaGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgTGludXggRUxGIHNoYXJlZAorIyBsaWJyYXJpZXMuCisjCisjIEluIG9yZGVyIHRvIHVzZSB0aGlzIHN0dWIsIHRoZSBmb2xsb3dpbmcgbWFrZWZpbGUgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZC4KKyMgCisjIEVMRl9WRVJTSU9OID0gMS4wCisjIEVMRl9TT19WRVJTSU9OID0gMQorIyBFTEZfSU1BR0UgPSBsaWJjZQorIyBFTEZfTVlESVIgPSBldAorIyBFTEZfSU5TVEFMTF9ESVIgPSAkKFNITElCRElSKQorIyBFTEZfT1RIRVJfTElCUyA9IC1sYworCithbGw6OiBpbWFnZQorCityZWFsLXN1YmRpcnM6OiBNYWtlZmlsZQorCSQoRSkgIglNS0RJUiBlbGZzaGFyZWQiCisJJChRKSBta2RpciAtcCBlbGZzaGFyZWQKKworRUxGX0xJQiA9ICQoRUxGX0lNQUdFKS5zby4kKEVMRl9WRVJTSU9OKQorRUxGX1NPTkFNRSA9ICQoRUxGX0lNQUdFKS5zby4kKEVMRl9TT19WRVJTSU9OKQorCitpbWFnZToJCSQoRUxGX0xJQikKKworJChFTEZfTElCKTogJChPQkpTKQorCSQoRSkgIglHRU5fRUxGX1NPTElCICQoRUxGX0xJQikiCisJJChRKSAoY2QgZWxmc2hhcmVkOyAkKENDKSAtLXNoYXJlZCAtbyAkKEVMRl9MSUIpICQoTERGTEFHUykgXAorCQktV2wsLWgsJChFTEZfU09OQU1FKSAkKE9CSlMpICQoRUxGX09USEVSX0xJQlMpKQorCSQoUSkgJChNVikgZWxmc2hhcmVkLyQoRUxGX0xJQikgLgorCSQoUSkgJChSTSkgLWYgLi4vJChFTEZfTElCKSAuLi8kKEVMRl9JTUFHRSkuc28gLi4vJChFTEZfU09OQU1FKQorCSQoUSkgKGNkIC4uOyAkKExOKSAkKExJTktfQlVJTERfRkxBR1MpIFwKKwkJYGVjaG8gJChteV9kaXIpIHwgc2VkIC1lICdzO2xpYi87OydgLyQoRUxGX0xJQikgJChFTEZfTElCKSkKKwkkKFEpIChjZCAuLjsgJChMTikgJChMSU5LX0JVSUxEX0ZMQUdTKSAkKEVMRl9MSUIpICQoRUxGX0lNQUdFKS5zbykKKwkkKFEpIChjZCAuLjsgJChMTikgJChMSU5LX0JVSUxEX0ZMQUdTKSAkKEVMRl9MSUIpICQoRUxGX1NPTkFNRSkpCisKK2luc3RhbGxkaXJzLWVsZi1saWI6OgorCSQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQoRUxGX0lOU1RBTExfRElSKSBcCisJCSQoREVTVERJUikkKGxpYmRpcikKKworaW5zdGFsbGRpcnM6OiBpbnN0YWxsZGlycy1lbGYtbGliCisKK2luc3RhbGwtc2hsaWJzIGluc3RhbGw6OiAkKEVMRl9MSUIpIGluc3RhbGxkaXJzLWVsZi1saWIKKwkkKElOU1RBTExfUFJPR1JBTSkgJChFTEZfTElCKSAkKERFU1RESVIpJChFTEZfSU5TVEFMTF9ESVIpLyQoRUxGX0xJQikKKwkkKExOX1MpIC1mICQoRUxGX0xJQikgJChERVNURElSKSQoRUxGX0lOU1RBTExfRElSKS8kKEVMRl9TT05BTUUpCisJJChMTl9TKSAtZiAkKEVMRl9JTlNUQUxMX0RJUikvJChFTEZfU09OQU1FKSBcCisJCSQoREVTVERJUikkKGxpYmRpcikvJChFTEZfSU1BR0UpLnNvCisJLSQoTERDT05GSUcpCisKK2luc3RhbGwtc3RyaXA6IGluc3RhbGwKKwkkKFNUUklQKSAteCAkKERFU1RESVIpJChFTEZfSU5TVEFMTF9ESVIpLyQoRUxGX0xJQikKKworaW5zdGFsbC1zaGxpYnMtc3RyaXA6IGluc3RhbGwtc2hsaWJzCisJJChTVFJJUCkgLXggJChERVNURElSKSQoRUxGX0lOU1RBTExfRElSKS8kKEVMRl9MSUIpCisKK3VuaW5zdGFsbC1zaGxpYnMgdW5pbnN0YWxsOjoKKwkkKFJNKSAtZiAkKERFU1RESVIpJChFTEZfSU5TVEFMTF9ESVIpLyQoRUxGX0xJQikgXAorCQkkKERFU1RESVIpJChFTEZfSU5TVEFMTF9ESVIpLyQoRUxGX1NPTkFNRSkgXAorCQkkKERFU1RESVIpJChsaWJkaXIpLyQoRUxGX0lNQUdFKS5zbworCS0kKExEQ09ORklHKQorCitjbGVhbjo6CisJJChSTSkgLXJmIGVsZnNoYXJlZAorCSQoUk0pIC1mICQoRUxGX0xJQikKKwkkKFJNKSAtZiAuLi8kKEVMRl9MSUIpIC4uLyQoRUxGX0lNQUdFKS5zbyAuLi8kKEVMRl9TT05BTUUpCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9NYWtlZmlsZS5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTMxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIwOSBAQAorIyBNYWtlZmlsZSBmb3IgbGliYmxraWQKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxIFRoZW9kb3JlIFRzJ28gKHR5dHNvQG1pdC5lZHUpCisjCisjIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisjIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAordG9wX2J1aWxkZGlyID0gLi4vLi4KK215X2RpciA9IGxpYi9ibGtpZAorSU5TVEFMTCA9IEBJTlNUQUxMQAorCitATUNPTkZJR0AKKworYWxsOjogCisKK1NNQU5QQUdFUz0JbGliYmxraWQuMworCitPQkpTPSBjYWNoZS5vIGRldi5vIGRldm5hbWUubyBkZXZuby5vIGdldHNpemUubyBsbHNlZWsubyBwcm9iZS5vIFwKKyByZWFkLm8gcmVzb2x2ZS5vIHNhdmUubyB0YWcubyB2ZXJzaW9uLm8gCisKK1NSQ1M9ICQoc3JjZGlyKS9jYWNoZS5jICQoc3JjZGlyKS9kZXYuYyAkKHNyY2RpcikvZGV2bmFtZS5jICQoc3JjZGlyKS9kZXZuby5jIFwKKyAkKHNyY2RpcikvZ2V0c2l6ZS5jICQoc3JjZGlyKS9sbHNlZWsuYyAkKHNyY2RpcikvcHJvYmUuYyBcCisgJChzcmNkaXIpL3JlYWQuYyAkKHNyY2RpcikvcmVzb2x2ZS5jICQoc3JjZGlyKS9zYXZlLmMgJChzcmNkaXIpL3RhZy5jIFwKKyAkKHNyY2RpcikvdmVyc2lvbi5jCisKK0hGSUxFU19JTj0JYmxraWQuaCBibGtpZF90eXBlcy5oCisKK0xJQlJBUlk9IGxpYmJsa2lkCitMSUJESVI9IGJsa2lkCisKK0VMRl9WRVJTSU9OID0gMS4wCitFTEZfU09fVkVSU0lPTiA9IDEKK0VMRl9JTUFHRSA9IGxpYmJsa2lkCitFTEZfTVlESVIgPSBibGtpZAorRUxGX0lOU1RBTExfRElSID0gJChyb290X2xpYmRpcikKK0VMRl9PVEhFUl9MSUJTID0gLUwuLi8uLiAtbHV1aWQKKworQlNETElCX1ZFUlNJT04gPSAyLjAKK0JTRExJQl9JTUFHRSA9IGxpYmJsa2lkCitCU0RMSUJfTVlESVIgPSBibGtpZAorQlNETElCX0lOU1RBTExfRElSID0gJChyb290X2xpYmRpcikKKworQE1BS0VGSUxFX0xJQlJBUllACitATUFLRUZJTEVfRUxGQAorQE1BS0VGSUxFX0JTRExJQkAKK0BNQUtFRklMRV9QUk9GSUxFQAorQE1BS0VGSUxFX0NIRUNLRVJACisKK0xJQlNfQkxLSUQ9CSQoU1RBVElDX0xJQkJMS0lEKSAkKFNUQVRJQ19MSUJVVUlEKQorREVQTElCU19CTEtJRD0JJChERVBTVEFUSUNfTElCQkxLSUQpICQoREVQU1RBVElDX0xJQlVVSUQpCisKKy5jLm86CisJJChFKSAiCUNDICQ8IgorCSQoUSkgJChDQykgJChBTExfQ0ZMQUdTKSAtYyAkPCAtbyAkQAorQFBST0ZJTEVfQ01UQAkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgLWcgLXBnIC1vIHByb2ZpbGVkLyQqLm8gLWMgJDwKK0BDSEVDS0VSX0NNVEAJJChRKSAkKENDKSAkKEFMTF9DRkxBR1MpIC1jaGVja2VyIC1nIC1vIGNoZWNrZXIvJCoubyAtYyAkPAorQEVMRl9DTVRACSQoUSkgJChDQykgJChBTExfQ0ZMQUdTKSAtZlBJQyAtbyBlbGZzaGFyZWQvJCoubyAtYyAkPAorQEJTRExJQl9DTVRACSQoUSkgJChDQykgJChBTExfQ0ZMQUdTKSAkKEJTRExJQl9QSUNfRkxBRykgLW8gcGljLyQqLm8gLWMgJDwKKworYWxsOjogJChTTUFOUEFHRVMpIGJsa2lkLnBjCisKK2Jsa2lkX3R5cGVzLmg6ICQoc3JjZGlyKS9ibGtpZF90eXBlcy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJJChFKSAiCUNPTkZJRy5TVEFUVVMgJEAiCisJJChRKSBjZCAkKHRvcF9idWlsZGRpcik7IFwKKwkJQ09ORklHX0ZJTEVTPSQobXlfZGlyKS9ibGtpZF90eXBlcy5oIC4vY29uZmlnLnN0YXR1cworCitibGtpZC5oOiAkKHNyY2RpcikvYmxraWQuaC5pbgorCSQoRSkgIglDUCAkQCIKKwkkKFEpIGNwICQoc3JjZGlyKS9ibGtpZC5oLmluIGJsa2lkLmgKKworbGliYmxraWQuMzogJChERVBfU1VCU1RJVFVURSkgJChzcmNkaXIpL2xpYmJsa2lkLjMuaW4KKwkkKEUpICIJU1VCU1QgJEAiCisJJChRKSAkKFNVQlNUSVRVVEVfVVBUSU1FKSAkKHNyY2RpcikvbGliYmxraWQuMy5pbiBsaWJibGtpZC4zCisKK3RzdF9jYWNoZTogJChzcmNkaXIpL2NhY2hlLmMgJChERVBMSUJTX0JMS0lEKQorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIHRzdF9jYWNoZSAtRFRFU1RfUFJPR1JBTSAkKHNyY2RpcikvY2FjaGUuYyAkKExJQlNfQkxLSUQpICQoQUxMX0NGTEFHUykKKwordHN0X2RldjogJChzcmNkaXIpL2Rldi5jICQoREVQTElCU19CTEtJRCkKKwkkKEUpICIJTEQgJEAiCisJJChRKSAkKENDKSAtbyB0c3RfZGV2IC1EVEVTVF9QUk9HUkFNICQoc3JjZGlyKS9kZXYuYyAkKExJQlNfQkxLSUQpICQoQUxMX0NGTEFHUykKKwordHN0X2Rldm5hbWU6ICQoc3JjZGlyKS9kZXZuYW1lLmMgJChERVBMSUJTX0JMS0lEKQorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIHRzdF9kZXZuYW1lIC1EVEVTVF9QUk9HUkFNICQoc3JjZGlyKS9kZXZuYW1lLmMgJChMSUJTX0JMS0lEKSAkKEFMTF9DRkxBR1MpCisKK3RzdF9kZXZubzogJChzcmNkaXIpL2Rldm5vLmMgJChERVBMSUJTX0JMS0lEKQorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIHRzdF9kZXZubyAtRFRFU1RfUFJPR1JBTSAkKHNyY2RpcikvZGV2bm8uYyAkKExJQlNfQkxLSUQpICQoQUxMX0NGTEFHUykKKwordHN0X2dldHNpemU6ICQoc3JjZGlyKS9nZXRzaXplLmMgJChERVBMSUJTX0JMS0lEKQorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIHRzdF9nZXRzaXplIC1EVEVTVF9QUk9HUkFNICQoc3JjZGlyKS9nZXRzaXplLmMgJChMSUJTX0JMS0lEKSAkKEFMTF9DRkxBR1MpCisKK3RzdF9wcm9iZTogJChzcmNkaXIpL3Byb2JlLmMgJChERVBMSUJTX0JMS0lEKQorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIHRzdF9wcm9iZSAtRFRFU1RfUFJPR1JBTSAkKHNyY2RpcikvcHJvYmUuYyAkKExJQlNfQkxLSUQpICQoQUxMX0NGTEFHUykKKwordHN0X3JlYWQ6ICQoc3JjZGlyKS9yZWFkLmMgJChERVBMSUJTX0JMS0lEKQorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIHRzdF9yZWFkIC1EVEVTVF9QUk9HUkFNICQoc3JjZGlyKS9yZWFkLmMgJChMSUJTX0JMS0lEKSAkKEFMTF9DRkxBR1MpCisKK3RzdF9yZXNvbHZlOiAkKHNyY2RpcikvcmVzb2x2ZS5jICQoREVQTElCU19CTEtJRCkKKwkkKEUpICIJTEQgJEAiCisJJChRKSAkKENDKSAtbyB0c3RfcmVzb2x2ZSAtRFRFU1RfUFJPR1JBTSAkKHNyY2RpcikvcmVzb2x2ZS5jICQoTElCU19CTEtJRCkgJChBTExfQ0ZMQUdTKQorCit0c3Rfc2F2ZTogJChzcmNkaXIpL3NhdmUuYyAkKERFUExJQlNfQkxLSUQpCisJJChFKSAiCUxEICRAIgorCSQoUSkgJChDQykgLW8gdHN0X3NhdmUgLURURVNUX1BST0dSQU0gJChzcmNkaXIpL3NhdmUuYyAkKExJQlNfQkxLSUQpICQoQUxMX0NGTEFHUykKKwordHN0X3RhZzogJChzcmNkaXIpL3RhZy5jICQoREVQTElCU19CTEtJRCkKKwkkKEUpICIJTEQgJEAiCisJJChRKSAkKENDKSAtbyB0c3RfdGFnIC1EVEVTVF9QUk9HUkFNICQoc3JjZGlyKS90YWcuYyAkKExJQlNfQkxLSUQpICQoQUxMX0NGTEFHUykKKwordHN0X3R5cGVzOiB0c3RfdHlwZXMubyBibGtpZF90eXBlcy5oIAorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIHRzdF90eXBlcyB0c3RfdHlwZXMubyAKKworLi4vLi4vbWlzYy9ibGtpZC5vOiAkKHRvcF9zcmNkaXIpL21pc2MvYmxraWQuYyBibGtpZC5oCisJJChFKSAiCUNDICRAIgorCSQoUSkgJChDQykgJChBTExfQ0ZMQUdTKSAtYyAkKHRvcF9zcmNkaXIpL21pc2MvYmxraWQuYyBcCisJCS1vIC4uLy4uL21pc2MvYmxraWQubworCitibGtpZDogLi4vLi4vbWlzYy9ibGtpZC5vIGxpYmJsa2lkLmEgJChERVBMSUJVVUlEKQorCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQ0MpIC1vIGJsa2lkIC4uLy4uL21pc2MvYmxraWQubyBsaWJibGtpZC5hICQoTElCVVVJRCkKKwordGVzdF9wcm9iZTogdGVzdF9wcm9iZS5pbiBNYWtlZmlsZQorCSQoRSkgIkNyZWF0aW5nIHRlc3RfcHJvYmUuLi4iCisJJChFKSAiIyEvYmluL3NoIiA+IHRlc3RfcHJvYmUKKwkkKEUpICJTUkNESVI9QHNyY2RpckAiID4+IHRlc3RfcHJvYmUKKwkkKFEpIGNhdCAkKHNyY2RpcikvdGVzdF9wcm9iZS5pbiA+PiB0ZXN0X3Byb2JlCisJJChRKSBjaG1vZCAreCB0ZXN0X3Byb2JlCisKK2NoZWNrOjogYWxsIHRzdF9jYWNoZSB0c3RfZGV2IHRzdF9kZXZuYW1lIHRzdF9kZXZubyB0c3RfZ2V0c2l6ZSB0c3RfcHJvYmUgXAorIHRzdF9yZWFkIHRzdF9yZXNvbHZlIHRzdF9zYXZlIHRzdF90YWcgdGVzdF9wcm9iZSB0c3RfdHlwZXMKKwkuL3Rlc3RfcHJvYmUKKwkuL3RzdF90eXBlcworCitibGtpZC5wYzogJChzcmNkaXIpL2Jsa2lkLnBjLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJJChFKSAiCUNPTkZJRy5TVEFUVVMgJEAiCisJJChRKSBjZCAkKHRvcF9idWlsZGRpcik7IENPTkZJR19GSUxFUz1saWIvYmxraWQvYmxraWQucGMgLi9jb25maWcuc3RhdHVzCisKK2luc3RhbGxkaXJzOjoKKwkkKEUpICIJTUtJTlNUQUxMRElSUyAkKGxpYmRpcikgJChpbmNsdWRlZGlyKS9ibGtpZCIKKwkkKFEpICQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQobGliZGlyKSBcCisJCSQoREVTVERJUikkKGluY2x1ZGVkaXIpL2Jsa2lkICQoREVTVERJUikkKGxpYmRpcikvcGtnY29uZmlnCisKK2luc3RhbGw6OiBhbGwgaW5zdGFsbGRpcnMgCisJJChFKSAiCUlOU1RBTExfREFUQSAkKGxpYmRpcikvbGliYmxraWQuYSIKKwkkKFEpICQoSU5TVEFMTF9EQVRBKSBsaWJibGtpZC5hICQoREVTVERJUikkKGxpYmRpcikvbGliYmxraWQuYQorCS0kKFEpICQoUkFOTElCKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmJsa2lkLmEKKwkkKFEpICQoQ0hNT0QpICQoTElCTU9ERSkgJChERVNURElSKSQobGliZGlyKS9saWJibGtpZC5hCisJJChRKSBzZXQgLWU7IGZvciBpIGluICQoSEZJTEVTX0lOKTsgZG8gXAorCQllY2hvICIJSU5TVEFMTF9EQVRBICQoaW5jbHVkZWRpcikvYmxraWQvJCRpIjsgXAorCQkkKElOU1RBTExfREFUQSkgJCRpICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2Jsa2lkLyQkaTsgXAorCWRvbmUKKwkkKFEpIGZvciBpIGluICQoU01BTlBBR0VTKTsgZG8gXAorCQllY2hvICIJSU5TVEFMTF9EQVRBICQobWFuM2RpcikvJCRpIjsgXAorCQkkKElOU1RBTExfREFUQSkgJCRpICQoREVTVERJUikkKG1hbjNkaXIpLyQkaTsgXAorCWRvbmUKKwkkKEUpICIJSU5TVEFMTF9EQVRBICQobGliZGlyKS9wa2djb25maWcvYmxraWQucGMiCisJJChRKSAkKElOU1RBTExfREFUQSkgYmxraWQucGMgJChERVNURElSKSQobGliZGlyKS9wa2djb25maWcvYmxraWQucGMKKwordW5pbnN0YWxsOjoKKwkkKFJNKSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmJsa2lkLmEgXAorCQkkKERFU1RESVIpJChsaWJkaXIpL3BrZ2NvbmZpZy9ibGtpZC5wYworCSQoUk0pIC1yZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9ibGtpZAorCWZvciBpIGluICQoU01BTlBBR0VTKTsgZG8gXAorCQkkKFJNKSAtZiAkKERFU1RESVIpJChtYW4zZGlyKS8kJGk7IFwKKwlkb25lCisKK2NsZWFuOjoKKwkkKFJNKSAtZiBcIyogKi5zICoubyAqLm9yaWcgKi5hICp+ICouYmFrIHRzdF9jYWNoZSB0c3RfZGV2IHRzdF9kZXZuYW1lIFwKKwkJdHN0X2Rldm5vIHRzdF9nZXRzaXplIHRzdF9wcm9iZSB0c3RfcmVhZCB0c3RfcmVzb2x2ZSB0c3Rfc2F2ZSBcCisJCXRzdF90YWcgdHN0X3R5cGVzIHRlc3RzLyoub3V0IHRlc3RzLyoub2sgXAorCQl0ZXN0cy8qLmltZyByZXN1bHRzIHRlc3RfcHJvYmUgY29yZSBwcm9maWxlZC8qIFwKKwkJY2hlY2tlci8qIGJsa2lkLmggYmxraWRfdHlwZXMuaCAuLi9saWJibGtpZC5hIC4uL2xpYmJsa2lkX3AuYSBcCisJCSQoU01BTlBBR0VTKSBibGtpZAorCUBlY2hvIHJtZGlyIHRlc3RzL3RtcCB0ZXN0cworCUAocm1kaXIgdGVzdHMvdG1wIHRlc3RzIDI+IC9kZXYvbnVsbCA7IGV4aXQgMCkKKworbW9zdGx5Y2xlYW46OiBjbGVhbgorZGlzdGNsZWFuOjogY2xlYW4KKwkkKFJNKSAtZiAuZGVwZW5kIE1ha2VmaWxlIGJsa2lkLnBjIFwKKwkJJChzcmNkaXIpL1RBR1MgJChzcmNkaXIpL01ha2VmaWxlLmluLm9sZAorCiskKE9CSlMpOiBzdWJkaXJzICQoSEZJTEVTX0lOKQorCisjICsrKyBEZXBlbmRlbmN5IGxpbmUgZWF0ZXIgKysrCisjIAorIyBNYWtlZmlsZSBkZXBlbmRlbmNpZXMgZm9sbG93LiAgVGhpcyBtdXN0IGJlIHRoZSBsYXN0IHNlY3Rpb24gaW4KKyMgdGhlIE1ha2VmaWxlLmluIGZpbGUKKyMKK2NhY2hlLm86ICQoc3JjZGlyKS9jYWNoZS5jICQoc3JjZGlyKS9saXN0LmgKK2Rldi5vOiAkKHNyY2RpcikvZGV2LmMgJChzcmNkaXIpL2xpc3QuaAorZGV2bmFtZS5vOiAkKHNyY2RpcikvZGV2bmFtZS5jICQoc3JjZGlyKS9saXN0LmgKK2Rldm5vLm86ICQoc3JjZGlyKS9kZXZuby5jICQoc3JjZGlyKS9saXN0LmgKK2dldHNpemUubzogJChzcmNkaXIpL2dldHNpemUuYyAkKHNyY2RpcikvbGlzdC5oCitsbHNlZWsubzogJChzcmNkaXIpL2xsc2Vlay5jICQoc3JjZGlyKS9saXN0LmgKK3Byb2JlLm86ICQoc3JjZGlyKS9wcm9iZS5jICQoc3JjZGlyKS9saXN0LmggJChzcmNkaXIpL3Byb2JlLmgKK3JlYWQubzogJChzcmNkaXIpL3JlYWQuYyAkKHNyY2RpcikvbGlzdC5oCityZXNvbHZlLm86ICQoc3JjZGlyKS9yZXNvbHZlLmMgJChzcmNkaXIpL2xpc3QuaAorc2F2ZS5vOiAkKHNyY2Rpcikvc2F2ZS5jICQoc3JjZGlyKS9saXN0LmgKK3RhZy5vOiAkKHNyY2RpcikvdGFnLmMgJChzcmNkaXIpL2xpc3QuaAordmVyc2lvbi5vOiAkKHNyY2RpcikvdmVyc2lvbi5jICQodG9wX3NyY2RpcikvdmVyc2lvbi5oCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9ibGtpZC5oLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvYmxraWQuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYzMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvYmxraWQuaC5pbgpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIGJsa2lkLmggLSBJbnRlcmZhY2UgZm9yIGxpYmJsa2lkLCBhIGxpYnJhcnkgdG8gaWRlbnRpZnkgYmxvY2sgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpZm5kZWYgX0JMS0lEX0JMS0lEX0gKKyNkZWZpbmUgX0JMS0lEX0JMS0lEX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJsa2lkL2Jsa2lkX3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBCTEtJRF9WRVJTSU9OCSIxLjAuMCIKKyNkZWZpbmUgQkxLSURfREFURQkiMTItRmViLTIwMDMiCisKK3R5cGVkZWYgc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYgKmJsa2lkX2RldjsKK3R5cGVkZWYgc3RydWN0IGJsa2lkX3N0cnVjdF9jYWNoZSAqYmxraWRfY2FjaGU7Cit0eXBlZGVmIF9fczY0IGJsa2lkX2xvZmZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZ19pdGVyYXRlICpibGtpZF90YWdfaXRlcmF0ZTsKK3R5cGVkZWYgc3RydWN0IGJsa2lkX3N0cnVjdF9kZXZfaXRlcmF0ZSAqYmxraWRfZGV2X2l0ZXJhdGU7CisKKy8qCisgKiBGbGFncyBmb3IgYmxraWRfZ2V0X2RldgorICoKKyAqIEJMS0lEX0RFVl9DUkVBVEUJQ3JlYXRlIGFuIGVtcHR5IGRldmljZSBzdHJ1Y3R1cmUgaWYgbm90IGZvdW5kCisgKiAJCQlpbiB0aGUgY2FjaGUuCisgKiBCTEtJRF9ERVZfVkVSSUZZCU1ha2Ugc3VyZSB0aGUgZGV2aWNlIHN0cnVjdHVyZSBjb3JyZXNwb25kcworICogCQkJd2l0aCByZWFsaXR5LgorICogQkxLSURfREVWX0ZJTkQJSnVzdCBsb29rIHVwIGEgZGV2aWNlIGVudHJ5LCBhbmQgcmV0dXJuIE5VTEwKKyAqIAkJCWlmIGl0IGlzIG5vdCBmb3VuZC4KKyAqIEJMS0lEX0RFVl9OT1JNQUwJR2V0IGEgdmFsaWQgZGV2aWNlIHN0cnVjdHVyZSwgZWl0aGVyIGZyb20gdGhlCisgKiAJCQljYWNoZSBvciBieSBwcm9iaW5nIHRoZSBkZXZpY2UuCisgKi8KKyNkZWZpbmUgQkxLSURfREVWX0ZJTkQJCTB4MDAwMAorI2RlZmluZSBCTEtJRF9ERVZfQ1JFQVRFCTB4MDAwMQorI2RlZmluZSBCTEtJRF9ERVZfVkVSSUZZCTB4MDAwMgorI2RlZmluZSBCTEtJRF9ERVZfTk9STUFMCShCTEtJRF9ERVZfQ1JFQVRFIHwgQkxLSURfREVWX1ZFUklGWSkKKworLyogY2FjaGUuYyAqLworZXh0ZXJuIHZvaWQgYmxraWRfcHV0X2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlKTsKK2V4dGVybiBpbnQgYmxraWRfZ2V0X2NhY2hlKGJsa2lkX2NhY2hlICpjYWNoZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworZXh0ZXJuIHZvaWQgYmxraWRfZ2NfY2FjaGUoYmxraWRfY2FjaGUgY2FjaGUpOworCisvKiBkZXYuYyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmJsa2lkX2Rldl9kZXZuYW1lKGJsa2lkX2RldiBkZXYpOworCitleHRlcm4gYmxraWRfZGV2X2l0ZXJhdGUgYmxraWRfZGV2X2l0ZXJhdGVfYmVnaW4oYmxraWRfY2FjaGUgY2FjaGUpOworZXh0ZXJuIGludCBibGtpZF9kZXZfc2V0X3NlYXJjaChibGtpZF9kZXZfaXRlcmF0ZSBpdGVyLAorCQkJCWNoYXIgKnNlYXJjaF90eXBlLCBjaGFyICpzZWFyY2hfdmFsdWUpOworZXh0ZXJuIGludCBibGtpZF9kZXZfbmV4dChibGtpZF9kZXZfaXRlcmF0ZSBpdGVyYXRlLCBibGtpZF9kZXYgKmRldik7CitleHRlcm4gdm9pZCBibGtpZF9kZXZfaXRlcmF0ZV9lbmQoYmxraWRfZGV2X2l0ZXJhdGUgaXRlcmF0ZSk7CisKKy8qIGRldm5vLmMgKi8KK2V4dGVybiBjaGFyICpibGtpZF9kZXZub190b19kZXZuYW1lKGRldl90IGRldm5vKTsKKworLyogZGV2bmFtZS5jICovCitleHRlcm4gaW50IGJsa2lkX3Byb2JlX2FsbChibGtpZF9jYWNoZSBjYWNoZSk7CitleHRlcm4gaW50IGJsa2lkX3Byb2JlX2FsbF9uZXcoYmxraWRfY2FjaGUgY2FjaGUpOworZXh0ZXJuIGJsa2lkX2RldiBibGtpZF9nZXRfZGV2KGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICpkZXZuYW1lLAorCQkJICAgICAgIGludCBmbGFncyk7CisKKy8qIGdldHNpemUuYyAqLworZXh0ZXJuIGJsa2lkX2xvZmZfdCBibGtpZF9nZXRfZGV2X3NpemUoaW50IGZkKTsKKworLyogcHJvYmUuYyAqLworaW50IGJsa2lkX2tub3duX2ZzdHlwZShjb25zdCBjaGFyICpmc3R5cGUpOworZXh0ZXJuIGJsa2lkX2RldiBibGtpZF92ZXJpZnkoYmxraWRfY2FjaGUgY2FjaGUsIGJsa2lkX2RldiBkZXYpOworCisvKiByZWFkLmMgKi8KKworLyogcmVzb2x2ZS5jICovCitleHRlcm4gY2hhciAqYmxraWRfZ2V0X3RhZ192YWx1ZShibGtpZF9jYWNoZSBjYWNoZSwgY29uc3QgY2hhciAqdGFnbmFtZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqZGV2bmFtZSk7CitleHRlcm4gY2hhciAqYmxraWRfZ2V0X2Rldm5hbWUoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKnRva2VuLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyogdGFnLmMgKi8KK2V4dGVybiBibGtpZF90YWdfaXRlcmF0ZSBibGtpZF90YWdfaXRlcmF0ZV9iZWdpbihibGtpZF9kZXYgZGV2KTsKK2V4dGVybiBpbnQgYmxraWRfdGFnX25leHQoYmxraWRfdGFnX2l0ZXJhdGUgaXRlcmF0ZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKip0eXBlLCBjb25zdCBjaGFyICoqdmFsdWUpOworZXh0ZXJuIHZvaWQgYmxraWRfdGFnX2l0ZXJhdGVfZW5kKGJsa2lkX3RhZ19pdGVyYXRlIGl0ZXJhdGUpOworZXh0ZXJuIGludCBibGtpZF9kZXZfaGFzX3RhZyhibGtpZF9kZXYgZGV2LCBjb25zdCBjaGFyICp0eXBlLAorCQkJICAgICBjb25zdCBjaGFyICp2YWx1ZSk7CitleHRlcm4gYmxraWRfZGV2IGJsa2lkX2ZpbmRfZGV2X3dpdGhfdGFnKGJsa2lkX2NhY2hlIGNhY2hlLAorCQkJCQkgY29uc3QgY2hhciAqdHlwZSwKKwkJCQkJIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiBpbnQgYmxraWRfcGFyc2VfdGFnX3N0cmluZyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqKnJldF90eXBlLAorCQkJCSAgY2hhciAqKnJldF92YWwpOworCisvKiB2ZXJzaW9uLmMgKi8KK2V4dGVybiBpbnQgYmxraWRfcGFyc2VfdmVyc2lvbl9zdHJpbmcoY29uc3QgY2hhciAqdmVyX3N0cmluZyk7CitleHRlcm4gaW50IGJsa2lkX2dldF9saWJyYXJ5X3ZlcnNpb24oY29uc3QgY2hhciAqKnZlcl9zdHJpbmcsCisJCQkJICAgICBjb25zdCBjaGFyICoqZGF0ZV9zdHJpbmcpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0JMS0lEX0JMS0lEX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2Jsa2lkLnBjLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvYmxraWQucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4NGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2Jsa2lkLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBibGtpZAorRGVzY3JpcHRpb246IEJsb2NrIGRldmljZSBpZCBsaWJyYXJ5CitWZXJzaW9uOiBARTJGU1BST0dTX1ZFUlNJT05ACitSZXF1aXJlcy5wcml2YXRlOiB1dWlkCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS9ibGtpZAorTGliczogLUwke2xpYmRpcn0gLWxibGtpZApkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvYmxraWRQLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9ibGtpZFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYxMWEwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvYmxraWRQLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBibGtpZFAuaCAtIEludGVybmFsIGludGVyZmFjZXMgZm9yIGxpYmJsa2lkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgRGlsZ2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhlb2RvcmUgVHMnbworICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2lmbmRlZiBfQkxLSURfQkxLSURQX0gKKyNkZWZpbmUgX0JMS0lEX0JMS0lEUF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8YmxraWQvYmxraWQuaD4KKworI2luY2x1ZGUgPGJsa2lkL2xpc3QuaD4KKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9fQkxLSURfQVRUUih4KSBfX2F0dHJpYnV0ZV9fKHgpCisjZWxzZQorI2RlZmluZSBfX0JMS0lEX0FUVFIoeCkKKyNlbmRpZgorCisKKy8qCisgKiBUaGlzIGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlcyBvZiBhIHNwZWNpZmljIGRldmljZS4KKyAqIFdlIGNhbiB0cmF2ZXJzZSBhbGwgb2YgdGhlIHRhZ3MgYnkgYmlkX3RhZ3MgKGxpbmtpbmcgdG8gdGhlIHRhZyBiaXRfbmFtZXMpLgorICogVGhlIGJpZF9sYWJlbCBhbmQgYmlkX3V1aWQgZmllbGRzIGFyZSBzaG9ydGN1dHMgdG8gdGhlIExBQkVMIGFuZCBVVUlEIHRhZworICogdmFsdWVzLCBpZiB0aGV5IGV4aXN0LgorICovCitzdHJ1Y3QgYmxraWRfc3RydWN0X2RldgoreworCXN0cnVjdCBsaXN0X2hlYWQJYmlkX2RldnM7CS8qIEFsbCBkZXZpY2VzIGluIHRoZSBjYWNoZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYmlkX3RhZ3M7CS8qIEFsbCB0YWdzIGZvciB0aGlzIGRldmljZSAqLworCWJsa2lkX2NhY2hlCQliaWRfY2FjaGU7CS8qIERldiBiZWxvbmdzIHRvIHRoaXMgY2FjaGUgKi8KKwljaGFyCQkJKmJpZF9uYW1lOwkvKiBEZXZpY2UgaW5vZGUgcGF0aG5hbWUgKi8KKwljaGFyCQkJKmJpZF90eXBlOwkvKiBQcmVmZXJyZWQgZGV2aWNlIFRZUEUgKi8KKwlpbnQJCQliaWRfcHJpOwkvKiBEZXZpY2UgcHJpb3JpdHkgKi8KKwlkZXZfdAkJCWJpZF9kZXZubzsJLyogRGV2aWNlIG1ham9yL21pbm9yIG51bWJlciAqLworCXRpbWVfdAkJCWJpZF90aW1lOwkvKiBMYXN0IHVwZGF0ZSB0aW1lIG9mIGRldmljZSAqLworCXVuc2lnbmVkIGludAkJYmlkX2ZsYWdzOwkvKiBEZXZpY2Ugc3RhdHVzIGJpdGZsYWdzICovCisJY2hhcgkJCSpiaWRfbGFiZWw7CS8qIFNob3J0Y3V0IHRvIGRldmljZSBMQUJFTCAqLworCWNoYXIJCQkqYmlkX3V1aWQ7CS8qIFNob3J0Y3V0IHRvIGJpbmFyeSBVVUlEICovCit9OworCisjZGVmaW5lIEJMS0lEX0JJRF9GTF9WRVJJRklFRAkweDAwMDEJLyogRGV2aWNlIGRhdGEgdmFsaWRhdGVkIGZyb20gZGlzayAqLworI2RlZmluZSBCTEtJRF9CSURfRkxfSU5WQUxJRAkweDAwMDQJLyogRGV2aWNlIGlzIGludmFsaWQgKi8KKworLyoKKyAqIEVhY2ggdGFnIGRlZmluZXMgYSBOQU1FPXZhbHVlIHBhaXIgZm9yIGEgcGFydGljdWxhciBkZXZpY2UuICBUaGUgdGFncworICogYXJlIGxpbmtlZCB2aWEgYml0X25hbWVzIGZvciBhIHNpbmdsZSBkZXZpY2UsIHNvIHRoYXQgdHJhdmVyc2luZyB0aGUKKyAqIG5hbWVzIGxpc3Qgd2lsbCBnZXQgeW91IGEgbGlzdCBvZiBhbGwgdGFncyBhc3NvY2lhdGVkIHdpdGggYSBkZXZpY2UuCisgKiBUaGV5IGFyZSBhbHNvIGxpbmtlZCB2aWEgYml0X3ZhbHVlcyBmb3IgYWxsIGRldmljZXMsIHNvIG9uZSBjYW4gZWFzaWx5CisgKiBzZWFyY2ggYWxsIHRhZ3Mgd2l0aCBhIGdpdmVuIE5BTUUgZm9yIGEgc3BlY2lmaWMgdmFsdWUuCisgKi8KK3N0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnCit7CisJc3RydWN0IGxpc3RfaGVhZAliaXRfdGFnczsJLyogQWxsIHRhZ3MgZm9yIHRoaXMgZGV2aWNlICovCisJc3RydWN0IGxpc3RfaGVhZAliaXRfbmFtZXM7CS8qIEFsbCB0YWdzIHdpdGggZ2l2ZW4gTkFNRSAqLworCWNoYXIJCQkqYml0X25hbWU7CS8qIE5BTUUgb2YgdGFnIChzaGFyZWQpICovCisJY2hhcgkJCSpiaXRfdmFsOwkvKiB2YWx1ZSBvZiB0YWcgKi8KKwlibGtpZF9kZXYJCWJpdF9kZXY7CS8qIHBvaW50ZXIgdG8gZGV2aWNlICovCit9OwordHlwZWRlZiBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZyAqYmxraWRfdGFnOworCisvKgorICogTWluaW11bSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGRldmljZSBwcm9iZXMsIGV2ZW4gd2hlbiByZWFkaW5nCisgKiBmcm9tIHRoZSBjYWNoZS4gIFRoaXMgaXMgdG8gYXZvaWQgcmUtcHJvYmluZyBhbGwgZGV2aWNlcyB3aGljaCB3ZXJlCisgKiBqdXN0IHByb2JlZCBieSBhbm90aGVyIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBzaGFyZSB0aGUgY2FjaGUuCisgKi8KKyNkZWZpbmUgQkxLSURfUFJPQkVfTUlOCQkyCisKKy8qCisgKiBUaW1lIGluIHNlY29uZHMgYW4gZW50cnkgcmVtYWlucyB2ZXJpZmllZCBpbiB0aGUgaW4tbWVtb3J5IGNhY2hlCisgKiBiZWZvcmUgYmVpbmcgcmV2ZXJpZmllZCAoaW4gY2FzZSBvZiBsb25nLXJ1bm5pbmcgcHJvY2Vzc2VzIHRoYXQKKyAqIGtlZXAgYSBjYWNoZSBpbiBtZW1vcnkgYW5kIGNvbnRpbnVlIHRvIHVzZSBpdCBmb3IgYSBsb25nIHRpbWUpLgorICovCisjZGVmaW5lIEJMS0lEX1BST0JFX0lOVEVSVkFMCTIwMAorCisvKiBUaGlzIGRlc2NyaWJlcyBhbiBlbnRpcmUgYmxraWQgY2FjaGUgZmlsZSBhbmQgcHJvYmVkIGRldmljZXMuCisgKiBXZSBjYW4gdHJhdmVyc2UgYWxsIG9mIHRoZSBmb3VuZCBkZXZpY2VzIHZpYSBiaWNfbGlzdC4KKyAqIFdlIGNhbiB0cmF2ZXJzZSBhbGwgb2YgdGhlIHRhZyB0eXBlcyBieSBiaWNfdGFncywgd2hpY2ggaG9sZCBlbXB0eSB0YWdzCisgKiBmb3IgZWFjaCB0YWcgdHlwZS4gIFRob3NlIHRhZ3MgY2FuIGJlIHVzZWQgYXMgbGlzdF9oZWFkcyBmb3IgaXRlcmF0aW5nCisgKiB0aHJvdWdoIGFsbCBkZXZpY2VzIHdpdGggYSBzcGVjaWZpYyB0YWcgdHlwZSAoZS5nLiBMQUJFTCkuCisgKi8KK3N0cnVjdCBibGtpZF9zdHJ1Y3RfY2FjaGUKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJpY19kZXZzOwkvKiBMaXN0IGhlYWQgb2YgYWxsIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJpY190YWdzOwkvKiBMaXN0IGhlYWQgb2YgYWxsIHRhZyB0eXBlcyAqLworCXRpbWVfdAkJCWJpY190aW1lOwkvKiBMYXN0IHByb2JlIHRpbWUgKi8KKwl0aW1lX3QJCQliaWNfZnRpbWU7IAkvKiBNb2QgdGltZSBvZiB0aGUgY2FjaGVmaWxlICovCisJdW5zaWduZWQgaW50CQliaWNfZmxhZ3M7CS8qIFN0YXR1cyBmbGFncyBvZiB0aGUgY2FjaGUgKi8KKwljaGFyCQkJKmJpY19maWxlbmFtZTsJLyogZmlsZW5hbWUgb2YgY2FjaGUgKi8KK307CisKKyNkZWZpbmUgQkxLSURfQklDX0ZMX1BST0JFRAkweDAwMDIJLyogV2UgcHJvYmVkIC9wcm9jL3BhcnRpdGlvbiBkZXZpY2VzICovCisjZGVmaW5lIEJMS0lEX0JJQ19GTF9DSEFOR0VECTB4MDAwNAkvKiBDYWNoZSBoYXMgY2hhbmdlZCBmcm9tIGRpc2sgKi8KKworZXh0ZXJuIGNoYXIgKmJsa2lkX3N0cmR1cChjb25zdCBjaGFyICpzKTsKK2V4dGVybiBjaGFyICpibGtpZF9zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGludCBsZW5ndGgpOworCisjZGVmaW5lIEJMS0lEX0NBQ0hFX0ZJTEUgIi9ldGMvYmxraWQudGFiIgorCisjZGVmaW5lIEJMS0lEX0VSUl9JTwkgNQorI2RlZmluZSBCTEtJRF9FUlJfUFJPQwkgOQorI2RlZmluZSBCTEtJRF9FUlJfTUVNCTEyCisjZGVmaW5lIEJMS0lEX0VSUl9DQUNIRQkxNAorI2RlZmluZSBCTEtJRF9FUlJfREVWCTE5CisjZGVmaW5lIEJMS0lEX0VSUl9QQVJBTQkyMgorI2RlZmluZSBCTEtJRF9FUlJfQklHCTI3CisKKy8qCisgKiBQcmlvcml0eSBzZXR0aW5ncyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGRldmljZXMKKyAqLworI2RlZmluZSBCTEtJRF9QUklfRE0JNDAKKyNkZWZpbmUgQkxLSURfUFJJX0VWTVMJMzAKKyNkZWZpbmUgQkxLSURfUFJJX0xWTQkyMAorI2RlZmluZSBCTEtJRF9QUklfTUQJMTAKKworI2lmIGRlZmluZWQoVEVTVF9QUk9HUkFNKSAmJiAhZGVmaW5lZChDT05GSUdfQkxLSURfREVCVUcpCisjZGVmaW5lIENPTkZJR19CTEtJRF9ERUJVRworI2VuZGlmCisKKyNkZWZpbmUgREVCVUdfQ0FDSEUJMHgwMDAxCisjZGVmaW5lIERFQlVHX0RVTVAJMHgwMDAyCisjZGVmaW5lIERFQlVHX0RFVgkweDAwMDQKKyNkZWZpbmUgREVCVUdfREVWTkFNRQkweDAwMDgKKyNkZWZpbmUgREVCVUdfREVWTk8JMHgwMDEwCisjZGVmaW5lIERFQlVHX1BST0JFCTB4MDAyMAorI2RlZmluZSBERUJVR19SRUFECTB4MDA0MAorI2RlZmluZSBERUJVR19SRVNPTFZFCTB4MDA4MAorI2RlZmluZSBERUJVR19TQVZFCTB4MDEwMAorI2RlZmluZSBERUJVR19UQUcJMHgwMjAwCisjZGVmaW5lIERFQlVHX0lOSVQJMHg4MDAwCisjZGVmaW5lIERFQlVHX0FMTAkweEZGRkYKKworI2lmZGVmIENPTkZJR19CTEtJRF9ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CitleHRlcm4gaW50CWJsa2lkX2RlYnVnX21hc2s7CisjZGVmaW5lIERCRyhtLHgpCWlmICgobSkgJiBibGtpZF9kZWJ1Z19tYXNrKSB4OworI2Vsc2UKKyNkZWZpbmUgREJHKG0seCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JMS0lEX0RFQlVHCitleHRlcm4gdm9pZCBibGtpZF9kZWJ1Z19kdW1wX2RldihibGtpZF9kZXYgZGV2KTsKK2V4dGVybiB2b2lkIGJsa2lkX2RlYnVnX2R1bXBfdGFnKGJsa2lkX3RhZyB0YWcpOworI2VuZGlmCisKKy8qIGRldm5vLmMgKi8KK3N0cnVjdCBkaXJfbGlzdCB7CisJY2hhcgkqbmFtZTsKKwlzdHJ1Y3QgZGlyX2xpc3QgKm5leHQ7Cit9OworZXh0ZXJuIHZvaWQgYmxraWRfX3NjYW5fZGlyKGNoYXIgKiwgZGV2X3QsIHN0cnVjdCBkaXJfbGlzdCAqKiwgY2hhciAqKik7CisKKy8qIGxzZWVrLmMgKi8KK2V4dGVybiBibGtpZF9sb2ZmX3QgYmxraWRfbGxzZWVrKGludCBmZCwgYmxraWRfbG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7CisKKy8qIHJlYWQuYyAqLworZXh0ZXJuIHZvaWQgYmxraWRfcmVhZF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSk7CisKKy8qIHNhdmUuYyAqLworZXh0ZXJuIGludCBibGtpZF9mbHVzaF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSk7CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gY3JlYXRlIGFuZCBmaW5kIGEgc3BlY2lmaWMgdGFnIHR5cGU6IHRhZy5jCisgKi8KK2V4dGVybiB2b2lkIGJsa2lkX2ZyZWVfdGFnKGJsa2lkX3RhZyB0YWcpOworZXh0ZXJuIGJsa2lkX3RhZyBibGtpZF9maW5kX3RhZ19kZXYoYmxraWRfZGV2IGRldiwgY29uc3QgY2hhciAqdHlwZSk7CitleHRlcm4gaW50IGJsa2lkX3NldF90YWcoYmxraWRfZGV2IGRldiwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgaW50IHZsZW5ndGgpOworCisvKgorICogRnVuY3Rpb25zIHRvIGNyZWF0ZSBhbmQgZmluZCBhIHNwZWNpZmljIHRhZyB0eXBlOiBkZXYuYworICovCitleHRlcm4gYmxraWRfZGV2IGJsa2lkX25ld19kZXYodm9pZCk7CitleHRlcm4gdm9pZCBibGtpZF9mcmVlX2RldihibGtpZF9kZXYgZGV2KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9CTEtJRF9CTEtJRFBfSCAqLwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvYmxraWRfdHlwZXMuaC5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2Jsa2lkX3R5cGVzLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1YjEwZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2Jsa2lkX3R5cGVzLmguaW4KQEAgLTAsMCArMSwxMzQgQEAKKy8qIAorICogSWYgbGludXgvdHlwZXMuaCBpcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQsIGFzc3VtZSBpdCBoYXMgZGVmaW5lZAorICogZXZlcnl0aGluZyB3ZSBuZWVkLiAgKGNyb3NzIGZpbmdlcnMpICBPdGhlciBoZWFkZXIgZmlsZXMgbWF5IGhhdmUgCisgKiBhbHNvIGRlZmluZWQgdGhlIHR5cGVzIHRoYXQgd2UgbmVlZC4KKyAqLworI2lmICghZGVmaW5lZChfTElOVVhfVFlQRVNfSCkgJiYgIWRlZmluZWQoX0JMS0lEX1RZUEVTX0gpICYmIFwKKwkhZGVmaW5lZChfRVhUMl9UWVBFU19IKSkKKyNkZWZpbmUgX0JMS0lEX1RZUEVTX0gKKworQEFTTV9UWVBFU19IRUFERVJACisKKyNpZmRlZiBfX1U4X1RZUEVERUYKK3R5cGVkZWYgX19VOF9UWVBFREVGIF9fdTg7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdTg7CisjZW5kaWYKKworI2lmZGVmIF9fUzhfVFlQRURFRgordHlwZWRlZiBfX1M4X1RZUEVERUYgX19zODsKKyNlbHNlCit0eXBlZGVmIHNpZ25lZCBjaGFyIF9fczg7CisjZW5kaWYKKworI2lmZGVmIF9fVTE2X1RZUEVERUYKK3R5cGVkZWYgX19VMTZfVFlQRURFRiBfX3UxNjsKKyNlbHNlCisjaWYgKEBTSVpFT0ZfSU5UQCA9PSAyKQordHlwZWRlZgl1bnNpZ25lZCBpbnQJX191MTY7CisjZWxzZQorI2lmIChAU0laRU9GX1NIT1JUQCA9PSAyKQordHlwZWRlZgl1bnNpZ25lZCBzaG9ydAlfX3UxNjsKKyNlbHNlCisgID89PWVycm9yOiB1bmRlZmluZWQgMTYgYml0IHR5cGUKKyNlbmRpZiAvKiBTSVpFT0ZfU0hPUlQgPT0gMiAqLworI2VuZGlmIC8qIFNJWkVPRl9JTlQgPT0gMiAqLworI2VuZGlmIC8qIF9fVTE2X1RZUEVERUYgKi8KKworI2lmZGVmIF9fUzE2X1RZUEVERUYKK3R5cGVkZWYgX19TMTZfVFlQRURFRiBfX3MxNjsKKyNlbHNlCisjaWYgKEBTSVpFT0ZfSU5UQCA9PSAyKQordHlwZWRlZglpbnQJCV9fczE2OworI2Vsc2UKKyNpZiAoQFNJWkVPRl9TSE9SVEAgPT0gMikKK3R5cGVkZWYJc2hvcnQJCV9fczE2OworI2Vsc2UKKyAgPz09ZXJyb3I6IHVuZGVmaW5lZCAxNiBiaXQgdHlwZQorI2VuZGlmIC8qIFNJWkVPRl9TSE9SVCA9PSAyICovCisjZW5kaWYgLyogU0laRU9GX0lOVCA9PSAyICovCisjZW5kaWYgLyogX19TMTZfVFlQRURFRiAqLworCisKKyNpZmRlZiBfX1UzMl9UWVBFREVGCit0eXBlZGVmIF9fVTMyX1RZUEVERUYgX191MzI7CisjZWxzZQorI2lmIChAU0laRU9GX0lOVEAgPT0gNCkKK3R5cGVkZWYJdW5zaWduZWQgaW50CV9fdTMyOworI2Vsc2UKKyNpZiAoQFNJWkVPRl9MT05HQCA9PSA0KQordHlwZWRlZgl1bnNpZ25lZCBsb25nCV9fdTMyOworI2Vsc2UKKyNpZiAoQFNJWkVPRl9TSE9SVEAgPT0gNCkKK3R5cGVkZWYJdW5zaWduZWQgc2hvcnQJX191MzI7CisjZWxzZQorID89PSBlcnJvcjogdW5kZWZpbmVkIDMyIGJpdCB0eXBlCisjZW5kaWYgLyogU0laRU9GX1NIT1JUID09IDQgKi8KKyNlbmRpZiAvKiBTSVpFT0ZfTE9ORyA9PSA0ICovCisjZW5kaWYgLyogU0laRU9GX0lOVCA9PSA0ICovCisjZW5kaWYgLyogX19VMzJfVFlQRURFRiAqLworCisjaWZkZWYgX19TMzJfVFlQRURFRgordHlwZWRlZiBfX1MzMl9UWVBFREVGIF9fczMyOworI2Vsc2UKKyNpZiAoQFNJWkVPRl9JTlRAID09IDQpCit0eXBlZGVmCWludAkJX19zMzI7CisjZWxzZQorI2lmIChAU0laRU9GX0xPTkdAID09IDQpCit0eXBlZGVmCWxvbmcJCV9fczMyOworI2Vsc2UKKyNpZiAoQFNJWkVPRl9TSE9SVEAgPT0gNCkKK3R5cGVkZWYJc2hvcnQJCV9fczMyOworI2Vsc2UKKyA/PT0gZXJyb3I6IHVuZGVmaW5lZCAzMiBiaXQgdHlwZQorI2VuZGlmIC8qIFNJWkVPRl9TSE9SVCA9PSA0ICovCisjZW5kaWYgLyogU0laRU9GX0xPTkcgPT0gNCAqLworI2VuZGlmIC8qIFNJWkVPRl9JTlQgPT0gNCAqLworI2VuZGlmIC8qIF9fUzMyX1RZUEVERUYgKi8KKworI2lmZGVmIF9fVTY0X1RZUEVERUYKK3R5cGVkZWYgX19VNjRfVFlQRURFRiBfX3U2NDsKKyNlbHNlCisjaWYgKEBTSVpFT0ZfSU5UQCA9PSA4KQordHlwZWRlZiB1bnNpZ25lZCBpbnQJX191NjQ7CisjZWxzZQorI2lmIChAU0laRU9GX0xPTkdAID09IDgpCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX191NjQ7CisjZWxzZQorI2lmIChAU0laRU9GX0xPTkdfTE9OR0AgPT0gOCkKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCV9fdTY0OworI2VuZGlmIC8qIFNJWkVPRl9MT05HX0xPTkcgPT0gOCAqLworI2VuZGlmIC8qIFNJWkVPRl9MT05HID09IDggKi8KKyNlbmRpZiAvKiBTSVpFT0ZfSU5UID09IDggKi8KKyNlbmRpZiAvKiBfX1U2NF9UWVBFREVGICovCisKKyNpZmRlZiBfX1M2NF9UWVBFREVGCit0eXBlZGVmIF9fUzY0X1RZUEVERUYgX19zNjQ7CisjZWxzZQorI2lmIChAU0laRU9GX0lOVEAgPT0gOCkKK3R5cGVkZWYgaW50CQlfX3M2NDsKKyNlbHNlCisjaWYgKEBTSVpFT0ZfTE9OR0AgPT0gOCkKK3R5cGVkZWYgbG9uZwkJX19zNjQ7CisjZWxzZQorI2lmIChAU0laRU9GX0xPTkdfTE9OR0AgPT0gOCkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQordHlwZWRlZiBfX3NpZ25lZF9fIGxvbmcgbG9uZyAJX19zNjQ7CisjZWxzZQordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIAlfX3M2NDsKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmIC8qIFNJWkVPRl9MT05HX0xPTkcgPT0gOCAqLworI2VuZGlmIC8qIFNJWkVPRl9MT05HID09IDggKi8KKyNlbmRpZiAvKiBTSVpFT0ZfSU5UID09IDggKi8KKyNlbmRpZiAvKiBfX1M2NF9UWVBFREVGICovCisKKyN1bmRlZiBfX1M4X1RZUEVERUYKKyN1bmRlZiBfX1U4X1RZUEVERUYKKyN1bmRlZiBfX1MxNl9UWVBFREVGCisjdW5kZWYgX19VMTZfVFlQRURFRgorI3VuZGVmIF9fUzMyX1RZUEVERUYKKyN1bmRlZiBfX1UzMl9UWVBFREVGCisjdW5kZWYgX19TNjRfVFlQRURFRgorI3VuZGVmIF9fVTY0X1RZUEVERUYKKworI2VuZGlmIC8qIF8qX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2NhY2hlLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODE4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9jYWNoZS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogY2FjaGUuYyAtIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb24vZnJlZSByb3V0aW5lcyBmb3IgY2FjaGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU1lTX1BSQ1RMX0gKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNlbHNlCisjZGVmaW5lIFBSX0dFVF9EVU1QQUJMRSAzCisjZW5kaWYKKyNpZiAoIWRlZmluZWQoSEFWRV9QUkNUTCkgJiYgZGVmaW5lZChsaW51eCkpCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJibGtpZFAuaCIKKworaW50IGJsa2lkX2RlYnVnX21hc2sgPSAwOworCisKK3N0YXRpYyBjaGFyICpzYWZlX2dldGVudihjb25zdCBjaGFyICphcmcpCit7CisJaWYgKChnZXR1aWQoKSAhPSBnZXRldWlkKCkpIHx8IChnZXRnaWQoKSAhPSBnZXRlZ2lkKCkpKQorCQlyZXR1cm4gTlVMTDsKKyNpZiBIQVZFX1BSQ1RMCisJaWYgKHByY3RsKFBSX0dFVF9EVU1QQUJMRSwgMCwgMCwgMCwgMCkgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisjZWxzZQorI2lmIChkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKFNZU19wcmN0bCkpCisJaWYgKHN5c2NhbGwoU1lTX3ByY3RsLCBQUl9HRVRfRFVNUEFCTEUsIDAsIDAsIDAsIDApID09IDApCisJCXJldHVybiBOVUxMOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfX19TRUNVUkVfR0VURU5WCisJcmV0dXJuIF9fc2VjdXJlX2dldGVudihhcmcpOworI2Vsc2UKKwlyZXR1cm4gZ2V0ZW52KGFyZyk7CisjZW5kaWYKK30KKworI2lmIDAgLyogaWZkZWYgQ09ORklHX0JMS0lEX0RFQlVHICovCitzdGF0aWMgYmxraWRfZGVidWdfZHVtcF9jYWNoZShpbnQgbWFzaywgYmxraWRfY2FjaGUgY2FjaGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlmICghY2FjaGUpIHsKKwkJcHJpbnRmKCJjYWNoZTogTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoImNhY2hlOiB0aW1lID0gJWx1XG4iLCBjYWNoZS0+YmljX3RpbWUpOworCXByaW50ZigiY2FjaGU6IGZsYWdzID0gMHglMDhYXG4iLCBjYWNoZS0+YmljX2ZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlLT5iaWNfZGV2cykgeworCQlibGtpZF9kZXYgZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X2RldiwgYmlkX2RldnMpOworCQlibGtpZF9kZWJ1Z19kdW1wX2RldihkZXYpOworCX0KK30KKyNlbmRpZgorCitpbnQgYmxraWRfZ2V0X2NhY2hlKGJsa2lkX2NhY2hlICpyZXRfY2FjaGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWJsa2lkX2NhY2hlIGNhY2hlOworCisjaWZkZWYgQ09ORklHX0JMS0lEX0RFQlVHCisJaWYgKCEoYmxraWRfZGVidWdfbWFzayAmIERFQlVHX0lOSVQpKSB7CisJCWNoYXIgKmRzdHIgPSBnZXRlbnYoIkJMS0lEX0RFQlVHIik7CisKKwkJaWYgKGRzdHIpCisJCQlibGtpZF9kZWJ1Z19tYXNrID0gc3RydG91bChkc3RyLCAwLCAwKTsKKwkJYmxraWRfZGVidWdfbWFzayB8PSBERUJVR19JTklUOworCX0KKyNlbmRpZgorCisJREJHKERFQlVHX0NBQ0hFLCBwcmludGYoImNyZWF0aW5nIGJsa2lkIGNhY2hlICh1c2luZyAlcylcbiIsCisJCQkJZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICJkZWZhdWx0IGNhY2hlIikpOworCisJaWYgKCEoY2FjaGUgPSAoYmxraWRfY2FjaGUpIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGJsa2lkX3N0cnVjdF9jYWNoZSkpKSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5iaWNfZGV2cyk7CisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5iaWNfdGFncyk7CisKKwlpZiAoZmlsZW5hbWUgJiYgIXN0cmxlbihmaWxlbmFtZSkpCisJCWZpbGVuYW1lID0gMDsKKwlpZiAoIWZpbGVuYW1lKQorCQlmaWxlbmFtZSA9IHNhZmVfZ2V0ZW52KCJCTEtJRF9GSUxFIik7CisJaWYgKCFmaWxlbmFtZSkKKwkJZmlsZW5hbWUgPSBCTEtJRF9DQUNIRV9GSUxFOworCWNhY2hlLT5iaWNfZmlsZW5hbWUgPSBibGtpZF9zdHJkdXAoZmlsZW5hbWUpOworCisJYmxraWRfcmVhZF9jYWNoZShjYWNoZSk7CisKKwkqcmV0X2NhY2hlID0gY2FjaGU7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmxraWRfcHV0X2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlKQoreworCWlmICghY2FjaGUpCisJCXJldHVybjsKKworCSh2b2lkKSBibGtpZF9mbHVzaF9jYWNoZShjYWNoZSk7CisKKwlEQkcoREVCVUdfQ0FDSEUsIHByaW50ZigiZnJlZWluZyBjYWNoZSBzdHJ1Y3RcbiIpKTsKKworCS8qIERCRyhERUJVR19DQUNIRSwgYmxraWRfZGVidWdfZHVtcF9jYWNoZShjYWNoZSkpOyAqLworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWNoZS0+YmljX2RldnMpKSB7CisJCWJsa2lkX2RldiBkZXYgPSBsaXN0X2VudHJ5KGNhY2hlLT5iaWNfZGV2cy5uZXh0LAorCQkJCQkgICBzdHJ1Y3QgYmxraWRfc3RydWN0X2RldiwKKwkJCQkJICAgIGJpZF9kZXZzKTsKKwkJYmxraWRfZnJlZV9kZXYoZGV2KTsKKwl9CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhY2hlLT5iaWNfdGFncykpIHsKKwkJYmxraWRfdGFnIHRhZyA9IGxpc3RfZW50cnkoY2FjaGUtPmJpY190YWdzLm5leHQsCisJCQkJCSAgIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLAorCQkJCQkgICBiaXRfdGFncyk7CisKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0YWctPmJpdF9uYW1lcykpIHsKKwkJCWJsa2lkX3RhZyBiYWQgPSBsaXN0X2VudHJ5KHRhZy0+Yml0X25hbWVzLm5leHQsCisJCQkJCQkgICBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywKKwkJCQkJCSAgIGJpdF9uYW1lcyk7CisKKwkJCURCRyhERUJVR19DQUNIRSwgcHJpbnRmKCJ3YXJuaW5nOiB1bmZyZWVkIHRhZyAlcz0lc1xuIiwKKwkJCQkJCWJhZC0+Yml0X25hbWUsIGJhZC0+Yml0X3ZhbCkpOworCQkJYmxraWRfZnJlZV90YWcoYmFkKTsKKwkJfQorCQlibGtpZF9mcmVlX3RhZyh0YWcpOworCX0KKwlmcmVlKGNhY2hlLT5iaWNfZmlsZW5hbWUpOworCisJZnJlZShjYWNoZSk7Cit9CisKK3ZvaWQgYmxraWRfZ2NfY2FjaGUoYmxraWRfY2FjaGUgY2FjaGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnBuZXh0OworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHBuZXh0LCAmY2FjaGUtPmJpY19kZXZzKSB7CisJCWJsa2lkX2RldiBkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LCBiaWRfZGV2cyk7CisJCWlmICghcCkKKwkJCWJyZWFrOworCQlpZiAoc3RhdChkZXYtPmJpZF9uYW1lLCAmc3QpIDwgMCkgeworCQkJREJHKERFQlVHX0NBQ0hFLAorCQkJICAgIHByaW50ZigiZnJlZWluZyAlc1xuIiwgZGV2LT5iaWRfbmFtZSkpOworCQkJYmxraWRfZnJlZV9kZXYoZGV2KTsKKwkJCWNhY2hlLT5iaWNfZmxhZ3MgfD0gQkxLSURfQklDX0ZMX0NIQU5HRUQ7CisJCX0gZWxzZSB7CisJCQlEQkcoREVCVUdfQ0FDSEUsCisJCQkgICAgcHJpbnRmKCJEZXZpY2UgJXMgZXhpc3RzXG4iLCBkZXYtPmJpZF9uYW1lKSk7CisJCX0KKwl9Cit9CisKKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCWJsa2lkX2NhY2hlIGNhY2hlID0gTlVMTDsKKwlpbnQgcmV0OworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoKGFyZ2MgPiAyKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbZmlsZW5hbWVdIFxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBhcmd2WzFdKSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IgJWQgcGFyc2luZyBjYWNoZSBmaWxlICVzXG4iLCByZXQsCisJCQlhcmd2WzFdID8gYXJndlsxXSA6IEJMS0lEX0NBQ0hFX0ZJTEUpOworCQlleGl0KDEpOworCX0KKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsICIvZGV2L251bGwiKSkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciBjcmVhdGluZyBjYWNoZSAoJWQpXG4iLAorCQkJYXJndlswXSwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChyZXQgPSBibGtpZF9wcm9iZV9hbGwoY2FjaGUpIDwgMCkpCisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IgcHJvYmluZyBkZXZpY2VzXG4iKTsKKworCWJsa2lkX3B1dF9jYWNoZShjYWNoZSk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9kZXYuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGE4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9kZXYuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIGRldi5jIC0gYWxsb2NhdGlvbi9pbml0aWFsaXphdGlvbi9mcmVlIHJvdXRpbmVzIGZvciBkZXYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJibGtpZFAuaCIKKworYmxraWRfZGV2IGJsa2lkX25ld19kZXYodm9pZCkKK3sKKwlibGtpZF9kZXYgZGV2OworCisJaWYgKCEoZGV2ID0gKGJsa2lkX2RldikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYmxraWRfc3RydWN0X2RldikpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5iaWRfZGV2cyk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+YmlkX3RhZ3MpOworCisJcmV0dXJuIGRldjsKK30KKwordm9pZCBibGtpZF9mcmVlX2RldihibGtpZF9kZXYgZGV2KQoreworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlEQkcoREVCVUdfREVWLAorCSAgICBwcmludGYoIiAgZnJlZWluZyBkZXYgJXMgKCVzKVxuIiwgZGV2LT5iaWRfbmFtZSwgZGV2LT5iaWRfdHlwZSA/CisJCSAgIGRldi0+YmlkX3R5cGUgOiAiKG51bGwpIikpOworCURCRyhERUJVR19ERVYsIGJsa2lkX2RlYnVnX2R1bXBfZGV2KGRldikpOworCisJbGlzdF9kZWwoJmRldi0+YmlkX2RldnMpOworCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2LT5iaWRfdGFncykpIHsKKwkJYmxraWRfdGFnIHRhZyA9IGxpc3RfZW50cnkoZGV2LT5iaWRfdGFncy5uZXh0LAorCQkJCQkgICBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywKKwkJCQkJICAgYml0X3RhZ3MpOworCQlibGtpZF9mcmVlX3RhZyh0YWcpOworCX0KKwlmcmVlKGRldi0+YmlkX25hbWUpOworCWZyZWUoZGV2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgYmxraWQgZGV2aWNlLCByZXR1cm4gaXRzIG5hbWUKKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmJsa2lkX2Rldl9kZXZuYW1lKGJsa2lkX2RldiBkZXYpCit7CisJcmV0dXJuIGRldi0+YmlkX25hbWU7Cit9CisKKyNpZmRlZiBDT05GSUdfQkxLSURfREVCVUcKK3ZvaWQgYmxraWRfZGVidWdfZHVtcF9kZXYoYmxraWRfZGV2IGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRmKCIgIGRldjogTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIiAgZGV2OiBuYW1lID0gJXNcbiIsIGRldi0+YmlkX25hbWUpOworCXByaW50ZigiICBkZXY6IERFVk5PPVwiMHglMGxseFwiXG4iLCAobG9uZyBsb25nKWRldi0+YmlkX2Rldm5vKTsKKwlwcmludGYoIiAgZGV2OiBUSU1FPVwiJWxkXCJcbiIsIChsb25nKWRldi0+YmlkX3RpbWUpOworCXByaW50ZigiICBkZXY6IFBSST1cIiVkXCJcbiIsIGRldi0+YmlkX3ByaSk7CisJcHJpbnRmKCIgIGRldjogZmxhZ3MgPSAweCUwOFhcbiIsIGRldi0+YmlkX2ZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmRldi0+YmlkX3RhZ3MpIHsKKwkJYmxraWRfdGFnIHRhZyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsIGJpdF90YWdzKTsKKwkJaWYgKHRhZykKKwkJCXByaW50ZigiICAgIHRhZzogJXM9XCIlc1wiXG4iLCB0YWctPmJpdF9uYW1lLAorCQkJICAgICAgIHRhZy0+Yml0X3ZhbCk7CisJCWVsc2UKKwkJCXByaW50ZigiICAgIHRhZzogTlVMTFxuIik7CisJfQorCXByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCisvKgorICogZGV2IGl0ZXJhdGlvbiByb3V0aW5lcyBmb3IgdGhlIHB1YmxpYyBsaWJibGtpZCBpbnRlcmZhY2UuCisgKgorICogVGhlc2Ugcm91dGluZXMgZG8gbm90IGV4cG9zZSB0aGUgbGlzdC5oIGltcGxlbWVudGF0aW9uLCB3aGljaCBhcmUgYQorICogY29udGFtaW5hdGlvbiBvZiB0aGUgbmFtZXNwYWNlLCBhbmQgd2hpY2ggZm9yY2UgdXMgdG8gcmV2ZWFsIGZhciwgZmFyCisgKiB0b28gbXVjaCBvZiBvdXIgaW50ZXJuYWwgaW1wbGVtZW5hdGlvbi4gIEknbSBub3QgY29udmluY2VkIEkgd2FudAorICogdG8ga2VlcCBsaXN0LmggaW4gdGhlIGxvbmcgdGVybSwgYW55d2F5LiAgSXQncyBmaW5lIGZvciBrZXJuZWwKKyAqIHByb2dyYW1taW5nLCBidXQgcGVyZm9ybWFuY2UgaXMgbm90IHRoZSAjMSBwcmlvcml0eSBmb3IgdGhpcworICogbGlicmFyeSwgYW5kIEkgcmVhbGx5IGRvbid0IGxpa2UgdGhlIHRyYWRlb2ZmIG9mIHR5cGUtc2FmZXR5IGZvcgorICogcGVyZm9ybWFuY2UgZm9yIHRoaXMgYXBwbGljYXRpb24uICBbdHl0c286MjAwMzAxMjUuMjAwN0VTVF0KKyAqLworCisvKgorICogVGhpcyBzZXJpZXMgb2YgZnVuY3Rpb25zIGl0ZXJhdGUgb3ZlciBhbGwgZGV2aWNlcyBpbiBhIGJsa2lkIGNhY2hlCisgKi8KKyNkZWZpbmUgREVWX0lURVJBVEVfTUFHSUMJMHgwMWE1Mjg0YworCitzdHJ1Y3QgYmxraWRfc3RydWN0X2Rldl9pdGVyYXRlIHsKKwlpbnQJCQltYWdpYzsKKwlibGtpZF9jYWNoZQkJY2FjaGU7CisJY2hhcgkJCSpzZWFyY2hfdHlwZTsKKwljaGFyCQkJKnNlYXJjaF92YWx1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpwOworfTsKKworZXh0ZXJuIGJsa2lkX2Rldl9pdGVyYXRlIGJsa2lkX2Rldl9pdGVyYXRlX2JlZ2luKGJsa2lkX2NhY2hlIGNhY2hlKQoreworCWJsa2lkX2Rldl9pdGVyYXRlCWl0ZXI7CisKKwlpdGVyID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxraWRfc3RydWN0X2Rldl9pdGVyYXRlKSk7CisJaWYgKGl0ZXIpIHsKKwkJaXRlci0+bWFnaWMgPSBERVZfSVRFUkFURV9NQUdJQzsKKwkJaXRlci0+Y2FjaGUgPSBjYWNoZTsKKwkJaXRlci0+cAk9IGNhY2hlLT5iaWNfZGV2cy5uZXh0OworCQlpdGVyLT5zZWFyY2hfdHlwZSA9IDA7CisJCWl0ZXItPnNlYXJjaF92YWx1ZSA9IDA7CisJfQorCXJldHVybiAoaXRlcik7Cit9CisKK2V4dGVybiBpbnQgYmxraWRfZGV2X3NldF9zZWFyY2goYmxraWRfZGV2X2l0ZXJhdGUgaXRlciwKKwkJCQkgY2hhciAqc2VhcmNoX3R5cGUsIGNoYXIgKnNlYXJjaF92YWx1ZSkKK3sKKwljaGFyICpuZXdfdHlwZSwgKm5ld192YWx1ZTsKKworCWlmICghaXRlciB8fCBpdGVyLT5tYWdpYyAhPSBERVZfSVRFUkFURV9NQUdJQyB8fCAhc2VhcmNoX3R5cGUgfHwKKwkgICAgIXNlYXJjaF92YWx1ZSkKKwkJcmV0dXJuIC0xOworCW5ld190eXBlID0gbWFsbG9jKHN0cmxlbihzZWFyY2hfdHlwZSkrMSk7CisJbmV3X3ZhbHVlID0gbWFsbG9jKHN0cmxlbihzZWFyY2hfdmFsdWUpKzEpOworCWlmICghbmV3X3R5cGUgfHwgIW5ld192YWx1ZSkgeworCQlmcmVlKG5ld190eXBlKTsKKwkJZnJlZShuZXdfdmFsdWUpOworCQlyZXR1cm4gLTE7CisJfQorCXN0cmNweShuZXdfdHlwZSwgc2VhcmNoX3R5cGUpOworCXN0cmNweShuZXdfdmFsdWUsIHNlYXJjaF92YWx1ZSk7CisJZnJlZShpdGVyLT5zZWFyY2hfdHlwZSk7CisJZnJlZShpdGVyLT5zZWFyY2hfdmFsdWUpOworCWl0ZXItPnNlYXJjaF90eXBlID0gbmV3X3R5cGU7CisJaXRlci0+c2VhcmNoX3ZhbHVlID0gbmV3X3ZhbHVlOworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAqLworZXh0ZXJuIGludCBibGtpZF9kZXZfbmV4dChibGtpZF9kZXZfaXRlcmF0ZSBpdGVyLAorCQkJICBibGtpZF9kZXYgKnJldF9kZXYpCit7CisJYmxraWRfZGV2CQlkZXY7CisKKwkqcmV0X2RldiA9IDA7CisJaWYgKCFpdGVyIHx8IGl0ZXItPm1hZ2ljICE9IERFVl9JVEVSQVRFX01BR0lDKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKGl0ZXItPnAgIT0gJml0ZXItPmNhY2hlLT5iaWNfZGV2cykgeworCQlkZXYgPSBsaXN0X2VudHJ5KGl0ZXItPnAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LCBiaWRfZGV2cyk7CisJCWl0ZXItPnAgPSBpdGVyLT5wLT5uZXh0OworCQlpZiAoaXRlci0+c2VhcmNoX3R5cGUgJiYKKwkJICAgICFibGtpZF9kZXZfaGFzX3RhZyhkZXYsIGl0ZXItPnNlYXJjaF90eXBlLAorCQkJCSAgICAgICBpdGVyLT5zZWFyY2hfdmFsdWUpKQorCQkJY29udGludWU7CisJCSpyZXRfZGV2ID0gZGV2OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCitleHRlcm4gdm9pZCBibGtpZF9kZXZfaXRlcmF0ZV9lbmQoYmxraWRfZGV2X2l0ZXJhdGUgaXRlcikKK3sKKwlpZiAoIWl0ZXIgfHwgaXRlci0+bWFnaWMgIT0gREVWX0lURVJBVEVfTUFHSUMpCisJCXJldHVybjsKKwlpdGVyLT5tYWdpYyA9IDA7CisJZnJlZShpdGVyKTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQorI2lmZGVmIEhBVkVfR0VUT1BUX0gKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbHNlCitleHRlcm4gY2hhciAqb3B0YXJnOworZXh0ZXJuIGludCBvcHRpbmQ7CisjZW5kaWYKKwordm9pZCB1c2FnZShjaGFyICpwcm9nKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZiBibGtpZF9maWxlXSBbLW0gZGVidWdfbWFza11cbiIsIHByb2cpOworCWZwcmludGYoc3RkZXJyLCAiXHRMaXN0IGFsbCBkZXZpY2VzIGFuZCBleGl0XG4iKTsKKwlleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxraWRfZGV2X2l0ZXJhdGUJaXRlcjsKKwlibGtpZF9jYWNoZSAJCWNhY2hlID0gTlVMTDsKKwlibGtpZF9kZXYJCWRldjsKKwlpbnQJCQljLCByZXQ7CisJY2hhcgkJCSp0bXA7CisJY2hhcgkJCSpmaWxlID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF90eXBlID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF92YWx1ZSA9IE5VTEw7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJtOmY6IikpICE9IEVPRikKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2YnOgorCQkJZmlsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWJsa2lkX2RlYnVnX21hc2sgPSBzdHJ0b3VsIChvcHRhcmcsICZ0bXAsIDApOworCQkJaWYgKCp0bXApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZGVidWcgbWFzazogJXNcbiIsCisJCQkJCW9wdGFyZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQl9CisJaWYgKGFyZ2MgPj0gb3B0aW5kKzIpIHsKKwkJc2VhcmNoX3R5cGUgPSBhcmd2W29wdGluZF07CisJCXNlYXJjaF92YWx1ZSA9IGFyZ3Zbb3B0aW5kKzFdOworCQlvcHRpbmQgKz0gMjsKKwl9CisJaWYgKGFyZ2MgIT0gb3B0aW5kKQorCQl1c2FnZShhcmd2WzBdKTsKKworCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgZmlsZSkpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgY3JlYXRpbmcgY2FjaGUgKCVkKVxuIiwKKwkJCWFyZ3ZbMF0sIHJldCk7CisJCWV4aXQoMSk7CisJfQorCisJaXRlciA9IGJsa2lkX2Rldl9pdGVyYXRlX2JlZ2luKGNhY2hlKTsKKwlpZiAoc2VhcmNoX3R5cGUpCisJCWJsa2lkX2Rldl9zZXRfc2VhcmNoKGl0ZXIsIHNlYXJjaF90eXBlLCBzZWFyY2hfdmFsdWUpOworCXdoaWxlIChibGtpZF9kZXZfbmV4dChpdGVyLCAmZGV2KSA9PSAwKSB7CisJCXByaW50ZigiRGV2aWNlOiAlc1xuIiwgYmxraWRfZGV2X2Rldm5hbWUoZGV2KSk7CisJfQorCWJsa2lkX2Rldl9pdGVyYXRlX2VuZChpdGVyKTsKKworCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9kZXZuYW1lLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9kZXZuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1MTM1NAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2Rldm5hbWUuYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIGRldm5hbWUuYyAtIGdldCBhIGRldiBieSBpdHMgZGV2aWNlIGlub2RlIG5hbWUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJpZXMgQnJvdXdlcgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRSAxCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJibGtpZFAuaCIKKworLyoKKyAqIEZpbmQgYSBkZXYgc3RydWN0IGluIHRoZSBjYWNoZSBieSBkZXZpY2UgbmFtZSwgaWYgYXZhaWxhYmxlLgorICoKKyAqIElmIHRoZXJlIGlzIG5vIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UgbmFtZSwgYW5kIHRoZSBjcmVhdGUKKyAqIGZsYWcgaXMgc2V0LCB0aGVuIGNyZWF0ZSBhbiBlbXB0eSBkZXZpY2UgZW50cnkuCisgKi8KK2Jsa2lkX2RldiBibGtpZF9nZXRfZGV2KGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICpkZXZuYW1lLCBpbnQgZmxhZ3MpCit7CisJYmxraWRfZGV2IGRldiA9IE5VTEwsIHRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcG5leHQ7CisKKwlpZiAoIWNhY2hlIHx8ICFkZXZuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlLT5iaWNfZGV2cykgeworCQl0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LCBiaWRfZGV2cyk7CisJCWlmIChzdHJjbXAodG1wLT5iaWRfbmFtZSwgZGV2bmFtZSkpCisJCQljb250aW51ZTsKKworCQlEQkcoREVCVUdfREVWTkFNRSwKKwkJICAgIHByaW50ZigiZm91bmQgZGV2bmFtZSAlcyBpbiBjYWNoZVxuIiwgdG1wLT5iaWRfbmFtZSkpOworCQlkZXYgPSB0bXA7CisJCWJyZWFrOworCX0KKworCWlmICghZGV2ICYmIChmbGFncyAmIEJMS0lEX0RFVl9DUkVBVEUpKSB7CisJCWlmIChhY2Nlc3MoZGV2bmFtZSwgRl9PSykgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWRldiA9IGJsa2lkX25ld19kZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gTlVMTDsKKwkJZGV2LT5iaWRfdGltZSA9IElOVF9NSU47CisJCWRldi0+YmlkX25hbWUgPSBibGtpZF9zdHJkdXAoZGV2bmFtZSk7CisJCWRldi0+YmlkX2NhY2hlID0gY2FjaGU7CisJCWxpc3RfYWRkX3RhaWwoJmRldi0+YmlkX2RldnMsICZjYWNoZS0+YmljX2RldnMpOworCQljYWNoZS0+YmljX2ZsYWdzIHw9IEJMS0lEX0JJQ19GTF9DSEFOR0VEOworCX0KKworCWlmIChmbGFncyAmIEJMS0lEX0RFVl9WRVJJRlkpIHsKKwkJZGV2ID0gYmxraWRfdmVyaWZ5KGNhY2hlLCBkZXYpOworCQlpZiAoIWRldiB8fCAhKGRldi0+YmlkX2ZsYWdzICYgQkxLSURfQklEX0ZMX1ZFUklGSUVEKSkKKwkJCXJldHVybiBkZXY7CisJCS8qCisJCSAqIElmIHRoZSBkZXZpY2UgaXMgdmVyaWZpZWQsIHRoZW4gc2VhcmNoIHRoZSBibGtpZAorCQkgKiBjYWNoZSBmb3IgYW55IGVudHJpZXMgdGhhdCBtYXRjaCBvbiB0aGUgdHlwZSwgdXVpZCwKKwkJICogYW5kIGxhYmVsLCBhbmQgdmVyaWZ5IHRoZW07IGlmIGEgY2FjaGUgZW50cnkgY2FuCisJCSAqIG5vdCBiZSB2ZXJpZmllZCwgdGhlbiBpdCdzIHN0YWxlIGFuZCBzbyB3ZSByZW1vdmUKKwkJICogaXQuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgcG5leHQsICZjYWNoZS0+YmljX2RldnMpIHsKKwkJCWJsa2lkX2RldiBkZXYyOworCQkJaWYgKCFwKQorCQkJCWJyZWFrOworCQkJZGV2MiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYsIGJpZF9kZXZzKTsKKwkJCWlmIChkZXYyLT5iaWRfZmxhZ3MgJiBCTEtJRF9CSURfRkxfVkVSSUZJRUQpCisJCQkJY29udGludWU7CisJCQlpZiAoIWRldi0+YmlkX3R5cGUgfHwgIWRldjItPmJpZF90eXBlIHx8CisJCQkgICAgc3RyY21wKGRldi0+YmlkX3R5cGUsIGRldjItPmJpZF90eXBlKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkZXYtPmJpZF9sYWJlbCAmJiBkZXYyLT5iaWRfbGFiZWwgJiYKKwkJCSAgICBzdHJjbXAoZGV2LT5iaWRfbGFiZWwsIGRldjItPmJpZF9sYWJlbCkpCisJCQkJY29udGludWU7CisJCQlpZiAoZGV2LT5iaWRfdXVpZCAmJiBkZXYyLT5iaWRfdXVpZCAmJgorCQkJICAgIHN0cmNtcChkZXYtPmJpZF91dWlkLCBkZXYyLT5iaWRfdXVpZCkpCisJCQkJY29udGludWU7CisJCQlpZiAoKGRldi0+YmlkX2xhYmVsICYmICFkZXYyLT5iaWRfbGFiZWwpIHx8CisJCQkgICAgKCFkZXYtPmJpZF9sYWJlbCAmJiBkZXYyLT5iaWRfbGFiZWwpIHx8CisJCQkgICAgKGRldi0+YmlkX3V1aWQgJiYgIWRldjItPmJpZF91dWlkKSB8fAorCQkJICAgICghZGV2LT5iaWRfdXVpZCAmJiBkZXYyLT5iaWRfdXVpZCkpCisJCQkJY29udGludWU7CisJCQlkZXYyID0gYmxraWRfdmVyaWZ5KGNhY2hlLCBkZXYyKTsKKwkJCWlmIChkZXYyICYmICEoZGV2Mi0+YmlkX2ZsYWdzICYgQkxLSURfQklEX0ZMX1ZFUklGSUVEKSkKKwkJCQlibGtpZF9mcmVlX2RldihkZXYyKTsKKwkJfQorCX0KKwlyZXR1cm4gZGV2OworfQorCisvKiBEaXJlY3RvcmllcyB3aGVyZSB3ZSB3aWxsIHRyeSB0byBzZWFyY2ggZm9yIGRldmljZSBuYW1lcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRpcmxpc3RbXSA9IHsgIi9kZXYiLCAiL2RldmZzIiwgIi9kZXZpY2VzIiwgTlVMTCB9OworCitzdGF0aWMgaW50IGlzX2RtX2xlYWYoY29uc3QgY2hhciAqZGV2bmFtZSkKK3sKKwlzdHJ1Y3QgZGlyZW50CSpkZSwgKmRfZGU7CisJRElSCQkqZGlyLCAqZF9kaXI7CisJY2hhcgkJcGF0aFsyNTZdOworCWludAkJcmV0ID0gMTsKKworCWlmICgoZGlyID0gb3BlbmRpcigiL3N5cy9ibG9jayIpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKGRlLT5kX25hbWUsICIuIikgfHwgIXN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSB8fAorCQkgICAgIXN0cmNtcChkZS0+ZF9uYW1lLCBkZXZuYW1lKSB8fAorCQkgICAgc3RybmNtcChkZS0+ZF9uYW1lLCAiZG0tIiwgMykgfHwKKwkJICAgIHN0cmxlbihkZS0+ZF9uYW1lKSA+IHNpemVvZihwYXRoKS0zMikKKwkJCWNvbnRpbnVlOworCQlzcHJpbnRmKHBhdGgsICIvc3lzL2Jsb2NrLyVzL3NsYXZlcyIsIGRlLT5kX25hbWUpOworCQlpZiAoKGRfZGlyID0gb3BlbmRpcihwYXRoKSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQl3aGlsZSAoKGRfZGUgPSByZWFkZGlyKGRfZGlyKSkgIT0gTlVMTCkgeworCQkJaWYgKCFzdHJjbXAoZF9kZS0+ZF9uYW1lLCBkZXZuYW1lKSkgeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2xvc2VkaXIoZF9kaXIpOworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTaW5jZSAyLjYuMjkgKHBhdGNoIDc4NGFhZTczNWQ5YjBiYmEzZjhiOWZhZWY0YzhiMzBkZjNiZjAxMjgpIGtlcm5lbCBzeXNmcworICogcHJvdmlkZXMgdGhlIHJlYWwgRE0gZGV2aWNlIG5hbWVzIGluIC9zeXMvYmxvY2svPHB0bmFtZT4vZG0vbmFtZQorICovCitzdGF0aWMgY2hhciAqZ2V0X2RtX25hbWUoY29uc3QgY2hhciAqcHRuYW1lKQoreworCUZJTEUJKmY7CisJc2l6ZV90CXN6OworCWNoYXIJcGF0aFsyNTZdLCBuYW1lWzI1Nl0sICpyZXMgPSBOVUxMOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiL3N5cy9ibG9jay8lcy9kbS9uYW1lIiwgcHRuYW1lKTsKKwlpZiAoKGYgPSBmb3BlbihwYXRoLCAiciIpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHJlYWQgIjxuYW1lPlxuIiBmcm9tIHN5c2ZzICovCisJaWYgKGZnZXRzKG5hbWUsIHNpemVvZihuYW1lKSwgZikgJiYgKHN6ID0gc3RybGVuKG5hbWUpKSA+IDEpIHsKKwkJbmFtZVtzeiAtIDFdID0gJ1wwJzsKKwkJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiL2Rldi9tYXBwZXIvJXMiLCBuYW1lKTsKKwkJcmVzID0gYmxraWRfc3RyZHVwKHBhdGgpOworCX0KKwlmY2xvc2UoZik7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFByb2JlIGEgc2luZ2xlIGJsb2NrIGRldmljZSB0byBhZGQgdG8gdGhlIGRldmljZSBjYWNoZS4KKyAqLworc3RhdGljIHZvaWQgcHJvYmVfb25lKGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICpwdG5hbWUsCisJCSAgICAgIGRldl90IGRldm5vLCBpbnQgcHJpLCBpbnQgb25seV9pZl9uZXcpCit7CisJYmxraWRfZGV2IGRldiA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnBuZXh0OworCWNvbnN0IGNoYXIgKipkaXI7CisJY2hhciAqZGV2bmFtZSA9IE5VTEw7CisKKwkvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgZGV2aWNlIG51bWJlciBpbiB0aGUgY2FjaGUuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHBuZXh0LCAmY2FjaGUtPmJpY19kZXZzKSB7CisJCWJsa2lkX2RldiB0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LAorCQkJCQkgICBiaWRfZGV2cyk7CisJCWlmICh0bXAtPmJpZF9kZXZubyA9PSBkZXZubykgeworCQkJaWYgKG9ubHlfaWZfbmV3ICYmICFhY2Nlc3ModG1wLT5iaWRfbmFtZSwgRl9PSykpCisJCQkJcmV0dXJuOworCQkJZGV2ID0gYmxraWRfdmVyaWZ5KGNhY2hlLCB0bXApOworCQkJaWYgKGRldiAmJiAoZGV2LT5iaWRfZmxhZ3MgJiBCTEtJRF9CSURfRkxfVkVSSUZJRUQpKQorCQkJCWJyZWFrOworCQkJZGV2ID0gMDsKKwkJfQorCX0KKwlpZiAoZGV2ICYmIGRldi0+YmlkX2Rldm5vID09IGRldm5vKQorCQlnb3RvIHNldF9wcmk7CisKKwkvKiBUcnkgdG8gdHJhbnNsYXRlIHByaXZhdGUgZGV2aWNlLW1hcHBlciBkbS08Tj4gbmFtZXMKKwkgKiB0byBzdGFuZGFyZCAvZGV2L21hcHBlci88bmFtZT4uCisJICovCisJaWYgKCFzdHJuY21wKHB0bmFtZSwgImRtLSIsIDMpICYmIGlzZGlnaXQocHRuYW1lWzNdKSkgeworCQlkZXZuYW1lID0gZ2V0X2RtX25hbWUocHRuYW1lKTsKKwkJaWYgKCFkZXZuYW1lKQorCQkJYmxraWRfX3NjYW5fZGlyKCIvZGV2L21hcHBlciIsIGRldm5vLCAwLCAmZGV2bmFtZSk7CisJCWlmIChkZXZuYW1lKQorCQkJZ290byBnZXRfZGV2OworCX0KKworCS8qCisJICogVGFrZSBhIHF1aWNrIGxvb2sgYXQgL2Rldi9wdG5hbWUgZm9yIHRoZSBkZXZpY2UgbnVtYmVyLiAgV2UgY2hlY2sKKwkgKiBhbGwgb2YgdGhlIGxpa2VseSBkZXZpY2UgZGlyZWN0b3JpZXMuICBJZiB3ZSBkb24ndCBmaW5kIGl0LCBvciBpZgorCSAqIHRoZSBzdGF0IGluZm9ybWF0aW9uIGRvZXNuJ3QgY2hlY2sgb3V0LCB1c2UgYmxraWRfZGV2bm9fdG9fZGV2bmFtZSgpCisJICogdG8gZmluZCBpdCB2aWEgYW4gZXhoYXVzdGl2ZSBzZWFyY2ggZm9yIHRoZSBkZXZpY2UgbWFqb3IvbWlub3IuCisJICovCisJZm9yIChkaXIgPSBkaXJsaXN0OyAqZGlyOyBkaXIrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciBkZXZpY2VbMjU2XTsKKworCQlzcHJpbnRmKGRldmljZSwgIiVzLyVzIiwgKmRpciwgcHRuYW1lKTsKKwkJaWYgKChkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBkZXZpY2UsIEJMS0lEX0RFVl9GSU5EKSkgJiYKKwkJICAgIGRldi0+YmlkX2Rldm5vID09IGRldm5vKQorCQkJZ290byBzZXRfcHJpOworCisJCWlmIChzdGF0KGRldmljZSwgJnN0KSA9PSAwICYmIFNfSVNCTEsoc3Quc3RfbW9kZSkgJiYKKwkJICAgIHN0LnN0X3JkZXYgPT0gZGV2bm8pIHsKKwkJCWRldm5hbWUgPSBibGtpZF9zdHJkdXAoZGV2aWNlKTsKKwkJCWdvdG8gZ2V0X2RldjsKKwkJfQorCX0KKwkvKiBEbyBhIHNob3J0LWN1dCBzY2FuIG9mIC9kZXYvbWFwcGVyIGZpcnN0ICovCisJaWYgKCFkZXZuYW1lKQorCQlkZXZuYW1lID0gZ2V0X2RtX25hbWUocHRuYW1lKTsKKwlpZiAoIWRldm5hbWUpCisJCWJsa2lkX19zY2FuX2RpcigiL2Rldi9tYXBwZXIiLCBkZXZubywgMCwgJmRldm5hbWUpOworCWlmICghZGV2bmFtZSkgeworCQlkZXZuYW1lID0gYmxraWRfZGV2bm9fdG9fZGV2bmFtZShkZXZubyk7CisJCWlmICghZGV2bmFtZSkKKwkJCXJldHVybjsKKwl9CitnZXRfZGV2OgorCWRldiA9IGJsa2lkX2dldF9kZXYoY2FjaGUsIGRldm5hbWUsIEJMS0lEX0RFVl9OT1JNQUwpOworCWZyZWUoZGV2bmFtZSk7CitzZXRfcHJpOgorCWlmIChkZXYpIHsKKwkJaWYgKHByaSkKKwkJCWRldi0+YmlkX3ByaSA9IHByaTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoZGV2LT5iaWRfbmFtZSwgIi9kZXYvbWFwcGVyLyIsIDExKSkgeworCQkJZGV2LT5iaWRfcHJpID0gQkxLSURfUFJJX0RNOworCQkJaWYgKGlzX2RtX2xlYWYocHRuYW1lKSkKKwkJCQlkZXYtPmJpZF9wcmkgKz0gNTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChwdG5hbWUsICJtZCIsIDIpKQorCQkJZGV2LT5iaWRfcHJpID0gQkxLSURfUFJJX01EOworIAl9CisJcmV0dXJuOworfQorCisjZGVmaW5lIFBST0NfUEFSVElUSU9OUyAiL3Byb2MvcGFydGl0aW9ucyIKKyNkZWZpbmUgVkdfRElSCQkiL3Byb2MvbHZtL1ZHcyIKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFVVSUQgY2FjaGUgd2l0aCBkZXZpY2VzIGZyb20gdGhlIExWTQorICogcHJvYyBoaWVyYXJjaHkuICBXZSBjdXJyZW50bHkgZGVwZW5kIG9uIHRoZSBuYW1lcyBvZiB0aGUgTFZNCisgKiBoaWVyYXJjaHkgZ2l2aW5nIHVzIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGluIC9kZXYuICAoWFhYIGlzIHRoaXMgYQorICogc2FmZSB0aGluZyB0byBkbz8pCisgKi8KKyNpZmRlZiBWR19ESVIKK3N0YXRpYyBkZXZfdCBsdm1fZ2V0X2Rldm5vKGNvbnN0IGNoYXIgKmx2bV9kZXZpY2UpCit7CisJRklMRSAqbHZmOworCWNoYXIgYnVmWzEwMjRdOworCWludCBtYSwgbWk7CisJZGV2X3QgcmV0ID0gMDsKKworCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoIm9wZW5pbmcgJXNcbiIsIGx2bV9kZXZpY2UpKTsKKwlpZiAoKGx2ZiA9IGZvcGVuKGx2bV9kZXZpY2UsICJyIikpID09IE5VTEwpIHsKKwkJREJHKERFQlVHX0RFVk5BTUUsIHByaW50ZigiJXM6ICglZCkgJXNcbiIsIGx2bV9kZXZpY2UsIGVycm5vLAorCQkJCQkgIHN0cmVycm9yKGVycm5vKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgbHZmKSkgeworCQlpZiAoc3NjYW5mKGJ1ZiwgImRldmljZTogJWQ6JWQiLCAmbWEsICZtaSkgPT0gMikgeworCQkJcmV0ID0gbWFrZWRldihtYSwgbWkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZmNsb3NlKGx2Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBsdm1fcHJvYmVfYWxsKGJsa2lkX2NhY2hlIGNhY2hlLCBpbnQgb25seV9pZl9uZXcpCit7CisJRElSCQkqdmdfbGlzdDsKKwlzdHJ1Y3QgZGlyZW50CSp2Z19pdGVyOworCWludAkJdmdfbGVuID0gc3RybGVuKFZHX0RJUik7CisJZGV2X3QJCWRldjsKKworCWlmICgodmdfbGlzdCA9IG9wZW5kaXIoVkdfRElSKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJREJHKERFQlVHX0RFVk5BTUUsIHByaW50ZigicHJvYmluZyBMVk0gZGV2aWNlcyB1bmRlciAlc1xuIiwgVkdfRElSKSk7CisKKwl3aGlsZSAoKHZnX2l0ZXIgPSByZWFkZGlyKHZnX2xpc3QpKSAhPSBOVUxMKSB7CisJCURJUgkJKmx2X2xpc3Q7CisJCWNoYXIJCSp2ZGlybmFtZTsKKwkJY2hhcgkJKnZnX25hbWU7CisJCXN0cnVjdCBkaXJlbnQJKmx2X2l0ZXI7CisKKwkJdmdfbmFtZSA9IHZnX2l0ZXItPmRfbmFtZTsKKwkJaWYgKCFzdHJjbXAodmdfbmFtZSwgIi4iKSB8fCAhc3RyY21wKHZnX25hbWUsICIuLiIpKQorCQkJY29udGludWU7CisJCXZkaXJuYW1lID0gbWFsbG9jKHZnX2xlbiArIHN0cmxlbih2Z19uYW1lKSArIDgpOworCQlpZiAoIXZkaXJuYW1lKQorCQkJZ290byBleGl0OworCQlzcHJpbnRmKHZkaXJuYW1lLCAiJXMvJXMvTFZzIiwgVkdfRElSLCB2Z19uYW1lKTsKKworCQlsdl9saXN0ID0gb3BlbmRpcih2ZGlybmFtZSk7CisJCWZyZWUodmRpcm5hbWUpOworCQlpZiAobHZfbGlzdCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKChsdl9pdGVyID0gcmVhZGRpcihsdl9saXN0KSkgIT0gTlVMTCkgeworCQkJY2hhcgkJKmx2X25hbWUsICpsdm1fZGV2aWNlOworCisJCQlsdl9uYW1lID0gbHZfaXRlci0+ZF9uYW1lOworCQkJaWYgKCFzdHJjbXAobHZfbmFtZSwgIi4iKSB8fCAhc3RyY21wKGx2X25hbWUsICIuLiIpKQorCQkJCWNvbnRpbnVlOworCisJCQlsdm1fZGV2aWNlID0gbWFsbG9jKHZnX2xlbiArIHN0cmxlbih2Z19uYW1lKSArCisJCQkJCSAgICBzdHJsZW4obHZfbmFtZSkgKyA4KTsKKwkJCWlmICghbHZtX2RldmljZSkgeworCQkJCWNsb3NlZGlyKGx2X2xpc3QpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCXNwcmludGYobHZtX2RldmljZSwgIiVzLyVzL0xWcy8lcyIsIFZHX0RJUiwgdmdfbmFtZSwKKwkJCQlsdl9uYW1lKTsKKwkJCWRldiA9IGx2bV9nZXRfZGV2bm8obHZtX2RldmljZSk7CisJCQlzcHJpbnRmKGx2bV9kZXZpY2UsICIlcy8lcyIsIHZnX25hbWUsIGx2X25hbWUpOworCQkJREJHKERFQlVHX0RFVk5BTUUsIHByaW50ZigiTFZNIGRldiAlczogZGV2bm8gMHglMDRYXG4iLAorCQkJCQkJICBsdm1fZGV2aWNlLAorCQkJCQkJICAodW5zaWduZWQgaW50KSBkZXYpKTsKKwkJCXByb2JlX29uZShjYWNoZSwgbHZtX2RldmljZSwgZGV2LCBCTEtJRF9QUklfTFZNLAorCQkJCSAgb25seV9pZl9uZXcpOworCQkJZnJlZShsdm1fZGV2aWNlKTsKKwkJfQorCQljbG9zZWRpcihsdl9saXN0KTsKKwl9CitleGl0OgorCWNsb3NlZGlyKHZnX2xpc3QpOworfQorI2VuZGlmCisKKyNkZWZpbmUgUFJPQ19FVk1TX1ZPTFVNRVMgIi9wcm9jL2V2bXMvdm9sdW1lcyIKKworc3RhdGljIGludAorZXZtc19wcm9iZV9hbGwoYmxraWRfY2FjaGUgY2FjaGUsIGludCBvbmx5X2lmX25ldykKK3sKKwljaGFyIGxpbmVbMTAwXTsKKwlpbnQgbWEsIG1pLCBzeiwgbnVtID0gMDsKKwlGSUxFICpwcm9jcHQ7CisJY2hhciBkZXZpY2VbMTEwXTsKKworCXByb2NwdCA9IGZvcGVuKFBST0NfRVZNU19WT0xVTUVTLCAiciIpOworCWlmICghcHJvY3B0KQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwcm9jcHQpKSB7CisJCWlmIChzc2NhbmYgKGxpbmUsICIgJWQgJWQgJWQgJSpzICUqcyAlW15cbiBdIiwKKwkJCSAgICAmbWEsICZtaSwgJnN6LCBkZXZpY2UpICE9IDQpCisJCQljb250aW51ZTsKKworCQlEQkcoREVCVUdfREVWTkFNRSwgcHJpbnRmKCJDaGVja2luZyBwYXJ0aXRpb24gJXMgKCVkLCAlZClcbiIsCisJCQkJCSAgZGV2aWNlLCBtYSwgbWkpKTsKKworCQlwcm9iZV9vbmUoY2FjaGUsIGRldmljZSwgbWFrZWRldihtYSwgbWkpLCBCTEtJRF9QUklfRVZNUywKKwkJCSAgb25seV9pZl9uZXcpOworCQludW0rKzsKKwl9CisJZmNsb3NlKHByb2NwdCk7CisJcmV0dXJuIG51bTsKK30KKworLyoKKyAqIFJlYWQgdGhlIGRldmljZSBkYXRhIGZvciBhbGwgYXZhaWxhYmxlIGJsb2NrIGRldmljZXMgaW4gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIGludCBwcm9iZV9hbGwoYmxraWRfY2FjaGUgY2FjaGUsIGludCBvbmx5X2lmX25ldykKK3sKKwlGSUxFICpwcm9jOworCWNoYXIgbGluZVsxMDI0XTsKKwljaGFyIHB0bmFtZTBbMTI4XSwgcHRuYW1lMVsxMjhdLCAqcHRuYW1lID0gMDsKKwljaGFyICpwdG5hbWVzWzJdOworCWRldl90IGRldnNbMl07CisJaW50IG1hLCBtaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3o7CisJaW50IGxlbnNbMl0gPSB7IDAsIDAgfTsKKwlpbnQgd2hpY2ggPSAwLCBsYXN0ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcG5leHQ7CisKKwlwdG5hbWVzWzBdID0gcHRuYW1lMDsKKwlwdG5hbWVzWzFdID0gcHRuYW1lMTsKKworCWlmICghY2FjaGUpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJaWYgKGNhY2hlLT5iaWNfZmxhZ3MgJiBCTEtJRF9CSUNfRkxfUFJPQkVEICYmCisJICAgIHRpbWUoMCkgLSBjYWNoZS0+YmljX3RpbWUgPCBCTEtJRF9QUk9CRV9JTlRFUlZBTCkKKwkJcmV0dXJuIDA7CisKKwlibGtpZF9yZWFkX2NhY2hlKGNhY2hlKTsKKwlldm1zX3Byb2JlX2FsbChjYWNoZSwgb25seV9pZl9uZXcpOworI2lmZGVmIFZHX0RJUgorCWx2bV9wcm9iZV9hbGwoY2FjaGUsIG9ubHlfaWZfbmV3KTsKKyNlbmRpZgorCisJcHJvYyA9IGZvcGVuKFBST0NfUEFSVElUSU9OUywgInIiKTsKKwlpZiAoIXByb2MpCisJCXJldHVybiAtQkxLSURfRVJSX1BST0M7CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwcm9jKSkgeworCQlsYXN0ID0gd2hpY2g7CisJCXdoaWNoIF49IDE7CisJCXB0bmFtZSA9IHB0bmFtZXNbd2hpY2hdOworCisJCWlmIChzc2NhbmYobGluZSwgIiAlZCAlZCAlbGx1ICUxMjhbXlxuIF0iLAorCQkJICAgJm1hLCAmbWksICZzeiwgcHRuYW1lKSAhPSA0KQorCQkJY29udGludWU7CisJCWRldnNbd2hpY2hdID0gbWFrZWRldihtYSwgbWkpOworCisJCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoInJlYWQgcGFydGl0aW9uIG5hbWUgJXNcbiIsIHB0bmFtZSkpOworCisJCS8qIFNraXAgd2hvbGUgZGlzayBkZXZzIHVubGVzcyB0aGV5IGhhdmUgbm8gcGFydGl0aW9ucy4KKwkJICogSWYgYmFzZSBuYW1lIG9mIGRldmljZSBoYXMgY2hhbmdlZCwgYWxzbworCQkgKiBjaGVjayBwcmV2aW91cyBkZXYgdG8gc2VlIGlmIGl0IGRpZG4ndCBoYXZlIGEgcGFydG4uCisJCSAqIGhldXJpc3RpYzogcGFydGl0aW9uIG5hbWUgZW5kcyBpbiBhIGRpZ2l0LCAmIHBhcnRpdGlvbgorCQkgKiBuYW1lcyBjb250YWluIHdob2xlIGRldmljZSBuYW1lIGFzIHN1YnN0cmluZy4KKwkJICoKKwkJICogU2tpcCBleHRlbmRlZCBwYXJ0aXRpb25zLgorCQkgKiBoZXVyaXN0aWM6IHNpemUgaXMgMQorCQkgKgorCQkgKiBGSVhNRTogc2tpcCAvZGV2L3tpZGEsY2Npc3MscmR9IHdob2xlLWRpc2sgZGV2cworCQkgKi8KKworCQlsZW5zW3doaWNoXSA9IHN0cmxlbihwdG5hbWUpOworCisJCS8qIGVuZHMgaW4gYSBkaWdpdCwgY2xlYXJseSBhIHBhcnRpdGlvbiwgc28gY2hlY2sgKi8KKwkJaWYgKGlzZGlnaXQocHRuYW1lW2xlbnNbd2hpY2hdIC0gMV0pKSB7CisJCQlEQkcoREVCVUdfREVWTkFNRSwKKwkJCSAgICBwcmludGYoInBhcnRpdGlvbiBkZXYgJXMsIGRldm5vIDB4JTA0WFxuIiwKKwkJCQkgICBwdG5hbWUsICh1bnNpZ25lZCBpbnQpIGRldnNbd2hpY2hdKSk7CisKKwkJCWlmIChzeiA+IDEpCisJCQkJcHJvYmVfb25lKGNhY2hlLCBwdG5hbWUsIGRldnNbd2hpY2hdLCAwLAorCQkJCQkgIG9ubHlfaWZfbmV3KTsKKwkJCWxlbnNbd2hpY2hdID0gMDsJLyogbWFyayBhcyBjaGVja2VkICovCisJCX0KKworCQkvKgorCQkgKiBJZiBsYXN0IHdhcyBhIHdob2xlIGRpc2sgYW5kIHdlIGp1c3QgZm91bmQgYSBwYXJ0aXRpb24KKwkJICogb24gaXQsIHJlbW92ZSB0aGUgd2hvbGUtZGlzayBkZXYgZnJvbSB0aGUgY2FjaGUgaWYKKwkJICogaXQgZXhpc3RzLgorCQkgKi8KKwkJaWYgKGxlbnNbbGFzdF0gJiYgIXN0cm5jbXAocHRuYW1lc1tsYXN0XSwgcHRuYW1lLCBsZW5zW2xhc3RdKSkgeworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHBuZXh0LCAmY2FjaGUtPmJpY19kZXZzKSB7CisJCQkJYmxraWRfZGV2IHRtcDsKKworCQkJCS8qIGZpbmQgYmxraWQgZGV2IGZvciB0aGUgd2hvbGUtZGlzayBkZXZubyAqLworCQkJCXRtcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYsCisJCQkJCQkgYmlkX2RldnMpOworCQkJCWlmICh0bXAtPmJpZF9kZXZubyA9PSBkZXZzW2xhc3RdKSB7CisJCQkJCURCRyhERUJVR19ERVZOQU1FLAorCQkJCQkJcHJpbnRmKCJmcmVlaW5nICVzXG4iLAorCQkJCQkJICAgICAgIHRtcC0+YmlkX25hbWUpKTsKKwkJCQkJYmxraWRfZnJlZV9kZXYodG1wKTsKKwkJCQkJY2FjaGUtPmJpY19mbGFncyB8PSBCTEtJRF9CSUNfRkxfQ0hBTkdFRDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJbGVuc1tsYXN0XSA9IDA7CisJCX0KKwkJLyoKKwkJICogSWYgbGFzdCB3YXMgbm90IGNoZWNrZWQgYmVjYXVzZSBpdCBsb29rZWQgbGlrZSBhIHdob2xlLWRpc2sKKwkJICogZGV2LCBhbmQgdGhlIGRldmljZSdzIGJhc2UgbmFtZSBoYXMgY2hhbmdlZCwKKwkJICogY2hlY2sgbGFzdCBhcyB3ZWxsLgorCQkgKi8KKwkJaWYgKGxlbnNbbGFzdF0gJiYgc3RybmNtcChwdG5hbWVzW2xhc3RdLCBwdG5hbWUsIGxlbnNbbGFzdF0pKSB7CisJCQlEQkcoREVCVUdfREVWTkFNRSwKKwkJCSAgICBwcmludGYoIndob2xlIGRldiAlcywgZGV2bm8gMHglMDRYXG4iLAorCQkJCSAgIHB0bmFtZXNbbGFzdF0sICh1bnNpZ25lZCBpbnQpIGRldnNbbGFzdF0pKTsKKwkJCXByb2JlX29uZShjYWNoZSwgcHRuYW1lc1tsYXN0XSwgZGV2c1tsYXN0XSwgMCwKKwkJCQkgIG9ubHlfaWZfbmV3KTsKKwkJCWxlbnNbbGFzdF0gPSAwOworCQl9CisJfQorCisJLyogSGFuZGxlIHRoZSBsYXN0IGRldmljZSBpZiBpdCB3YXNuJ3QgcGFydGl0aW9uZWQgKi8KKwlpZiAobGVuc1t3aGljaF0pCisJCXByb2JlX29uZShjYWNoZSwgcHRuYW1lLCBkZXZzW3doaWNoXSwgMCwgb25seV9pZl9uZXcpOworCisJZmNsb3NlKHByb2MpOworCWJsa2lkX2ZsdXNoX2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJsa2lkX3Byb2JlX2FsbChibGtpZF9jYWNoZSBjYWNoZSkKK3sKKwlpbnQgcmV0OworCisJREJHKERFQlVHX1BST0JFLCBwcmludGYoIkJlZ2luIGJsa2lkX3Byb2JlX2FsbCgpXG4iKSk7CisJcmV0ID0gcHJvYmVfYWxsKGNhY2hlLCAwKTsKKwljYWNoZS0+YmljX3RpbWUgPSB0aW1lKDApOworCWNhY2hlLT5iaWNfZmxhZ3MgfD0gQkxLSURfQklDX0ZMX1BST0JFRDsKKwlEQkcoREVCVUdfUFJPQkUsIHByaW50ZigiRW5kIGJsa2lkX3Byb2JlX2FsbCgpXG4iKSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGJsa2lkX3Byb2JlX2FsbF9uZXcoYmxraWRfY2FjaGUgY2FjaGUpCit7CisJaW50IHJldDsKKworCURCRyhERUJVR19QUk9CRSwgcHJpbnRmKCJCZWdpbiBibGtpZF9wcm9iZV9hbGxfbmV3KClcbiIpKTsKKwlyZXQgPSBwcm9iZV9hbGwoY2FjaGUsIDEpOworCURCRyhERUJVR19QUk9CRSwgcHJpbnRmKCJFbmQgYmxraWRfcHJvYmVfYWxsX25ldygpXG4iKSk7CisJcmV0dXJuIHJldDsKK30KKworCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxraWRfY2FjaGUgY2FjaGUgPSBOVUxMOworCWludCByZXQ7CisKKwlibGtpZF9kZWJ1Z19tYXNrID0gREVCVUdfQUxMOworCWlmIChhcmdjICE9IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXNcbiIKKwkJCSJQcm9iZSBhbGwgZGV2aWNlcyBhbmQgZXhpdFxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgIi9kZXYvbnVsbCIpKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGNyZWF0aW5nIGNhY2hlICglZClcbiIsCisJCQlhcmd2WzBdLCByZXQpOworCQlleGl0KDEpOworCX0KKwlpZiAoYmxraWRfcHJvYmVfYWxsKGNhY2hlKSA8IDApCisJCXByaW50ZigiJXM6IGVycm9yIHByb2JpbmcgZGV2aWNlc1xuIiwgYXJndlswXSk7CisKKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2Rldm5vLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9kZXZuby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjVjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9kZXZuby5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogZGV2bm8uYyAtIGZpbmQgYSBwYXJ0aWN1bGFyIGRldmljZSBieSBpdHMgZGV2aWNlIG51bWJlciAobWFqb3IvbWlub3IpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJsa2lkUC5oIgorCitjaGFyICpibGtpZF9zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIGludCBsZW5ndGgpCit7CisJY2hhciAqcmV0OworCisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghbGVuZ3RoKQorCQlsZW5ndGggPSBzdHJsZW4ocyk7CisKKwlyZXQgPSBtYWxsb2MobGVuZ3RoICsgMSk7CisJaWYgKHJldCkgeworCQlzdHJuY3B5KHJldCwgcywgbGVuZ3RoKTsKKwkJcmV0W2xlbmd0aF0gPSAnXDAnOworCX0KKwlyZXR1cm4gcmV0OworfQorCitjaGFyICpibGtpZF9zdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwlyZXR1cm4gYmxraWRfc3RybmR1cChzLCAwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBlbnRyeSB0byB0aGUgZGlyZWN0b3J5IGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWRkX3RvX2Rpcmxpc3QoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRpcl9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmRwOworCisJZHAgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaXJfbGlzdCkpOworCWlmICghZHApCisJCXJldHVybjsKKwlkcC0+bmFtZSA9IGJsa2lkX3N0cmR1cChuYW1lKTsKKwlpZiAoIWRwLT5uYW1lKSB7CisJCWZyZWUoZHApOworCQlyZXR1cm47CisJfQorCWRwLT5uZXh0ID0gKmxpc3Q7CisJKmxpc3QgPSBkcDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgYSBkaXJlY3RvcnkgbGlzdAorICovCitzdGF0aWMgdm9pZCBmcmVlX2Rpcmxpc3Qoc3RydWN0IGRpcl9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmRwLCAqbmV4dDsKKworCWZvciAoZHAgPSAqbGlzdDsgZHA7IGRwID0gbmV4dCkgeworCQluZXh0ID0gZHAtPm5leHQ7CisJCWZyZWUoZHAtPm5hbWUpOworCQlmcmVlKGRwKTsKKwl9CisJKmxpc3QgPSBOVUxMOworfQorCit2b2lkIGJsa2lkX19zY2FuX2RpcihjaGFyICpkaXJuYW1lLCBkZXZfdCBkZXZubywgc3RydWN0IGRpcl9saXN0ICoqbGlzdCwKKwkJICAgICBjaGFyICoqZGV2bmFtZSkKK3sKKwlESVIJKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkcDsKKwljaGFyCXBhdGhbMTAyNF07CisJaW50CWRpcmxlbjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICgoZGlyID0gb3BlbmRpcihkaXJuYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCWRpcmxlbiA9IHN0cmxlbihkaXJuYW1lKSArIDI7CisJd2hpbGUgKChkcCA9IHJlYWRkaXIoZGlyKSkgIT0gMCkgeworCQlpZiAoZGlybGVuICsgc3RybGVuKGRwLT5kX25hbWUpID49IHNpemVvZihwYXRoKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkcC0+ZF9uYW1lWzBdID09ICcuJyAmJgorCQkgICAgKChkcC0+ZF9uYW1lWzFdID09IDApIHx8CisJCSAgICAgKChkcC0+ZF9uYW1lWzFdID09ICcuJykgJiYgKGRwLT5kX25hbWVbMl0gPT0gMCkpKSkKKwkJCWNvbnRpbnVlOworCisJCXNwcmludGYocGF0aCwgIiVzLyVzIiwgZGlybmFtZSwgZHAtPmRfbmFtZSk7CisJCWlmIChzdGF0KHBhdGgsICZzdCkgPCAwKQorCQkJY29udGludWU7CisKKwkJaWYgKFNfSVNCTEsoc3Quc3RfbW9kZSkgJiYgc3Quc3RfcmRldiA9PSBkZXZubykgeworCQkJKmRldm5hbWUgPSBibGtpZF9zdHJkdXAocGF0aCk7CisJCQlEQkcoREVCVUdfREVWTk8sCisJCQkgICAgcHJpbnRmKCJmb3VuZCAweCVsbHggYXQgJXMgKCVwKVxuIiwgKGxvbmcgbG9uZylkZXZubywKKwkJCQkgICBwYXRoLCAqZGV2bmFtZSkpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxpc3QgJiYgU19JU0RJUihzdC5zdF9tb2RlKSAmJiAhbHN0YXQocGF0aCwgJnN0KSAmJgorCQkgICAgU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCWFkZF90b19kaXJsaXN0KHBhdGgsIGxpc3QpOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybjsKK30KKworLyogRGlyZWN0b3JpZXMgd2hlcmUgd2Ugd2lsbCB0cnkgdG8gc2VhcmNoIGZvciBkZXZpY2UgbnVtYmVycyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRldmRpcnNbXSA9IHsgIi9kZXZpY2VzIiwgIi9kZXZmcyIsICIvZGV2IiwgTlVMTCB9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgcGF0aG5hbWUgdG8gYSBibG9jayBkZXZpY2Ugd2l0aCBhIGdpdmVuCisgKiBkZXZpY2UgbnVtYmVyLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSB0byB0aGUKKyAqIHBhdGhuYW1lIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK2NoYXIgKmJsa2lkX2Rldm5vX3RvX2Rldm5hbWUoZGV2X3QgZGV2bm8pCit7CisJc3RydWN0IGRpcl9saXN0ICpsaXN0ID0gTlVMTCwgKm5ld19saXN0ID0gTlVMTDsKKwljaGFyICpkZXZuYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICoqZGlyOworCisJLyoKKwkgKiBBZGQgdGhlIHN0YXJ0aW5nIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBpbiByZXZlcnNlIG9yZGVyIG9mCisJICogaW1wb3J0YW5jZSwgc2luY2Ugd2UgYXJlIHVzaW5nIGEgc3RhY2suLi4KKwkgKi8KKwlmb3IgKGRpciA9IGRldmRpcnM7ICpkaXI7IGRpcisrKQorCQlhZGRfdG9fZGlybGlzdCgqZGlyLCAmbGlzdCk7CisKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgZGlyX2xpc3QgKmN1cnJlbnQgPSBsaXN0OworCisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlEQkcoREVCVUdfREVWTk8sIHByaW50ZigiZGlyZWN0b3J5ICVzXG4iLCBjdXJyZW50LT5uYW1lKSk7CisJCWJsa2lkX19zY2FuX2RpcihjdXJyZW50LT5uYW1lLCBkZXZubywgJm5ld19saXN0LCAmZGV2bmFtZSk7CisJCWZyZWUoY3VycmVudC0+bmFtZSk7CisJCWZyZWUoY3VycmVudCk7CisJCWlmIChkZXZuYW1lKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIHdlJ3JlIGRvbmUgY2hlY2tpbmcgYXQgdGhpcyBsZXZlbCwgZGVzY2VuZCB0bworCQkgKiB0aGUgbmV4dCBsZXZlbCBvZiBzdWJkaXJlY3Rvcmllcy4gKGJyZWFkdGgtZmlyc3QpCisJCSAqLworCQlpZiAobGlzdCA9PSBOVUxMKSB7CisJCQlsaXN0ID0gbmV3X2xpc3Q7CisJCQluZXdfbGlzdCA9IE5VTEw7CisJCX0KKwl9CisJZnJlZV9kaXJsaXN0KCZsaXN0KTsKKwlmcmVlX2Rpcmxpc3QoJm5ld19saXN0KTsKKworCWlmICghZGV2bmFtZSkgeworCQlEQkcoREVCVUdfREVWTk8sCisJCSAgICBwcmludGYoImJsa2lkOiBjb3VsZG4ndCBmaW5kIGRldm5vIDB4JTA0bHhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZykgZGV2bm8pKTsKKwl9IGVsc2UgeworCQlEQkcoREVCVUdfREVWTk8sCisJCSAgICBwcmludGYoImZvdW5kIGRldm5vIDB4JTA0bGx4IGFzICVzXG4iLCAobG9uZyBsb25nKWRldm5vLCBkZXZuYW1lKSk7CisJfQorCisKKwlyZXR1cm4gZGV2bmFtZTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCWNoYXIJKmRldm5hbWUsICp0bXA7CisJaW50CW1ham9yLCBtaW5vcjsKKwlkZXZfdAlkZXZubzsKKwljb25zdCBjaGFyICplcnJtc2cgPSAiQ291bGRuJ3QgcGFyc2UgJXM6ICVzXG4iOworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoKGFyZ2MgIT0gMikgJiYgKGFyZ2MgIT0gMykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTpcdCVzIGRldmljZV9udW1iZXJcblx0JXMgbWFqb3IgbWlub3JcbiIKKwkJCSJSZXNvbHZlIGEgZGV2aWNlIG51bWJlciB0byBhIGRldmljZSBuYW1lXG4iLAorCQkJYXJndlswXSwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChhcmdjID09IDIpIHsKKwkJZGV2bm8gPSBzdHJ0b3VsKGFyZ3ZbMV0sICZ0bXAsIDApOworCQlpZiAoKnRtcCkgeworCQkJZnByaW50ZihzdGRlcnIsIGVycm1zZywgImRldmljZSBudW1iZXIiLCBhcmd2WzFdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IGVsc2UgeworCQltYWpvciA9IHN0cnRvdWwoYXJndlsxXSwgJnRtcCwgMCk7CisJCWlmICgqdG1wKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgZXJybXNnLCAibWFqb3IgbnVtYmVyIiwgYXJndlsxXSk7CisJCQlleGl0KDEpOworCQl9CisJCW1pbm9yID0gc3RydG91bChhcmd2WzJdLCAmdG1wLCAwKTsKKwkJaWYgKCp0bXApIHsKKwkJCWZwcmludGYoc3RkZXJyLCBlcnJtc2csICJtaW5vciBudW1iZXIiLCBhcmd2WzJdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJZGV2bm8gPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJfQorCXByaW50ZigiTG9va2luZyBmb3IgZGV2aWNlIDB4JTA0bGx4XG4iLCAobG9uZyBsb25nKWRldm5vKTsKKwlkZXZuYW1lID0gYmxraWRfZGV2bm9fdG9fZGV2bmFtZShkZXZubyk7CisJZnJlZShkZXZuYW1lKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvZ2V0c2l6ZS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvZ2V0c2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmE3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9nZXRzaXplLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBnZXRzaXplLmMgLS0tIGdldCB0aGUgc2l6ZSBvZiBhIHBhcnRpdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UKKyNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQorCisvKiBpbmNsdWRlIHRoaXMgYmVmb3JlIHN5cy9xdWV1ZXMuaCEgKi8KKyNpbmNsdWRlICJibGtpZFAuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9MSU5VWF9GRF9ICisjaW5jbHVkZSA8bGludXgvZmQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0RJU0tMQUJFTF9ICisjaW5jbHVkZSA8c3lzL2Rpc2tsYWJlbC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfRElTS19ICisjaWZkZWYgSEFWRV9TWVNfUVVFVUVfSAorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPiAvKiBmb3IgTElTVF9IRUFEICovCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvZGlzay5oPgorI2VuZGlmCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX0lPKSAmJiAhZGVmaW5lZChCTEtHRVRTSVpFKQorI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KQkvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX0lPUikgJiYgIWRlZmluZWQoQkxLR0VUU0laRTY0KQorI2RlZmluZSBCTEtHRVRTSVpFNjQgX0lPUigweDEyLDExNCxzaXplX3QpCS8qIHJldHVybiBkZXZpY2Ugc2l6ZSBpbiBieXRlcyAodTY0ICphcmcpICovCisjZW5kaWYKKworI2lmZGVmIEFQUExFX0RBUldJTgorI2RlZmluZSBCTEtHRVRTSVpFIERLSU9DR0VUQkxPQ0tDT1VOVDMyCisjZW5kaWYgLyogQVBQTEVfREFSV0lOICovCisKK3N0YXRpYyBpbnQgdmFsaWRfb2Zmc2V0KGludCBmZCwgYmxraWRfbG9mZl90IG9mZnNldCkKK3sKKwljaGFyIGNoOworCisJaWYgKGJsa2lkX2xsc2VlayhmZCwgb2Zmc2V0LCAwKSA8IDApCisJCXJldHVybiAwOworCWlmIChyZWFkKGZkLCAmY2gsIDEpIDwgMSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBwYXJ0aXRpb24KKyAqLworYmxraWRfbG9mZl90IGJsa2lkX2dldF9kZXZfc2l6ZShpbnQgZmQpCit7CisJaW50IHZhbGlkX2Jsa2dldHNpemU2NCA9IDE7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0IAkJdXRzbmFtZSB1dDsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplNjQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWJsa2lkX2xvZmZfdCBoaWdoLCBsb3c7CisjaWZkZWYgRkRHRVRQUk0KKwlzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB0aGlzX2Zsb3BweTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0RJU0tMQUJFTF9ICisJaW50IHBhcnQgPSAtMTsKKwlzdHJ1Y3QgZGlza2xhYmVsIGxhYjsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwcDsKKwljaGFyIGNoOworCXN0cnVjdCBzdGF0IHN0OworI2VuZGlmIC8qIEhBVkVfU1lTX0RJU0tMQUJFTF9IICovCisKKyNpZmRlZiBES0lPQ0dFVEJMT0NLQ09VTlQJLyogRm9yIEFwcGxlIERhcndpbiAqLworCWlmIChpb2N0bChmZCwgREtJT0NHRVRCTE9DS0NPVU5ULCAmc2l6ZTY0KSA+PSAwKSB7CisJCWlmICgoc2l6ZW9mKGJsa2lkX2xvZmZfdCkgPCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSkKKwkJICAgICYmIChzaXplNjQgPDwgOSA+IDB4RkZGRkZGRkYpKQorCQkJcmV0dXJuIDA7IC8qIEVGQklHICovCisJCXJldHVybiAoYmxraWRfbG9mZl90KSBzaXplNjQgPDwgOTsKKwl9CisjZW5kaWYKKworI2lmZGVmIEJMS0dFVFNJWkU2NAorI2lmZGVmIF9fbGludXhfXworCWlmICgodW5hbWUoJnV0KSA9PSAwKSAmJgorCSAgICAoKHV0LnJlbGVhc2VbMF0gPT0gJzInKSAmJiAodXQucmVsZWFzZVsxXSA9PSAnLicpICYmCisJICAgICAodXQucmVsZWFzZVsyXSA8ICc2JykgJiYgKHV0LnJlbGVhc2VbM10gPT0gJy4nKSkpCisJCXZhbGlkX2Jsa2dldHNpemU2NCA9IDA7CisjZW5kaWYKKwlpZiAodmFsaWRfYmxrZ2V0c2l6ZTY0ICYmCisJICAgIGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsICZzaXplNjQpID49IDApIHsKKwkJaWYgKChzaXplb2YoYmxraWRfbG9mZl90KSA8IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKQorCQkgICAgJiYgKChzaXplNjQpID4gMHhGRkZGRkZGRikpCisJCQlyZXR1cm4gMDsgLyogRUZCSUcgKi8KKwkJcmV0dXJuIHNpemU2NDsKKwl9CisjZW5kaWYKKworI2lmZGVmIEJMS0dFVFNJWkUKKwlpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkUsICZzaXplKSA+PSAwKQorCQlyZXR1cm4gKGJsa2lkX2xvZmZfdClzaXplIDw8IDk7CisjZW5kaWYKKworLyogdGVzdGVkIG9uIEZyZWVCU0QgNi4xLVJFTEVBU0UgaTM4NiAqLworI2lmZGVmIERJT0NHTUVESUFTSVpFCisJaWYgKGlvY3RsKGZkLCBESU9DR01FRElBU0laRSwgJnNpemU2NCkgPj0gMCkKKwkJcmV0dXJuIChvZmZfdClzaXplNjQ7CisjZW5kaWYgLyogRElPQ0dNRURJQVNJWkUgKi8KKworI2lmZGVmIEZER0VUUFJNCisJaWYgKGlvY3RsKGZkLCBGREdFVFBSTSwgJnRoaXNfZmxvcHB5KSA+PSAwKQorCQlyZXR1cm4gKGJsa2lkX2xvZmZfdCl0aGlzX2Zsb3BweS5zaXplIDw8IDk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19ESVNLTEFCRUxfSAorCS8qCisJICogVGhpcyBjb2RlIHdvcmtzIGZvciBGcmVlQlNEIDQuMTEgaTM4NiwgZXhjZXB0IGZvciB0aGUgZnVsbCBkZXZpY2UKKwkgKiAoc3VjaCBhcyAvZGV2L2FkMCkuIEl0IGRvZXNuJ3Qgd29yayBwcm9wZXJseSBmb3IgbmV3ZXIgRnJlZUJTRAorCSAqIHRob3VnaC4gRnJlZUJTRCA+PSA1LjAgc2hvdWxkIGJlIGNvdmVyZWQgYnkgdGhlIERJT0NHTUVESUFTSVpFCisJICogYWJvdmUgaG93ZXZlci4KKwkgKgorCSAqIE5vdGUgdGhhdCBGcmVlQlNEID49IDQuMCBoYXMgZGlzayBkZXZpY2VzIGFzIHVuYnVmZmVyZWQgKHJhdywKKwkgKiBjaGFyYWN0ZXIpIGRldmljZXMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIFNfSVNDSFIsIHRvby4KKwkgKi8KKwlpZiAoKGZzdGF0KGZkLCAmc3QpID49IDApICYmIChTX0lTQkxLKHN0LnN0X21vZGUpIHx8IFNfSVNDSFIoc3Quc3RfbW9kZSkpKQorCQlwYXJ0ID0gc3Quc3RfcmRldiAmIDc7CisJaWYgKHBhcnQgPj0gMCAmJiAoaW9jdGwoZmQsIERJT0NHRElORk8sIChjaGFyICopJmxhYikgPj0gMCkpIHsKKwkJcHAgPSAmbGFiLmRfcGFydGl0aW9uc1twYXJ0XTsKKwkJaWYgKHBwLT5wX3NpemUpCisJCQlyZXR1cm4gcHAtPnBfc2l6ZSA8PCA5OworCX0KKyNlbmRpZiAvKiBIQVZFX1NZU19ESVNLTEFCRUxfSCAqLworCXsKKyNpZmRlZiBIQVZFX0ZTVEFUNjQKKwkJc3RydWN0IHN0YXQ2NCAgIHN0OworCQlpZiAoZnN0YXQ2NChmZCwgJnN0KSA9PSAwKQorI2Vsc2UKKwkJc3RydWN0IHN0YXQJc3Q7CisJCWlmIChmc3RhdChmZCwgJnN0KSA9PSAwKQorI2VuZGlmCisJCQlpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJCQlyZXR1cm4gc3Quc3Rfc2l6ZTsKKwl9CisKKworCS8qCisJICogT0ssIHdlIGNvdWxkbid0IGZpZ3VyZSBpdCBvdXQgYnkgdXNpbmcgYSBzcGVjaWFsaXplZCBpb2N0bCwKKwkgKiB3aGljaCBpcyBnZW5lcmFsbHkgdGhlIGJlc3Qgd2F5LiAgU28gZG8gYmluYXJ5IHNlYXJjaCB0bworCSAqIGZpbmQgdGhlIHNpemUgb2YgdGhlIHBhcnRpdGlvbi4KKwkgKi8KKwlsb3cgPSAwOworCWZvciAoaGlnaCA9IDEwMjQ7IHZhbGlkX29mZnNldChmZCwgaGlnaCk7IGhpZ2ggKj0gMikKKwkJbG93ID0gaGlnaDsKKwl3aGlsZSAobG93IDwgaGlnaCAtIDEpCisJeworCQljb25zdCBibGtpZF9sb2ZmX3QgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKworCQlpZiAodmFsaWRfb2Zmc2V0KGZkLCBtaWQpKQorCQkJbG93ID0gbWlkOworCQllbHNlCisJCQloaWdoID0gbWlkOworCX0KKwlyZXR1cm4gbG93ICsgMTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWxvbmcgbG9uZyBieXRlczsKKwlpbnQJZmQ7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZGV2aWNlXG4iCisJCQkiRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgZGV2aWNlXG4iLCBhcmd2WzBdKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKChmZCA9IG9wZW4oYXJndlsxXSwgT19SRE9OTFkpKSA8IDApCisJCXBlcnJvcihhcmd2WzBdKTsKKworCWJ5dGVzID0gYmxraWRfZ2V0X2Rldl9zaXplKGZkKTsKKwlwcmludGYoIkRldmljZSAlcyBoYXMgJUxkIDFrIGJsb2Nrcy5cbiIsIGFyZ3ZbMV0sCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJ5dGVzID4+IDEwKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9saWJibGtpZC4zLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvbGliYmxraWQuMy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDI0Y2IxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvbGliYmxraWQuMy5pbgpAQCAtMCwwICsxLDgwIEBACisuXCIgQ29weXJpZ2h0IDIwMDEgQW5kcmVhcyBEaWxnZXIgKGFkaWxnZXJAdHVyYm9saW51eC5jb20pCisuXCIKKy5cIiBUaGlzIG1hbiBwYWdlIHdhcyBjcmVhdGVkIGZvciBsaWJibGtpZC5zby4xLjAgZnJvbSBlMmZzcHJvZ3MtMS4yNC4KKy5cIgorLlwiIFRoaXMgZmlsZSBtYXkgYmUgY29waWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLgorLlwiCisuXCIgQ3JlYXRlZCAgV2VkIFNlcCAxNCAxMjowMjoxMiAyMDAxLCBBbmRyZWFzIERpbGdlcgorLlRIIExJQkJMS0lEIDMgIkBFMkZTUFJPR1NfTU9OVEhAIEBFMkZTUFJPR1NfWUVBUkAiICJFMmZzcHJvZ3MgdmVyc2lvbiBARTJGU1BST0dTX1ZFUlNJT05AIgorLlNIIE5BTUUKK2xpYmJsa2lkIFwtIGJsb2NrIGRldmljZSBpZGVudGlmaWNhdGlvbiBsaWJyYXJ5CisuU0ggU1lOT1BTSVMKKy5CICNpbmNsdWRlIDxibGtpZC9ibGtpZC5oPgorLnNwCisuQiBjYworLkkgZmlsZS5jCisuQiBcLWxibGtpZAorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIGxpYmJsa2lkCitsaWJyYXJ5IGlzIHVzZWQgdG8gaWRlbnRpZnkgYmxvY2sgZGV2aWNlcyAoZGlza3MpIGFzIHRvIHRoZWlyIGNvbnRlbnQgKGUuZy4KK2ZpbGVzeXN0ZW0gdHlwZSkgYXMgd2VsbCBhcyBleHRyYWN0aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcworZmlsZXN5c3RlbSBsYWJlbHMvdm9sdW1lIG5hbWVzLCB1bmlxdWUgaWRlbnRpZmllcnMvc2VyaWFsIG51bWJlcnMsIGV0Yy4KK0EgY29tbW9uIHVzZSBpcyB0byBhbGxvdyB1c2Ugb2YgTEFCRUw9IGFuZCBVVUlEPSB0YWdzIGluc3RlYWQgb2YgaGFyZC1jb2RpbmcKK3NwZWNpZmljIGJsb2NrIGRldmljZSBuYW1lcyBpbnRvIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisuUAorQmxvY2sgZGV2aWNlIGluZm9ybWF0aW9uIGlzIG5vcm1hbGx5IGtlcHQgaW4gYSBjYWNoZSBmaWxlCisuSSAvZXRjL2Jsa2lkLnRhYgorYW5kIGlzIHZlcmlmaWVkIHRvIHN0aWxsIGJlIHZhbGlkIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB0aGUgdXNlcgorKGlmIHRoZSB1c2VyIGhhcyByZWFkIHBlcm1pc3Npb24gb24gdGhlIHJhdyBibG9jayBkZXZpY2UsIG90aGVyd2lzZSBub3QpLgorVGhlIGNhY2hlIGZpbGUgYWxzbyBhbGxvd3MgdW5wcml2aWxlZ2VkIHVzZXJzIChub3JtYWxseSBhbnlvbmUgb3RoZXIKK3RoYW4gcm9vdCwgb3IgdGhvc2Ugbm90IGluIHRoZSAiZGlzayIgZ3JvdXApIHRvIGxvY2F0ZSBkZXZpY2VzIGJ5IGxhYmVsL2lkLgorVGhlIHN0YW5kYXJkIGxvY2F0aW9uIG9mIHRoZSBjYWNoZSBmaWxlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZQorZW52aXJvbm1lbnQgdmFyaWFibGUgQkxLSURfRklMRS4KKy5QCitJbiBzaXR1YXRpb25zIHdoZXJlIG9uZSBpcyBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGtub3duIGRldmljZSwKK2l0IGRvZXMgbm90IGltcGFjdCBwZXJmb3JtYW5jZSB3aGV0aGVyIHRoZSBjYWNoZSBpcyB1c2VkIG9yIG5vdCAodW5sZXNzIHlvdQorYXJlIG5vdCBhYmxlIHRvIHJlYWQgdGhlIGJsb2NrIGRldmljZSBkaXJlY3RseSkuICBJZiB5b3UgYXJlIGRlYWxpbmcgd2l0aAorbXVsdGlwbGUgZGV2aWNlcywgdXNlIG9mIHRoZSBjYWNoZSBpcyBoaWdobHkgcmVjb21tZW5kZWQgKGV2ZW4gaWYgZW1wdHkpIGFzCitkZXZpY2VzIHdpbGwgYmUgc2Nhbm5lZCBhdCBtb3N0IG9uZSB0aW1lIGFuZCB0aGUgb24tZGlzayBjYWNoZSB3aWxsIGJlCit1cGRhdGVkIGlmIHBvc3NpYmxlLiAgVGhlcmUgaXMgcmFyZWx5IGEgcmVhc29uIG5vdCB0byB1c2UgdGhlIGNhY2hlLgorLlAKK0luIHNvbWUgY2FzZXMgKG1vZHVsYXIga2VybmVscyksIGJsb2NrIGRldmljZXMgYXJlIG5vdCBldmVuIHZpc2libGUgdW50aWwKK2FmdGVyIHRoZXkgYXJlIGFjY2Vzc2VkIHRoZSBmaXJzdCB0aW1lLCBzbyBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZXJlIGlzCitzb21lIHdheSB0byBsb2NhdGUgdGhlc2UgZGV2aWNlcyB3aXRob3V0IGVudW1lcmF0aW5nIG9ubHkgdmlzaWJsZSBkZXZpY2VzLAorc28gdGhlIHVzZSBvZiB0aGUgY2FjaGUgZmlsZSBpcworLkIgcmVxdWlyZWQKK2luIHRoaXMgc2l0dWF0aW9uLgorLlNIIEFVVEhPUgorLkIgbGliYmxraWQKK3dhcyB3cml0dGVuIGJ5IEFuZHJlYXMgRGlsZ2VyIGZvciB0aGUgZXh0MiBmaWxlc3lzdGVtIHV0aWx0aWVzLCB3aXRoIGlucHV0Citmcm9tIFRlZCBUcydvLiAgVGhlIGxpYnJhcnkgd2FzIHN1YnNlcXVlbnRseSBoZWF2aWx5IG1vZGlmaWVkIGJ5IFRlZCBUcydvLgorLlNIIEZJTEVTCisuVFAKKy5JIC9ldGMvYmxraWQudGFiCitDYWNoZXMgZGF0YSBleHRyYWN0ZWQgZnJvbSBlYWNoIHJlY29nbml6ZWQgYmxvY2sgZGV2aWNlLgorLlNIIEFWQUlMQUJJTElUWQorLkIgbGliYmxraWQKK2lzIHBhcnQgb2YgdGhlIGUyZnNwcm9ncyBwYWNrYWdlIHNpbmNlIHZlcnNpb24gMS4zMyBhbmQgaXMgYXZhaWxhYmxlIGZyb20KK2h0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LgorLlNIIENPUFlJTkcKKy5CIGxpYmJsa2lkCitpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKSwKK3ZlcnNpb24gMiAob3IgYXQgeW91ciBkaXNjcmV0aW9uIGFueSBsYXRlciB2ZXJzaW9uKS4gIEEgY29weSBvZiB0aGUgTEdQTAorc2hvdWxkIGJlIGluY2x1ZGVkIHdpdGggdGhpcyBsaWJyYXJ5IGluIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisuUlMKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLmJyCis1MSBGcmFua2xpbiBTdAorLmJyCitGaWZ0aCBGbG9vcgorLmJyCitCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKy5SRQorLlBQCitvciB2aXNpdAorLlVSIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0xHUEwKK2h0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0xHUEwKKy5VRQorLlNIICJTRUUgQUxTTyIKKy5CUiBibGtpZCAoOCkKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2xpc3QuaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWNiZmVjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvbGlzdC5oCkBAIC0wLDAgKzEsMTc5IEBACisjaWYgIWRlZmluZWQoX0JMS0lEX0xJU1RfSCkgJiYgIWRlZmluZWQoTElTVF9IRUFEKQorI2RlZmluZSBfQkxLSURfTElTVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9JTkxJTkVfIHN0YXRpYyBfX2lubGluZV9fCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgV2F0Y29tIEMgKi8KKyNkZWZpbmUgX0lOTElORV8gc3RhdGljIGlubGluZQorI2VuZGlmCisKKy8qCisgKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFNvbWUgb2YgdGhlIGludGVybmFsIGZ1bmN0aW9ucyAoIl9feHh4IikgYXJlIHVzZWZ1bCB3aGVuCisgKiBtYW5pcHVsYXRpbmcgd2hvbGUgbGlzdHMgcmF0aGVyIHRoYW4gc2luZ2xlIGVudHJpZXMsIGFzCisgKiBzb21ldGltZXMgd2UgYWxyZWFkeSBrbm93IHRoZSBuZXh0L3ByZXYgZW50cmllcyBhbmQgd2UgY2FuCisgKiBnZW5lcmF0ZSBiZXR0ZXIgY29kZSBieSB1c2luZyB0aGVtIGRpcmVjdGx5IHJhdGhlciB0aGFuCisgKiB1c2luZyB0aGUgZ2VuZXJpYyBzaW5nbGUtZW50cnkgcm91dGluZXMuCisgKi8KKworc3RydWN0IGxpc3RfaGVhZCB7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCisjZGVmaW5lIExJU1RfSEVBRF9JTklUKG5hbWUpIHsgJihuYW1lKSwgJihuYW1lKSB9CisKKyNkZWZpbmUgTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWUgPSBMSVNUX0hFQURfSU5JVChuYW1lKQorCisjZGVmaW5lIElOSVRfTElTVF9IRUFEKHB0cikgZG8geyBcCisJKHB0ciktPm5leHQgPSAocHRyKTsgKHB0ciktPnByZXYgPSAocHRyKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK19JTkxJTkVfIHZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICogYWRkLAorCXN0cnVjdCBsaXN0X2hlYWQgKiBwcmV2LAorCXN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBhZGQ7CisJYWRkLT5uZXh0ID0gbmV4dDsKKwlhZGQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBhZGQ7Cit9CisKKy8qKgorICogbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBhZGQ6CW5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6CWxpc3QgaGVhZCB0byBhZGQgaXQgYWZ0ZXIKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBoZWFkLgorICogVGhpcyBpcyBnb29kIGZvciBpbXBsZW1lbnRpbmcgc3RhY2tzLgorICovCitfSU5MSU5FXyB2b2lkIGxpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKmFkZCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKGFkZCwgaGVhZCwgaGVhZC0+bmV4dCk7Cit9CisKKy8qKgorICogbGlzdF9hZGRfdGFpbCAtIGFkZCBhIG5ldyBlbnRyeQorICogQGFkZDoJbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDoJbGlzdCBoZWFkIHRvIGFkZCBpdCBiZWZvcmUKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgcXVldWVzLgorICovCitfSU5MSU5FXyB2b2lkIGxpc3RfYWRkX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqYWRkLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQoYWRkLCBoZWFkLT5wcmV2LCBoZWFkKTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxpc3QgZW50cnkgYnkgbWFraW5nIHRoZSBwcmV2L25leHQgZW50cmllcworICogcG9pbnQgdG8gZWFjaCBvdGhlci4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitfSU5MSU5FXyB2b2lkIF9fbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICogbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV4dDsKK30KKworLyoqCisgKiBsaXN0X2RlbCAtIGRlbGV0ZXMgZW50cnkgZnJvbSBsaXN0LgorICogQGVudHJ5Ogl0aGUgZWxlbWVudCB0byBkZWxldGUgZnJvbSB0aGUgbGlzdC4KKyAqCisgKiBsaXN0X2VtcHR5KCkgb24gQGVudHJ5IGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsIEBlbnRyeSBpcworICogaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICovCitfSU5MSU5FXyB2b2lkIGxpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKK30KKworLyoqCisgKiBsaXN0X2RlbF9pbml0IC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxpc3QgYW5kIHJlaW5pdGlhbGl6ZSBpdC4KKyAqIEBlbnRyeToJdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKi8KK19JTkxJTkVfIHZvaWQgbGlzdF9kZWxfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xpc3RfZGVsKGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCk7CisJSU5JVF9MSVNUX0hFQUQoZW50cnkpOworfQorCisvKioKKyAqIGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eQorICogQGhlYWQ6CXRoZSBsaXN0IHRvIHRlc3QuCisgKi8KK19JTkxJTkVfIGludCBsaXN0X2VtcHR5KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJcmV0dXJuIGhlYWQtPm5leHQgPT0gaGVhZDsKK30KKworLyoqCisgKiBsaXN0X3NwbGljZSAtIGpvaW4gdHdvIGxpc3RzCisgKiBAbGlzdDoJdGhlIG5ldyBsaXN0IHRvIGFkZC4KKyAqIEBoZWFkOgl0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsaXN0LgorICovCitfSU5MSU5FXyB2b2lkIGxpc3Rfc3BsaWNlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZmlyc3QgPSBsaXN0LT5uZXh0OworCisJaWYgKGZpcnN0ICE9IGxpc3QpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGFzdCA9IGxpc3QtPnByZXY7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmF0ID0gaGVhZC0+bmV4dDsKKworCQlmaXJzdC0+cHJldiA9IGhlYWQ7CisJCWhlYWQtPm5leHQgPSBmaXJzdDsKKworCQlsYXN0LT5uZXh0ID0gYXQ7CisJCWF0LT5wcmV2ID0gbGFzdDsKKwl9Cit9CisKKy8qKgorICogbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgcG9pbnRlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCSgodHlwZSAqKSgoY2hhciAqKShwdHIpLSh1bnNpZ25lZCBsb25nKSgmKCh0eXBlICopMCktPm1lbWJlcikpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2ggLSBpdGVyYXRlIG92ZXIgZWxlbWVudHMgaW4gYSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfc2FmZSAtIGl0ZXJhdGUgb3ZlciBlbGVtZW50cyBpbiBhIGxpc3QsIGJ1dCBkb24ndCBkZXJlZmVyZW5jZQorICogICAgICAgICAgICAgICAgICAgICAgcG9zIGFmdGVyIHRoZSBib2R5IGlzIGRvbmUgKGluIGNhc2UgaXQgaXMgZnJlZWQpCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBuZXh0Ogl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBpdGVtLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QgKG5vdCBpbmNsdWRlZCBpbiBpdGVyYXRpb24pLgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHBuZXh0LCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIHBuZXh0ID0gcG9zLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBcCisJICAgICBwb3MgPSBwbmV4dCwgcG5leHQgPSBwb3MtPm5leHQpCisKKyN1bmRlZiBfSU5MSU5FXworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0JMS0lEX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvbGxzZWVrLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9sbHNlZWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQwZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvbGxzZWVrLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBsbHNlZWsuYyAtLSBzdHViIGNhbGxpbmcgdGhlIGxsc2VlayBzeXN0ZW0gY2FsbAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRQorI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCisKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZmRlZiBfX01TRE9TX18KKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJibGtpZFAuaCIKKworI2lmZGVmIF9fbGludXhfXworCisjaWYgZGVmaW5lZChIQVZFX0xTRUVLNjQpICYmIGRlZmluZWQoSEFWRV9MU0VFSzY0X1BST1RPVFlQRSkKKworI2RlZmluZSBteV9sbHNlZWsgbHNlZWs2NAorCisjZWxpZiBkZWZpbmVkKEhBVkVfTExTRUVLKQorI2luY2x1ZGUgPHN5c2NhbGwuaD4KKworI2lmbmRlZiBIQVZFX0xMU0VFS19QUk9UT1RZUEUKK2V4dGVybiBsb25nIGxvbmcgbGxzZWVrKGludCBmZCwgbG9uZyBsb25nIG9mZnNldCwgaW50IG9yaWdpbik7CisjZW5kaWYKKworI2RlZmluZSBteV9sbHNlZWsgbGxzZWVrCisKKyNlbHNlCS8qICEgSEFWRV9MTFNFRUsgKi8KKworI2lmIFNJWkVPRl9MT05HID09IFNJWkVPRl9MT05HX0xPTkcKKworI2RlZmluZSBsbHNlZWsgbHNlZWsKKworI2Vsc2UgLyogU0laRU9GX0xPTkcgIT0gU0laRU9GX0xPTkdfTE9ORyAqLworCisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKKyNpZm5kZWYgX19OUl9fbGxzZWVrCisjZGVmaW5lIF9fTlJfX2xsc2VlayAgICAgICAgICAgIDE0MAorI2VuZGlmCisKKyNpZm5kZWYgX19pMzg2X18KK3N0YXRpYyBpbnQgX2xsc2Vlayh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJCSAgIGJsa2lkX2xvZmZfdCAqLCB1bnNpZ25lZCBpbnQpOworCitzdGF0aWMgX3N5c2NhbGw1KGludCwgX2xsc2VlaywgdW5zaWduZWQgaW50LCBmZCwgdW5zaWduZWQgbG9uZywgb2Zmc2V0X2hpZ2gsCisJCSB1bnNpZ25lZCBsb25nLCBvZmZzZXRfbG93LCBibGtpZF9sb2ZmX3QgKiwgcmVzdWx0LAorCQkgdW5zaWduZWQgaW50LCBvcmlnaW4pCisjZW5kaWYKKworc3RhdGljIGJsa2lkX2xvZmZfdCBteV9sbHNlZWsoaW50IGZkLCBibGtpZF9sb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQoreworCWJsa2lkX2xvZmZfdCByZXN1bHQ7CisJaW50IHJldHZhbDsKKworI2lmbmRlZiBfX2kzODZfXworCXJldHZhbCA9IF9sbHNlZWsoZmQsICgodW5zaWduZWQgbG9uZyBsb25nKSBvZmZzZXQpID4+IDMyLAorCQkJICgodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCkgJiAweGZmZmZmZmZmLAorCQkJICZyZXN1bHQsIG9yaWdpbik7CisjZWxzZQorCXJldHZhbCA9IHN5c2NhbGwoX19OUl9fbGxzZWVrLCBmZCwgKCh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZnNldCkgPj4gMzIsCisJCQkgKCh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0KSAmIDB4ZmZmZmZmZmYsCisJCQkgJnJlc3VsdCwgb3JpZ2luKTsKKyNlbmRpZgorCXJldHVybiAocmV0dmFsID09IC0xID8gKGJsa2lkX2xvZmZfdCkgcmV0dmFsIDogcmVzdWx0KTsKK30KKworI2VuZGlmCS8qIF9fYWxwaGFfXyB8fCBfX2lhNjRfXyAqLworCisjZW5kaWYgLyogSEFWRV9MTFNFRUsgKi8KKworYmxraWRfbG9mZl90IGJsa2lkX2xsc2VlayhpbnQgZmQsIGJsa2lkX2xvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpCit7CisJYmxraWRfbG9mZl90IHJlc3VsdDsKKwlzdGF0aWMgaW50IGRvX2NvbXBhdCA9IDA7CisKKwlpZiAoKHNpemVvZihvZmZfdCkgPj0gc2l6ZW9mKGJsa2lkX2xvZmZfdCkpIHx8CisJICAgIChvZmZzZXQgPCAoKGJsa2lkX2xvZmZfdCkgMSA8PCAoKHNpemVvZihvZmZfdCkqOCkgLTEpKSkpCisJCXJldHVybiBsc2VlayhmZCwgKG9mZl90KSBvZmZzZXQsIHdoZW5jZSk7CisKKwlpZiAoZG9fY29tcGF0KSB7CisJCWVycm5vID0gRU9WRVJGTE9XOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0ID0gbXlfbGxzZWVrKGZkLCBvZmZzZXQsIHdoZW5jZSk7CisJaWYgKHJlc3VsdCA9PSAtMSAmJiBlcnJubyA9PSBFTk9TWVMpIHsKKwkJLyoKKwkJICogSnVzdCBpbiBjYXNlIHRoaXMgY29kZSBydW5zIG9uIHRvcCBvZiBhbiBvbGQga2VybmVsCisJCSAqIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgdGhlIGxsc2VlayBzeXN0ZW0gY2FsbAorCQkgKi8KKwkJZG9fY29tcGF0Kys7CisJCWVycm5vID0gRU9WRVJGTE9XOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisjZWxzZSAvKiAhbGludXggKi8KKworI2lmbmRlZiBFT1ZFUkZMT1cKKyNpZmRlZiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQKKyNkZWZpbmUgRU9WRVJGTE9XIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVAorI2Vsc2UKKyNkZWZpbmUgRU9WRVJGTE9XIDExMgorI2VuZGlmCisjZW5kaWYKKworYmxraWRfbG9mZl90IGJsa2lkX2xsc2VlayhpbnQgZmQsIGJsa2lkX2xvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisjaWYgZGVmaW5lZChIQVZFX0xTRUVLNjQpICYmIGRlZmluZWQoSEFWRV9MU0VFSzY0X1BST1RPVFlQRSkKKwlyZXR1cm4gbHNlZWs2NCAoZmQsIG9mZnNldCwgb3JpZ2luKTsKKyNlbHNlCisJaWYgKChzaXplb2Yob2ZmX3QpIDwgc2l6ZW9mKGJsa2lkX2xvZmZfdCkpICYmCisJICAgIChvZmZzZXQgPj0gKChibGtpZF9sb2ZmX3QpIDEgPDwgKChzaXplb2Yob2ZmX3QpKjgpIC0gMSkpKSkgeworCQllcnJubyA9IEVPVkVSRkxPVzsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gbHNlZWsoZmQsIChvZmZfdCkgb2Zmc2V0LCBvcmlnaW4pOworI2VuZGlmCit9CisKKyNlbmRpZgkvKiBsaW51eCAqLworCisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Byb2JlLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9wcm9iZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzU3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9wcm9iZS5jCkBAIC0wLDAgKzEsMTY3NyBAQAorLyoKKyAqIHByb2JlLmMgLSBpZGVudGlmeSBhIGJsb2NrIGRldmljZSBieSBpdHMgY29udGVudHMsIGFuZCByZXR1cm4gYSBkZXYKKyAqICAgICAgICAgICBzdHJ1Y3Qgd2l0aCB0aGUgZGV0YWlscworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBBbmRyaWVzIEJyb3V3ZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMyBieSBUaGVvZG9yZSBUcydvCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX01LREVWX0gKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSAiYmxraWRQLmgiCisjaW5jbHVkZSAidXVpZC91dWlkLmgiCisjaW5jbHVkZSAicHJvYmUuaCIKKworc3RhdGljIGludCBmaWd1cmVfbGFiZWxfbGVuKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxhYmVsLCBpbnQgbGVuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCA9IGxhYmVsICsgbGVuIC0gMTsKKworCXdoaWxlICgoKmVuZCA9PSAnICcgfHwgKmVuZCA9PSAwKSAmJiBlbmQgPj0gbGFiZWwpCisJCS0tZW5kOworCWlmIChlbmQgPj0gbGFiZWwpIHsKKwkJbGFiZWwgPSBsYWJlbDsKKwkJcmV0dXJuIGVuZCAtIGxhYmVsICsgMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpnZXRfYnVmZmVyKHN0cnVjdCBibGtpZF9wcm9iZSAqcHIsCisJCQkgIGJsa2lkX2xvZmZfdCBvZmYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdAkJcmV0X3JlYWQ7CisJdW5zaWduZWQgY2hhcgkqbmV3YnVmOworCisJaWYgKG9mZiArIGxlbiA8PSBTQl9CVUZGRVJfU0laRSkgeworCQlpZiAoIXByLT5zYmJ1ZikgeworCQkJcHItPnNiYnVmID0gbWFsbG9jKFNCX0JVRkZFUl9TSVpFKTsKKwkJCWlmICghcHItPnNiYnVmKQorCQkJCXJldHVybiBOVUxMOworCQkJaWYgKGxzZWVrKHByLT5mZCwgMCwgU0VFS19TRVQpIDwgMCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXJldF9yZWFkID0gcmVhZChwci0+ZmQsIHByLT5zYmJ1ZiwgU0JfQlVGRkVSX1NJWkUpOworCQkJaWYgKHJldF9yZWFkIDwgMCkKKwkJCQlyZXRfcmVhZCA9IDA7CisJCQlwci0+c2JfdmFsaWQgPSByZXRfcmVhZDsKKwkJfQorCQlpZiAob2ZmK2xlbiA+IHByLT5zYl92YWxpZCkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gcHItPnNiYnVmICsgb2ZmOworCX0gZWxzZSB7CisJCWlmIChsZW4gPiBwci0+YnVmX21heCkgeworCQkJbmV3YnVmID0gcmVhbGxvYyhwci0+YnVmLCBsZW4pOworCQkJaWYgKG5ld2J1ZiA9PSBOVUxMKQorCQkJCXJldHVybiBOVUxMOworCQkJcHItPmJ1ZiA9IG5ld2J1ZjsKKwkJCXByLT5idWZfbWF4ID0gbGVuOworCQl9CisJCWlmIChibGtpZF9sbHNlZWsocHItPmZkLCBvZmYsIFNFRUtfU0VUKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJcmV0X3JlYWQgPSByZWFkKHByLT5mZCwgcHItPmJ1ZiwgbGVuKTsKKwkJaWYgKHJldF9yZWFkICE9IChzc2l6ZV90KSBsZW4pCisJCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIHByLT5idWY7CisJfQorfQorCisKKy8qCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGNvZGUgdG8gY2hlY2sgZm9yIGFuIE1EUkFJRCBkZXZpY2UuICBXZSBkbworICogdGhpcyBzcGVjaWFsIHNpbmNlIGl0IHJlcXVpcmVzIGNoZWNraW5nIGZvciBhIHN1cGVyYmxvY2sgYXQgdGhlIGVuZAorICogb2YgdGhlIGRldmljZS4KKyAqLworc3RhdGljIGludCBjaGVja19tZHJhaWQoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpyZXRfdXVpZCkKK3sKKwlzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfcyAqbWQ7CisJYmxraWRfbG9mZl90CQlvZmZzZXQ7CisJY2hhcgkJCWJ1Zls0MDk2XTsKKworCWlmIChmZCA8IDApCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJb2Zmc2V0ID0gKGJsa2lkX2dldF9kZXZfc2l6ZShmZCkgJiB+KChibGtpZF9sb2ZmX3QpNjU1MzUpKSAtIDY1NTM2OworCisJaWYgKGJsa2lkX2xsc2VlayhmZCwgb2Zmc2V0LCAwKSA8IDAgfHwKKwkgICAgcmVhZChmZCwgYnVmLCA0MDk2KSAhPSA0MDk2KQorCQlyZXR1cm4gLUJMS0lEX0VSUl9JTzsKKworCS8qIENoZWNrIGZvciBtYWdpYyBudW1iZXIgKi8KKwlpZiAobWVtY21wKCJcMjUxK05cMzc0IiwgYnVmLCA0KSAmJiBtZW1jbXAoIlwzNzROK1wyNTEiLCBidWYsIDQpKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWlmICghcmV0X3V1aWQpCisJCXJldHVybiAwOworCSpyZXRfdXVpZCA9IDA7CisKKwkvKiBUaGUgTUQgVVVJRCBpcyBub3QgY29udGlndW91cyBpbiB0aGUgc3VwZXJibG9jaywgbWFrZSBpdCBzbyAqLworCW1kID0gKHN0cnVjdCBtZHBfc3VwZXJibG9ja19zICopYnVmOworCWlmIChtZC0+c2V0X3V1aWQwIHx8IG1kLT5zZXRfdXVpZDEgfHwgbWQtPnNldF91dWlkMiB8fCBtZC0+c2V0X3V1aWQzKSB7CisJCW1lbWNweShyZXRfdXVpZCwgJm1kLT5zZXRfdXVpZDAsIDQpOworCQltZW1jcHkocmV0X3V1aWQgKyA0LCAmbWQtPnNldF91dWlkMSwgMTIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3V1aWQoYmxraWRfZGV2IGRldiwgdXVpZF90IHV1aWQsIGNvbnN0IGNoYXIgKnRhZykKK3sKKwljaGFyCXN0clszN107CisKKwlpZiAoIXV1aWRfaXNfbnVsbCh1dWlkKSkgeworCQl1dWlkX3VucGFyc2UodXVpZCwgc3RyKTsKKwkJYmxraWRfc2V0X3RhZyhkZXYsIHRhZyA/IHRhZyA6ICJVVUlEIiwgc3RyLCBzaXplb2Yoc3RyKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfZXh0Ml9pbmZvKGJsa2lkX2RldiBkZXYsIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQsCisJCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKikgYnVmOworCWNvbnN0IGNoYXIgKmxhYmVsID0gMDsKKworCURCRyhERUJVR19QUk9CRSwgcHJpbnRmKCJleHQyX3NiLmNvbXBhdCA9ICUwOFg6JTA4WDolMDhYXG4iLAorCQkgICBibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfY29tcGF0KSwKKwkJICAgYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX2luY29tcGF0KSwKKwkJICAgYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX3JvX2NvbXBhdCkpKTsKKworCWlmIChzdHJsZW4oZXMtPnNfdm9sdW1lX25hbWUpKQorCQlsYWJlbCA9IGVzLT5zX3ZvbHVtZV9uYW1lOworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBsYWJlbCwgc2l6ZW9mKGVzLT5zX3ZvbHVtZV9uYW1lKSk7CisKKwlzZXRfdXVpZChkZXYsIGVzLT5zX3V1aWQsIDApOworCisJaWYgKChlcy0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpICYmCisJICAgICF1dWlkX2lzX251bGwoZXMtPnNfam91cm5hbF91dWlkKSkKKwkJc2V0X3V1aWQoZGV2LCBlcy0+c19qb3VybmFsX3V1aWQsICJFWFRfSk9VUk5BTCIpOworCisJaWYgKHN0cmNtcChpZC0+YmltX3R5cGUsICJleHQyIikgJiYKKwkgICAgKChibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgICBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfVU5TVVBQT1JURUQpID09IDApKQorCQlibGtpZF9zZXRfdGFnKGRldiwgIlNFQ19UWVBFIiwgImV4dDIiLCBzaXplb2YoImV4dDIiKSk7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgYSBmaWxlc3lzdGVtIGlzIGluIC9wcm9jL2ZpbGVzeXN0ZW1zLgorICogUmV0dXJucyAxIGlmIGZvdW5kLCAwIGlmIG5vdAorICovCitzdGF0aWMgaW50IGZzX3Byb2NfY2hlY2soY29uc3QgY2hhciAqZnNfbmFtZSkKK3sKKwlGSUxFCSpmOworCWNoYXIJYnVmWzgwXSwgKmNwLCAqdDsKKworCWYgPSBmb3BlbigiL3Byb2MvZmlsZXN5c3RlbXMiLCAiciIpOworCWlmICghZikKKwkJcmV0dXJuICgwKTsKKwl3aGlsZSAoIWZlb2YoZikpIHsKKwkJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkKKwkJCWJyZWFrOworCQljcCA9IGJ1ZjsKKwkJaWYgKCFpc3NwYWNlKCpjcCkpIHsKKwkJCXdoaWxlICgqY3AgJiYgIWlzc3BhY2UoKmNwKSkKKwkJCQljcCsrOworCQl9CisJCXdoaWxlICgqY3AgJiYgaXNzcGFjZSgqY3ApKQorCQkJY3ArKzsKKwkJaWYgKCh0ID0gc3RyY2hyKGNwLCAnXG4nKSkgIT0gTlVMTCkKKwkJCSp0ID0gMDsKKwkJaWYgKCh0ID0gc3RyY2hyKGNwLCAnXHQnKSkgIT0gTlVMTCkKKwkJCSp0ID0gMDsKKwkJaWYgKCh0ID0gc3RyY2hyKGNwLCAnICcpKSAhPSBOVUxMKQorCQkJKnQgPSAwOworCQlpZiAoIXN0cmNtcChmc19uYW1lLCBjcCkpIHsKKwkJCWZjbG9zZShmKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJZmNsb3NlKGYpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgYSBmaWxlc3lzdGVtIGlzIGF2YWlsYWJsZSBhcyBhIG1vZHVsZQorICogUmV0dXJucyAxIGlmIGZvdW5kLCAwIGlmIG5vdAorICovCitzdGF0aWMgaW50IGNoZWNrX2Zvcl9tb2R1bGVzKGNvbnN0IGNoYXIgKmZzX25hbWUpCit7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0IHV0c25hbWUJdXRzOworCUZJTEUJCSpmOworCWNoYXIJCWJ1ZlsxMDI0XSwgKmNwOworCWludAkJbmFtZXN6OworCisJaWYgKHVuYW1lKCZ1dHMpKQorCQlyZXR1cm4gKDApOworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIvbGliL21vZHVsZXMvJXMvbW9kdWxlcy5kZXAiLCB1dHMucmVsZWFzZSk7CisKKwlmID0gZm9wZW4oYnVmLCAiciIpOworCWlmICghZikKKwkJcmV0dXJuICgwKTsKKworCW5hbWVzeiA9IHN0cmxlbihmc19uYW1lKTsKKworCXdoaWxlICghZmVvZihmKSkgeworCQlpZiAoIWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKQorCQkJYnJlYWs7CisJCWlmICgoY3AgPSBzdHJjaHIoYnVmLCAnOicpKSAhPSBOVUxMKQorCQkJKmNwID0gMDsKKwkJZWxzZQorCQkJY29udGludWU7CisJCWlmICgoY3AgPSBzdHJyY2hyKGJ1ZiwgJy8nKSkgIT0gTlVMTCkKKwkJCWNwKys7CisJCWVsc2UKKwkJCWNwID0gYnVmOworCQlpZiAoIXN0cm5jbXAoY3AsIGZzX25hbWUsIG5hbWVzeikgJiYKKwkJICAgICghc3RyY21wKGNwICsgbmFtZXN6LCAiLmtvIikgfHwKKwkJICAgICAhc3RyY21wKGNwICsgbmFtZXN6LCAiLmtvLmd6IikpKSB7CisJCQlmY2xvc2UoZik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCWZjbG9zZShmKTsKKyNlbmRpZgorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbGludXhfdmVyc2lvbl9jb2RlKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKwlzdHJ1Y3QgdXRzbmFtZQl1dDsKKwlzdGF0aWMJCXZlcnNpb25fY29kZSA9IC0xOworCWludAkJbWFqb3IsIG1pbm9yLCByZXY7CisJY2hhcgkJKmVuZHB0cjsKKwljb25zdCBjaGFyIAkqY3A7CisKKwlpZiAodmVyc2lvbl9jb2RlID4gMCkKKwkJcmV0dXJuIHZlcnNpb25fY29kZTsKKworCWlmICh1bmFtZSgmdXQpKQorCQlyZXR1cm4gMDsKKwljcCA9IHV0LnJlbGVhc2U7CisKKwltYWpvciA9IHN0cnRvbChjcCwgJmVuZHB0ciwgMTApOworCWlmIChjcCA9PSBlbmRwdHIgfHwgKmVuZHB0ciAhPSAnLicpCisJCXJldHVybiAwOworCWNwID0gZW5kcHRyICsgMTsKKwltaW5vciA9IHN0cnRvbChjcCwgJmVuZHB0ciwgMTApOworCWlmIChjcCA9PSBlbmRwdHIgfHwgKmVuZHB0ciAhPSAnLicpCisJCXJldHVybiAwOworCWNwID0gZW5kcHRyICsgMTsKKwlyZXYgPSBzdHJ0b2woY3AsICZlbmRwdHIsIDEwKTsKKwlpZiAoY3AgPT0gZW5kcHRyKQorCQlyZXR1cm4gMDsKKwl2ZXJzaW9uX2NvZGUgPSAoKChtYWpvciAqIDI1NikgKyBtaW5vcikgKiAyNTYpICsgcmV2OworCXJldHVybiB2ZXJzaW9uX2NvZGU7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKyNkZWZpbmUgRVhUNF9TVVBQT1JUU19FWFQyICgyICogNjU1MzYgKyA2KjI1NiArIDI5KQorCitzdGF0aWMgaW50IHN5c3RlbV9zdXBwb3J0c19leHQyKHZvaWQpCit7CisJc3RhdGljIHRpbWVfdAlsYXN0X2NoZWNrID0gMDsKKwlzdGF0aWMgaW50CXJldCA9IC0xOworCXRpbWVfdAkJbm93ID0gdGltZSgwKTsKKworCWlmIChyZXQgIT0gLTEgfHwgKG5vdyAtIGxhc3RfY2hlY2spIDwgNSkKKwkJcmV0dXJuIHJldDsKKwlsYXN0X2NoZWNrID0gbm93OworCXJldCA9IChmc19wcm9jX2NoZWNrKCJleHQyIikgfHwgY2hlY2tfZm9yX21vZHVsZXMoImV4dDIiKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzeXN0ZW1fc3VwcG9ydHNfZXh0NCh2b2lkKQoreworCXN0YXRpYyB0aW1lX3QJbGFzdF9jaGVjayA9IDA7CisJc3RhdGljIGludAlyZXQgPSAtMTsKKwl0aW1lX3QJCW5vdyA9IHRpbWUoMCk7CisKKwlpZiAocmV0ICE9IC0xIHx8IChub3cgLSBsYXN0X2NoZWNrKSA8IDUpCisJCXJldHVybiByZXQ7CisJbGFzdF9jaGVjayA9IG5vdzsKKwlyZXQgPSAoZnNfcHJvY19jaGVjaygiZXh0NCIpIHx8IGNoZWNrX2Zvcl9tb2R1bGVzKCJleHQ0IikpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3lzdGVtX3N1cHBvcnRzX2V4dDRkZXYodm9pZCkKK3sKKwlzdGF0aWMgdGltZV90CWxhc3RfY2hlY2sgPSAwOworCXN0YXRpYyBpbnQJcmV0ID0gLTE7CisJdGltZV90CQlub3cgPSB0aW1lKDApOworCisJaWYgKHJldCAhPSAtMSB8fCAobm93IC0gbGFzdF9jaGVjaykgPCA1KQorCQlyZXR1cm4gcmV0OworCWxhc3RfY2hlY2sgPSBub3c7CisJcmV0ID0gKGZzX3Byb2NfY2hlY2soImV4dDRkZXYiKSB8fCBjaGVja19mb3JfbW9kdWxlcygiZXh0NGRldiIpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2JlX2V4dDRkZXYoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwKKwkJCSBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkLAorCQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisJZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKilidWY7CisKKwkvKiBEaXN0aW5ndWlzaCBmcm9tIGpiZCAqLworCWlmIChibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCS8qIAorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IGhhdmUgYSBqb3VybmFsIGFuZCBleHQyIGFuZCBleHQ0CisJICogaXMgbm90IHByZXNlbnQsIHRoZW4gZm9yY2UgdGhpcyB0byBiZSBkZXRlY3RlZCBhcyBhbgorCSAqIGV4dDRkZXYgZmlsZXN5c3RlbS4KKwkgKi8KKwlpZiAoIShibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfY29tcGF0KSAmCisJICAgICAgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkgJiYKKwkgICAgIXN5c3RlbV9zdXBwb3J0c19leHQyKCkgJiYgIXN5c3RlbV9zdXBwb3J0c19leHQ0KCkgJiYKKwkgICAgc3lzdGVtX3N1cHBvcnRzX2V4dDRkZXYoKSAmJgorCSAgICBsaW51eF92ZXJzaW9uX2NvZGUoKSA+PSBFWFQ0X1NVUFBPUlRTX0VYVDIpCisJCWdvdG8gZm9yY2VfZXh0NGRldjsKKworCS8qCisJICogSWYgdGhlIGZpbGVzeXN0ZW0gaXMgbWFya2VkIGFzIE9LIGZvciB1c2UgYnkgaW4tZGV2ZWxvcG1lbnQKKwkgKiBmaWxlc3lzdGVtIGNvZGUsIGJ1dCBleHQ0ZGV2IGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCBleHQ0IGlzLAorCSAqIHRoZW4gZG9uJ3QgY2FsbCBvdXJzZWx2ZXMgZXh0NGRldiwgc2luY2Ugd2Ugc2hvdWxkIGJlCisJICogZGV0ZWN0ZWQgYXMgZXh0NCBpbiB0aGF0IGNhc2UuCisJICoKKwkgKiBJZiB0aGUgZmlsZXN5c3RlbSBpcyBtYXJrZWQgYXMgaW4gdXNlIGJ5IHByb2R1Y3Rpb24KKwkgKiBmaWxlc3lzdGVtLCB0aGVuIGl0IGNhbiBvbmx5IGJlIHVzZWQgYnkgZXh0NCBhbmQgTk9UIGJ5CisJICogZXh0NGRldiwgc28gYWx3YXlzIGRpc2NsYWltIHdlIGFyZSBleHQ0ZGV2IGluIHRoYXQgY2FzZS4KKwkgKi8KKwlpZiAoYmxraWRfbGUzMihlcy0+c19mbGFncykgJiBFWFQyX0ZMQUdTX1RFU1RfRklMRVNZUykgeworCQlpZiAoIXN5c3RlbV9zdXBwb3J0c19leHQ0ZGV2KCkgJiYgc3lzdGVtX3N1cHBvcnRzX2V4dDQoKSkKKwkJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCX0gZWxzZQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworZm9yY2VfZXh0NGRldjoKKyAgICAJZ2V0X2V4dDJfaW5mbyhwcm9iZS0+ZGV2LCBpZCwgYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9leHQ0KHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisJZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKilidWY7CisKKwkvKiBEaXN0aW5ndWlzaCBmcm9tIGpiZCAqLworCWlmIChibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCS8qIAorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IGhhdmUgYSBqb3VybmFsIGFuZCBleHQyIGlzIG5vdAorCSAqIHByZXNlbnQsIHRoZW4gZm9yY2UgdGhpcyB0byBiZSBkZXRlY3RlZCBhcyBhbiBleHQyCisJICogZmlsZXN5c3RlbS4KKwkgKi8KKwlpZiAoIShibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfY29tcGF0KSAmCisJICAgICAgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkgJiYKKwkgICAgIXN5c3RlbV9zdXBwb3J0c19leHQyKCkgJiYgc3lzdGVtX3N1cHBvcnRzX2V4dDQoKSAmJgorCSAgICBsaW51eF92ZXJzaW9uX2NvZGUoKSA+PSBFWFQ0X1NVUFBPUlRTX0VYVDIpCisJCWdvdG8gZm9yY2VfZXh0NDsKKworCS8qIEV4dDQgaGFzIGF0IGxlYXN0IG9uZSBmZWF0dXJlIHdoaWNoIGV4dDMgZG9lc24ndCB1bmRlcnN0YW5kICovCisJaWYgKCEoYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX3JvX2NvbXBhdCkgJgorCSAgICAgIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfVU5TVVBQT1JURUQpICYmCisJICAgICEoYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJICAgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1VOU1VQUE9SVEVEKSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKK2ZvcmNlX2V4dDQ6CisJLyoKKwkgKiBJZiB0aGUgZmlsZXN5c3RlbSBpcyBhIE9LIGZvciB1c2UgYnkgaW4tZGV2ZWxvcG1lbnQKKwkgKiBmaWxlc3lzdGVtIGNvZGUsIGFuZCBleHQ0ZGV2IGlzIHN1cHBvcnRlZCBvciBleHQ0IGlzIG5vdAorCSAqIHN1cHBvcnRlZCwgdGhlbiBkb24ndCBjYWxsIG91cnNlbHZlcyBleHQ0LCBzbyB3ZSBjYW4gcmVkbworCSAqIHRoZSBkZXRlY3Rpb24gYW5kIG1hcmsgdGhlIGZpbGVzeXN0ZW0gYXMgZXh0NGRldi4KKwkgKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGlzIG1hcmtlZCBhcyBpbiB1c2UgYnkgcHJvZHVjdGlvbgorCSAqIGZpbGVzeXN0ZW0sIHRoZW4gaXQgY2FuIG9ubHkgYmUgdXNlZCBieSBleHQ0IGFuZCBOT1QgYnkKKwkgKiBleHQ0ZGV2LgorCSAqLworCWlmIChibGtpZF9sZTMyKGVzLT5zX2ZsYWdzKSAmIEVYVDJfRkxBR1NfVEVTVF9GSUxFU1lTKSB7CisJCWlmIChzeXN0ZW1fc3VwcG9ydHNfZXh0NGRldigpIHx8ICFzeXN0ZW1fc3VwcG9ydHNfZXh0NCgpKQorCQkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisJfQorICAgIAlnZXRfZXh0Ml9pbmZvKHByb2JlLT5kZXYsIGlkLCBidWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX2V4dDMoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwgc3RydWN0IGJsa2lkX21hZ2ljICppZCwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplczsKKwllcyA9IChzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCS8qIGV4dDMgcmVxdWlyZXMgam91cm5hbCAqLworCWlmICghKGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9jb21wYXQpICYKKwkgICAgICBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwkvKiBBbnkgZmVhdHVyZXMgd2hpY2ggZXh0MyBkb2Vzbid0IHVuZGVyc3RhbmQgKi8KKwlpZiAoKGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9yb19jb21wYXQpICYKKwkgICAgIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfVU5TVVBQT1JURUQpIHx8CisJICAgIChibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9VTlNVUFBPUlRFRCkpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisgICAgCWdldF9leHQyX2luZm8ocHJvYmUtPmRldiwgaWQsIGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfZXh0MihzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzOworCisJZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKilidWY7CisKKwkvKiBEaXN0aW5ndWlzaCBiZXR3ZWVuIGV4dDMgYW5kIGV4dDIgKi8KKwlpZiAoKGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9jb21wYXQpICYKKwkgICAgICBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwkvKiBBbnkgZmVhdHVyZXMgd2hpY2ggZXh0MiBkb2Vzbid0IHVuZGVyc3RhbmQgKi8KKwlpZiAoKGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9yb19jb21wYXQpICYKKwkgICAgIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfVU5TVVBQT1JURUQpIHx8CisJICAgIChibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkgICAgIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9VTlNVUFBPUlRFRCkpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJLyogCisJICogSWYgZXh0MiBpcyBub3QgcHJlc2VudCwgYnV0IGV4dDQgb3IgZXh0NGRldiBhcmUsIHRoZW4KKwkgKiBkaXNjbGFpbSB3ZSBhcmUgZXh0MgorCSAqLworCWlmICghc3lzdGVtX3N1cHBvcnRzX2V4dDIoKSAmJgorCSAgICAoc3lzdGVtX3N1cHBvcnRzX2V4dDQoKSB8fCBzeXN0ZW1fc3VwcG9ydHNfZXh0NGRldigpKSAmJgorCSAgICBsaW51eF92ZXJzaW9uX2NvZGUoKSA+PSBFWFQ0X1NVUFBPUlRTX0VYVDIpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJZ2V0X2V4dDJfaW5mbyhwcm9iZS0+ZGV2LCBpZCwgYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9qYmQoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwgc3RydWN0IGJsa2lkX21hZ2ljICppZCwKKwkJICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopIGJ1ZjsKKworCWlmICghKGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCkgJgorCSAgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJZ2V0X2V4dDJfaW5mbyhwcm9iZS0+ZGV2LCBpZCwgYnVmKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEZBVF9BVFRSX1ZPTFVNRV9JRAkJMHgwOAorI2RlZmluZSBGQVRfQVRUUl9ESVIJCQkweDEwCisjZGVmaW5lIEZBVF9BVFRSX0xPTkdfTkFNRQkJMHgwZgorI2RlZmluZSBGQVRfQVRUUl9NQVNLCQkJMHgzZgorI2RlZmluZSBGQVRfRU5UUllfRlJFRQkJCTB4ZTUKKworc3RhdGljIGNvbnN0IGNoYXIgKm5vX25hbWUgPSAiTk8gTkFNRSAgICAiOworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc2VhcmNoX2ZhdF9sYWJlbChzdHJ1Y3QgdmZhdF9kaXJfZW50cnkgKmRpciwgaW50IGNvdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGRpcltpXS5uYW1lWzBdID09IDB4MDApCisJCQlicmVhazsKKworCQlpZiAoKGRpcltpXS5uYW1lWzBdID09IEZBVF9FTlRSWV9GUkVFKSB8fAorCQkgICAgKGRpcltpXS5jbHVzdGVyX2hpZ2ggIT0gMCB8fCBkaXJbaV0uY2x1c3Rlcl9sb3cgIT0gMCkgfHwKKwkJICAgICgoZGlyW2ldLmF0dHIgJiBGQVRfQVRUUl9NQVNLKSA9PSBGQVRfQVRUUl9MT05HX05BTUUpKQorCQkJY29udGludWU7CisKKwkJaWYgKChkaXJbaV0uYXR0ciAmIChGQVRfQVRUUl9WT0xVTUVfSUQgfCBGQVRfQVRUUl9ESVIpKSA9PQorCQkgICAgRkFUX0FUVFJfVk9MVU1FX0lEKSB7CisJCQlyZXR1cm4gZGlyW2ldLm5hbWU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEZBVCBsYWJlbCBleHRyYWN0aW9uIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5IHRha2VuIGZyb20gS2F5CisgKiBTaWV2ZXJzJ3Mgdm9sdW1lX2lkIGxpYnJhcnkgKi8KK3N0YXRpYyBpbnQgcHJvYmVfZmF0KHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCSAgICAgIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCB2ZmF0X3N1cGVyX2Jsb2NrICp2cyA9IChzdHJ1Y3QgdmZhdF9zdXBlcl9ibG9jayAqKSBidWY7CisJc3RydWN0IG1zZG9zX3N1cGVyX2Jsb2NrICptcyA9IChzdHJ1Y3QgbXNkb3Nfc3VwZXJfYmxvY2sgKikgYnVmOworCXN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSAqZGlyOworCWNoYXIgc2Vybm9bMTBdOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmxhYmVsID0gMCwgKnZvbF9sYWJlbCA9IDAsICp0bXA7CisJdW5zaWduZWQgY2hhcgkqdm9sX3Nlcm5vOworCWludCBsYWJlbF9sZW4gPSAwLCBtYXhsb29wID0gMTAwOworCV9fdTE2IHNlY3Rvcl9zaXplLCBkaXJfZW50cmllcywgcmVzZXJ2ZWQ7CisJX191MzIgc2VjdF9jb3VudCwgZmF0X3NpemUsIGRpcl9zaXplLCBjbHVzdGVyX2NvdW50LCBmYXRfbGVuZ3RoOworCV9fdTMyIGJ1Zl9zaXplLCBzdGFydF9kYXRhX3NlY3QsIG5leHQsIHJvb3Rfc3RhcnQsIHJvb3RfZGlyX2VudHJpZXM7CisKKwkvKiBzZWN0b3Igc2l6ZSBjaGVjayAqLworCXRtcCA9ICh1bnNpZ25lZCBjaGFyICopJm1zLT5tc19zZWN0b3Jfc2l6ZTsKKwlzZWN0b3Jfc2l6ZSA9IHRtcFswXSArICh0bXBbMV0gPDwgOCk7CisJaWYgKHNlY3Rvcl9zaXplICE9IDB4MjAwICYmIHNlY3Rvcl9zaXplICE9IDB4NDAwICYmCisJICAgIHNlY3Rvcl9zaXplICE9IDB4ODAwICYmIHNlY3Rvcl9zaXplICE9IDB4MTAwMCkKKwkJcmV0dXJuIDE7CisKKwl0bXAgPSAodW5zaWduZWQgY2hhciAqKSZtcy0+bXNfZGlyX2VudHJpZXM7CisJZGlyX2VudHJpZXMgPSB0bXBbMF0gKyAodG1wWzFdIDw8IDgpOworCXJlc2VydmVkID0gIGJsa2lkX2xlMTYobXMtPm1zX3Jlc2VydmVkKTsKKwl0bXAgPSAodW5zaWduZWQgY2hhciAqKSZtcy0+bXNfc2VjdG9yczsKKwlzZWN0X2NvdW50ID0gdG1wWzBdICsgKHRtcFsxXSA8PCA4KTsKKwlpZiAoc2VjdF9jb3VudCA9PSAwKQorCQlzZWN0X2NvdW50ID0gYmxraWRfbGUzMihtcy0+bXNfdG90YWxfc2VjdCk7CisKKwlmYXRfbGVuZ3RoID0gYmxraWRfbGUxNihtcy0+bXNfZmF0X2xlbmd0aCk7CisJaWYgKGZhdF9sZW5ndGggPT0gMCkKKwkJZmF0X2xlbmd0aCA9IGJsa2lkX2xlMzIodnMtPnZzX2ZhdDMyX2xlbmd0aCk7CisKKwlmYXRfc2l6ZSA9IGZhdF9sZW5ndGggKiBtcy0+bXNfZmF0czsKKwlkaXJfc2l6ZSA9ICgoZGlyX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IHZmYXRfZGlyX2VudHJ5KSkgKworCQkJKHNlY3Rvcl9zaXplLTEpKSAvIHNlY3Rvcl9zaXplOworCisJY2x1c3Rlcl9jb3VudCA9IHNlY3RfY291bnQgLSAocmVzZXJ2ZWQgKyBmYXRfc2l6ZSArIGRpcl9zaXplKTsKKwlpZiAobXMtPm1zX2NsdXN0ZXJfc2l6ZSA9PSAwKQorCQlyZXR1cm4gMTsKKwljbHVzdGVyX2NvdW50IC89IG1zLT5tc19jbHVzdGVyX3NpemU7CisKKwlpZiAoY2x1c3Rlcl9jb3VudCA+IEZBVDMyX01BWCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobXMtPm1zX2ZhdF9sZW5ndGgpIHsKKwkJLyogdGhlIGxhYmVsIG1heSBiZSBhbiBhdHRyaWJ1dGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJCXJvb3Rfc3RhcnQgPSAocmVzZXJ2ZWQgKyBmYXRfc2l6ZSkgKiBzZWN0b3Jfc2l6ZTsKKwkJcm9vdF9kaXJfZW50cmllcyA9IHZzLT52c19kaXJfZW50cmllc1swXSArCisJCQkodnMtPnZzX2Rpcl9lbnRyaWVzWzFdIDw8IDgpOworCisJCWJ1Zl9zaXplID0gcm9vdF9kaXJfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmZhdF9kaXJfZW50cnkpOworCQlkaXIgPSAoc3RydWN0IHZmYXRfZGlyX2VudHJ5ICopIGdldF9idWZmZXIocHJvYmUsIHJvb3Rfc3RhcnQsCisJCQkJCQkJICAgYnVmX3NpemUpOworCQlpZiAoZGlyKQorCQkJdm9sX2xhYmVsID0gc2VhcmNoX2ZhdF9sYWJlbChkaXIsIHJvb3RfZGlyX2VudHJpZXMpOworCisJCWlmICghdm9sX2xhYmVsIHx8ICFtZW1jbXAodm9sX2xhYmVsLCBub19uYW1lLCAxMSkpCisJCQl2b2xfbGFiZWwgPSBtcy0+bXNfbGFiZWw7CisJCXZvbF9zZXJubyA9IG1zLT5tc19zZXJubzsKKworCQlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJTRUNfVFlQRSIsICJtc2RvcyIsCisJCQkgICAgICBzaXplb2YoIm1zZG9zIikpOworCX0gZWxzZSB7CisJCS8qIFNlYXJjaCB0aGUgRkFUMzIgcm9vdCBkaXIgZm9yIHRoZSBsYWJlbCBhdHRyaWJ1dGUgKi8KKwkJYnVmX3NpemUgPSB2cy0+dnNfY2x1c3Rlcl9zaXplICogc2VjdG9yX3NpemU7CisJCXN0YXJ0X2RhdGFfc2VjdCA9IHJlc2VydmVkICsgZmF0X3NpemU7CisKKwkJbmV4dCA9IGJsa2lkX2xlMzIodnMtPnZzX3Jvb3RfY2x1c3Rlcik7CisJCXdoaWxlIChuZXh0ICYmIC0tbWF4bG9vcCkgeworCQkJX191MzIgbmV4dF9zZWN0X29mZjsKKwkJCV9fdTY0IG5leHRfb2ZmLCBmYXRfZW50cnlfb2ZmOworCQkJaW50IGNvdW50OworCisJCQluZXh0X3NlY3Rfb2ZmID0gKG5leHQgLSAyKSAqIHZzLT52c19jbHVzdGVyX3NpemU7CisJCQluZXh0X29mZiA9IChzdGFydF9kYXRhX3NlY3QgKyBuZXh0X3NlY3Rfb2ZmKSAqCisJCQkJc2VjdG9yX3NpemU7CisKKwkJCWRpciA9IChzdHJ1Y3QgdmZhdF9kaXJfZW50cnkgKikKKwkJCQlnZXRfYnVmZmVyKHByb2JlLCBuZXh0X29mZiwgYnVmX3NpemUpOworCQkJaWYgKGRpciA9PSBOVUxMKQorCQkJCWJyZWFrOworCisJCQljb3VudCA9IGJ1Zl9zaXplIC8gc2l6ZW9mKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSk7CisKKwkJCXZvbF9sYWJlbCA9IHNlYXJjaF9mYXRfbGFiZWwoZGlyLCBjb3VudCk7CisJCQlpZiAodm9sX2xhYmVsKQorCQkJCWJyZWFrOworCisJCQkvKiBnZXQgRkFUIGVudHJ5ICovCisJCQlmYXRfZW50cnlfb2ZmID0gKHJlc2VydmVkICogc2VjdG9yX3NpemUpICsKKwkJCQkobmV4dCAqIHNpemVvZihfX3UzMikpOworCQkJYnVmID0gZ2V0X2J1ZmZlcihwcm9iZSwgZmF0X2VudHJ5X29mZiwgYnVmX3NpemUpOworCQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJCWJyZWFrOworCisJCQkvKiBzZXQgbmV4dCBjbHVzdGVyICovCisJCQluZXh0ID0gYmxraWRfbGUzMigqKChfX3UzMiAqKSBidWYpICYgMHgwZmZmZmZmZik7CisJCX0KKworCQlpZiAoIXZvbF9sYWJlbCB8fCAhbWVtY21wKHZvbF9sYWJlbCwgbm9fbmFtZSwgMTEpKQorCQkJdm9sX2xhYmVsID0gdnMtPnZzX2xhYmVsOworCQl2b2xfc2Vybm8gPSB2cy0+dnNfc2Vybm87CisJfQorCisJaWYgKHZvbF9sYWJlbCAmJiBtZW1jbXAodm9sX2xhYmVsLCBub19uYW1lLCAxMSkpIHsKKwkJaWYgKChsYWJlbF9sZW4gPSBmaWd1cmVfbGFiZWxfbGVuKHZvbF9sYWJlbCwgMTEpKSkKKwkJCWxhYmVsID0gdm9sX2xhYmVsOworCX0KKworCS8qIFdlIGNhbid0IGp1c3QgcHJpbnQgdGhlbSBhcyAlMDRYLCBiZWNhdXNlIHRoZXkgYXJlIHVuYWxpZ25lZCAqLworCXNwcmludGYoc2Vybm8sICIlMDJYJTAyWC0lMDJYJTAyWCIsIHZvbF9zZXJub1szXSwgdm9sX3Nlcm5vWzJdLAorCQl2b2xfc2Vybm9bMV0sIHZvbF9zZXJub1swXSk7CisKKwlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJMQUJFTCIsIChjb25zdCBjaGFyICopIGxhYmVsLCBsYWJlbF9sZW4pOworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIlVVSUQiLCBzZXJubywgc2l6ZW9mKHNlcm5vKS0xKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIEZBVCBmaWxlc3lzdGVtIGNvdWxkIGJlIHdpdGhvdXQgYSBtYWdpYyBzdHJpbmcgaW4gc3VwZXJibG9jaworICogKGUuZy4gb2xkIGZsb3BwaWVzKS4gIFRoaXMgaGV1cmlzdGljIGZvciBGQVQgZGV0ZWN0aW9uIGlzIGluc3BpcmVkCisgKiBieSBodHRwOi8vdnJmeS5vcmcvcHJvamVjdHMvdm9sdW1lX2lkLyBhbmQgTGludXgga2VybmVsLgorICogWzctSnVsLTIwMDUsIEthcmVsIFphayA8a3pha0ByZWRoYXQuY29tPl0KKyAqLworc3RhdGljIGludCBwcm9iZV9mYXRfbm9tYWdpYyhzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLAorCQkJICAgICBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbXNkb3Nfc3VwZXJfYmxvY2sgKm1zOworCisJbXMgPSAoc3RydWN0IG1zZG9zX3N1cGVyX2Jsb2NrICopYnVmOworCisJLyogaGVhZHMgY2hlY2sgKi8KKwlpZiAobXMtPm1zX2hlYWRzID09IDApCisJCXJldHVybiAxOworCisJLyogY2x1c3RlciBzaXplIGNoZWNrKi8KKwlpZiAobXMtPm1zX2NsdXN0ZXJfc2l6ZSA9PSAwIHx8CisJICAgIChtcy0+bXNfY2x1c3Rlcl9zaXplICYgKG1zLT5tc19jbHVzdGVyX3NpemUtMSkpKQorCQlyZXR1cm4gMTsKKworCS8qIG1lZGlhIGNoZWNrICovCisJaWYgKG1zLT5tc19tZWRpYSA8IDB4ZjggJiYgbXMtPm1zX21lZGlhICE9IDB4ZjApCisJCXJldHVybiAxOworCisJLyogZmF0IGNvdW50cyhMaW51eCBrZXJuZWwgZXhwZWN0cyBhdCBsZWFzdCAxIEZBVCB0YWJsZSkgKi8KKwlpZiAoIW1zLT5tc19mYXRzKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogT1MvMiBhbmQgYXBwYXJlbnRseSBERlNlZSB3aWxsIHBsYWNlIGEgRkFUMTIvMTYtbGlrZQorCSAqIHBzZXVkby1zdXBlcmJsb2NrIGluIHRoZSBmaXJzdCA1MTIgYnl0ZXMgb2Ygbm9uLUZBVAorCSAqIGZpbGVzeXN0ZW1zIC0tLSBhdCBsZWFzdCBKRlMgYW5kIEhQRlMsIGFuZCBwb3NzaWJseSBvdGhlcnMuCisJICogU28gd2UgZXhwbGljaXRseSBjaGVjayBmb3IgdGhvc2UgZmlsZXN5c3RlbXMgYXQgdGhlCisJICogRkFUMTIvMTYgZmlsZXN5c3RlbSBtYWdpYyBmaWVsZCBpZGVudGlmaWVyLCBhbmQgaWYgdGhleSBhcmUKKwkgKiBwcmVzZW50LCB3ZSBydWxlIHRoaXMgb3V0IGFzIGEgRkFUIGZpbGVzeXN0ZW0sIGRlc3BpdGUgdGhlCisJICogRkFULWxpa2UgcHNldWRvLWhlYWRlci4KKyAgICAgICAgICovCisJaWYgKChtZW1jbXAobXMtPm1zX21hZ2ljLCAiSkZTICAgICAiLCA4KSA9PSAwKSB8fAorCSAgICAobWVtY21wKG1zLT5tc19tYWdpYywgIkhQRlMgICAgIiwgOCkgPT0gMCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIHByb2JlX2ZhdChwcm9iZSwgaWQsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfbnRmcyhzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLAorCQkgICAgICBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbnRmc19zdXBlcl9ibG9jayAqbnM7CisJc3RydWN0IG1hc3Rlcl9maWxlX3RhYmxlX3JlY29yZCAqbWZ0OworCXN0cnVjdCBmaWxlX2F0dHJpYnV0ZSAqYXR0cjsKKwljaGFyCQl1dWlkX3N0clsxN10sIGxhYmVsX3N0clsxMjldLCAqY3A7CisJaW50CQlieXRlc19wZXJfc2VjdG9yLCBzZWN0b3JzX3Blcl9jbHVzdGVyOworCWludAkJbWZ0X3JlY29yZF9zaXplLCBhdHRyX29mZiwgYXR0cl9sZW47CisJdW5zaWduZWQgaW50CWksIGF0dHJfdHlwZSwgdmFsX2xlbjsKKwlpbnQJCXZhbF9vZmY7CisJX191NjQJCW5yX2NsdXN0ZXJzOworCWJsa2lkX2xvZmZfdCBvZmY7CisJdW5zaWduZWQgY2hhciAqYnVmX21mdCwgKnZhbDsKKworCW5zID0gKHN0cnVjdCBudGZzX3N1cGVyX2Jsb2NrICopIGJ1ZjsKKworCWJ5dGVzX3Blcl9zZWN0b3IgPSBucy0+Ymlvc19wYXJhbWV0ZXJfYmxvY2tbMF0gKworCQkobnMtPmJpb3NfcGFyYW1ldGVyX2Jsb2NrWzFdICA8PCA4KTsKKwlzZWN0b3JzX3Blcl9jbHVzdGVyID0gbnMtPmJpb3NfcGFyYW1ldGVyX2Jsb2NrWzJdOworCisJaWYgKChieXRlc19wZXJfc2VjdG9yIDwgNTEyKSB8fCAoc2VjdG9yc19wZXJfY2x1c3RlciA9PSAwKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAobnMtPmNsdXN0ZXJfcGVyX21mdF9yZWNvcmQgPCAwKQorCQltZnRfcmVjb3JkX3NpemUgPSAxIDw8ICgwLW5zLT5jbHVzdGVyX3Blcl9tZnRfcmVjb3JkKTsKKwllbHNlCisJCW1mdF9yZWNvcmRfc2l6ZSA9IG5zLT5jbHVzdGVyX3Blcl9tZnRfcmVjb3JkICoKKwkJCXNlY3RvcnNfcGVyX2NsdXN0ZXIgKiBieXRlc19wZXJfc2VjdG9yOworCW5yX2NsdXN0ZXJzID0gYmxraWRfbGU2NChucy0+bnVtYmVyX29mX3NlY3RvcnMpIC8gc2VjdG9yc19wZXJfY2x1c3RlcjsKKworCWlmICgoYmxraWRfbGU2NChucy0+bWZ0X2NsdXN0ZXJfbG9jYXRpb24pID4gbnJfY2x1c3RlcnMpIHx8CisJICAgIChibGtpZF9sZTY0KG5zLT5tZnRfbWlycm9yX2NsdXN0ZXJfbG9jYXRpb24pID4gbnJfY2x1c3RlcnMpKQorCQlyZXR1cm4gMTsKKworCW9mZiA9IGJsa2lkX2xlNjQobnMtPm1mdF9taXJyb3JfY2x1c3Rlcl9sb2NhdGlvbikgKgorCQlieXRlc19wZXJfc2VjdG9yICogc2VjdG9yc19wZXJfY2x1c3RlcjsKKworCWJ1Zl9tZnQgPSBnZXRfYnVmZmVyKHByb2JlLCBvZmYsIG1mdF9yZWNvcmRfc2l6ZSk7CisJaWYgKCFidWZfbWZ0KQorCQlyZXR1cm4gMTsKKworCWlmIChtZW1jbXAoYnVmX21mdCwgIkZJTEUiLCA0KSkKKwkJcmV0dXJuIDE7CisKKwlvZmYgPSBibGtpZF9sZTY0KG5zLT5tZnRfY2x1c3Rlcl9sb2NhdGlvbikgKiBieXRlc19wZXJfc2VjdG9yICoKKwkJc2VjdG9yc19wZXJfY2x1c3RlcjsKKworCWJ1Zl9tZnQgPSBnZXRfYnVmZmVyKHByb2JlLCBvZmYsIG1mdF9yZWNvcmRfc2l6ZSk7CisJaWYgKCFidWZfbWZ0KQorCQlyZXR1cm4gMTsKKworCWlmIChtZW1jbXAoYnVmX21mdCwgIkZJTEUiLCA0KSkKKwkJcmV0dXJuIDE7CisKKwlvZmYgKz0gTUZUX1JFQ09SRF9WT0xVTUUgKiBtZnRfcmVjb3JkX3NpemU7CisKKwlidWZfbWZ0ID0gZ2V0X2J1ZmZlcihwcm9iZSwgb2ZmLCBtZnRfcmVjb3JkX3NpemUpOworCWlmICghYnVmX21mdCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobWVtY21wKGJ1Zl9tZnQsICJGSUxFIiwgNCkpCisJCXJldHVybiAxOworCisJbWZ0ID0gKHN0cnVjdCBtYXN0ZXJfZmlsZV90YWJsZV9yZWNvcmQgKikgYnVmX21mdDsKKworCWF0dHJfb2ZmID0gYmxraWRfbGUxNihtZnQtPmF0dHJzX29mZnNldCk7CisJbGFiZWxfc3RyWzBdID0gMDsKKworCXdoaWxlICgxKSB7CisJCWF0dHIgPSAoc3RydWN0IGZpbGVfYXR0cmlidXRlICopIChidWZfbWZ0ICsgYXR0cl9vZmYpOworCQlhdHRyX2xlbiA9IGJsa2lkX2xlMTYoYXR0ci0+bGVuKTsKKwkJYXR0cl90eXBlID0gYmxraWRfbGUzMihhdHRyLT50eXBlKTsKKwkJdmFsX29mZiA9IGJsa2lkX2xlMTYoYXR0ci0+dmFsdWVfb2Zmc2V0KTsKKwkJdmFsX2xlbiA9IGJsa2lkX2xlMzIoYXR0ci0+dmFsdWVfbGVuKTsKKworCQlhdHRyX29mZiArPSBhdHRyX2xlbjsKKworCQlpZiAoKGF0dHJfb2ZmID4gbWZ0X3JlY29yZF9zaXplKSB8fAorCQkgICAgKGF0dHJfbGVuID09IDApKQorCQkJYnJlYWs7CisKKwkJaWYgKGF0dHJfdHlwZSA9PSBNRlRfUkVDT1JEX0FUVFJfRU5EKQorCQkJYnJlYWs7CisKKwkJaWYgKGF0dHJfdHlwZSA9PSBNRlRfUkVDT1JEX0FUVFJfVk9MVU1FX05BTUUpIHsKKwkJCWlmICh2YWxfbGVuID4gc2l6ZW9mKGxhYmVsX3N0cikpCisJCQkJdmFsX2xlbiA9IHNpemVvZihsYWJlbF9zdHIpLTE7CisKKwkJCWZvciAoaT0wLCBjcD1sYWJlbF9zdHI7IGkgPCB2YWxfbGVuOyBpKz0yLGNwKyspIHsKKwkJCQl2YWwgPSAoKF9fdTggKikgYXR0cikgKyB2YWxfb2ZmICsgaTsKKwkJCQkqY3AgPSB2YWxbMF07CisJCQkJaWYgKHZhbFsxXSkKKwkJCQkJKmNwID0gJz8nOworCQkJfQorCQkJKmNwID0gMDsKKwkJfQorCX0KKworCXNwcmludGYodXVpZF9zdHIsICIlMDE2bGxYIiwgYmxraWRfbGU2NChucy0+dm9sdW1lX3NlcmlhbCkpOworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIlVVSUQiLCB1dWlkX3N0ciwgMCk7CisJaWYgKGxhYmVsX3N0clswXSkKKwkJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCBsYWJlbF9zdHIsIDApOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJvYmVfeGZzKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCSAgICAgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrICp4czsKKwljb25zdCBjaGFyICpsYWJlbCA9IDA7CisKKwl4cyA9IChzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHN0cmxlbih4cy0+eHNfZm5hbWUpKQorCQlsYWJlbCA9IHhzLT54c19mbmFtZTsKKwlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJMQUJFTCIsIGxhYmVsLCBzaXplb2YoeHMtPnhzX2ZuYW1lKSk7CisJc2V0X3V1aWQocHJvYmUtPmRldiwgeHMtPnhzX3V1aWQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3JlaXNlcmZzKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCQkgIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKSBidWY7CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwljb25zdCBjaGFyICpsYWJlbCA9IDA7CisKKwlibG9ja3NpemUgPSBibGtpZF9sZTE2KHJzLT5yc19ibG9ja3NpemUpOworCisJLyogVGhlIGJsb2Nrc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDFrICovCisJaWYgKChibG9ja3NpemUgPj4gMTApID09IDApCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJLyogSWYgdGhlIHN1cGVyYmxvY2sgaXMgaW5zaWRlIHRoZSBqb3VybmFsLCB3ZSBoYXZlIHRoZSB3cm9uZyBvbmUgKi8KKwlpZiAoaWQtPmJpbV9rYm9mZi8oYmxvY2tzaXplPj4xMCkgPiBibGtpZF9sZTMyKHJzLT5yc19qb3VybmFsX2Jsb2NrKSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfQklHOworCisJLyogTEFCRUwvVVVJRCBhcmUgb25seSB2YWxpZCBmb3IgbGF0ZXIgdmVyc2lvbnMgb2YgUmVpc2VyZnMgdjMuNi4gKi8KKwlpZiAoaWQtPmJpbV9tYWdpY1s2XSA9PSAnMicgfHwgaWQtPmJpbV9tYWdpY1s2XSA9PSAnMycpIHsKKwkJaWYgKHN0cmxlbihycy0+cnNfbGFiZWwpKQorCQkJbGFiZWwgPSBycy0+cnNfbGFiZWw7CisJCXNldF91dWlkKHByb2JlLT5kZXYsIHJzLT5yc191dWlkLCAwKTsKKwl9CisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCBsYWJlbCwgc2l6ZW9mKHJzLT5yc19sYWJlbCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfcmVpc2VyZnM0KHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCQkgICBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCQkgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IHJlaXNlcjRfc3VwZXJfYmxvY2sgKnJzNCA9IChzdHJ1Y3QgcmVpc2VyNF9zdXBlcl9ibG9jayAqKSBidWY7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbGFiZWwgPSAwOworCisJaWYgKHN0cmxlbigoY2hhciAqKSByczQtPnJzNF9sYWJlbCkpCisJCWxhYmVsID0gcnM0LT5yczRfbGFiZWw7CisJc2V0X3V1aWQocHJvYmUtPmRldiwgcnM0LT5yczRfdXVpZCwgMCk7CisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCAoY29uc3QgY2hhciAqKSBsYWJlbCwKKwkJICAgICAgc2l6ZW9mKHJzNC0+cnM0X2xhYmVsKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9qZnMoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwKKwkJICAgICBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBqZnNfc3VwZXJfYmxvY2sgKmpzOworCWNvbnN0IGNoYXIgKmxhYmVsID0gMDsKKworCWpzID0gKHN0cnVjdCBqZnNfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoYmxraWRfbGUzMihqcy0+anNfYnNpemUpICE9ICgxIDw8IGJsa2lkX2xlMTYoanMtPmpzX2wyYnNpemUpKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYmxraWRfbGUzMihqcy0+anNfcGJzaXplKSAhPSAoMSA8PCBibGtpZF9sZTE2KGpzLT5qc19sMnBic2l6ZSkpKQorCQlyZXR1cm4gMTsKKworCWlmICgoYmxraWRfbGUxNihqcy0+anNfbDJic2l6ZSkgLSBibGtpZF9sZTE2KGpzLT5qc19sMnBic2l6ZSkpICE9CisJICAgIGJsa2lkX2xlMTYoanMtPmpzX2wyYmZhY3RvcikpCisJCXJldHVybiAxOworCisJaWYgKHN0cmxlbigoY2hhciAqKSBqcy0+anNfbGFiZWwpKQorCQlsYWJlbCA9IChjaGFyICopIGpzLT5qc19sYWJlbDsKKwlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJMQUJFTCIsIGxhYmVsLCBzaXplb2YoanMtPmpzX2xhYmVsKSk7CisJc2V0X3V1aWQocHJvYmUtPmRldiwganMtPmpzX3V1aWQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3pmcyhzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKyNpZiAwCisJY2hhciAqdmRldl9sYWJlbDsKKwljb25zdCBjaGFyICpwb29sX25hbWUgPSAwOworCisJLyogcmVhZCBudnBhaXIgZGF0YSBmb3IgcG9vbCBuYW1lLCBwb29sIEdVSUQgKGNvbXBsZXgpICovCisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCBwb29sX25hbWUsIHNpemVvZihwb29sX25hbWUpKTsKKwlzZXRfdXVpZChwcm9iZS0+ZGV2LCBwb29sX2d1aWQsIDApOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfbHVrcyhzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLAorCQkgICAgICAgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCWNoYXIgdXVpZFs0MF07CisKKwkvKiAxNjggaXMgdGhlIG9mZnNldCB0byB0aGUgNDAgY2hhcmFjdGVyIHV1aWQ6CisJICogaHR0cDovL2x1a3MuZW5kb3JwaGluLm9yZy9MVUtTLW9uLWRpc2stZm9ybWF0LnBkZiAqLworCXN0cm5jcHkodXVpZCwgKGNoYXIgKikgYnVmKzE2OCwgNDApOworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIlVVSUQiLCB1dWlkLCBzaXplb2YodXVpZCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3JvbWZzKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCSAgICAgICBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICpyb3M7CisJY29uc3QgY2hhciAqbGFiZWwgPSAwOworCisJcm9zID0gKHN0cnVjdCByb21mc19zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzdHJsZW4oKGNoYXIgKikgcm9zLT5yb3Nfdm9sdW1lKSkKKwkJbGFiZWwgPSAoY2hhciAqKSByb3MtPnJvc192b2x1bWU7CisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCBsYWJlbCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfY3JhbWZzKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCQlzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCQl1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IGNyYW1mc19zdXBlcl9ibG9jayAqY3NiOworCWNvbnN0IGNoYXIgKmxhYmVsID0gMDsKKworCWNzYiA9IChzdHJ1Y3QgY3JhbWZzX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHN0cmxlbigoY2hhciAqKSBjc2ItPm5hbWUpKQorCQlsYWJlbCA9IChjaGFyICopIGNzYi0+bmFtZTsKKwlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJMQUJFTCIsIGxhYmVsLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9zd2FwMChzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLAorCQkgICAgICAgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmIF9fQkxLSURfQVRUUigodW51c2VkKSkpCit7CisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiVVVJRCIsIDAsIDApOworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIkxBQkVMIiwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfc3dhcDEoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwKKwkJICAgICAgIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3Qgc3dhcF9pZF9ibG9jayAqc3dzOworCisJcHJvYmVfc3dhcDAocHJvYmUsIGlkLCBidWYpOworCS8qCisJICogVmVyc2lvbiAxIHN3YXAgaGVhZGVycyBhcmUgYWx3YXlzIGxvY2F0ZWQgYXQgb2Zmc2V0IG9mIDEwMjQKKwkgKiBieXRlcywgYWx0aG91Z2ggdGhlIHN3YXAgc2lnbmF0dXJlIGl0c2VsZiBpcyBsb2NhdGVkIGF0IHRoZQorCSAqIGVuZCBvZiB0aGUgcGFnZSAod2hpY2ggbWF5IHZhcnkgZGVwZW5kaW5nIG9uIGhhcmR3YXJlCisJICogcGFnZXNpemUpLgorCSAqLworCXN3cyA9IChzdHJ1Y3Qgc3dhcF9pZF9ibG9jayAqKSBnZXRfYnVmZmVyKHByb2JlLCAxMDI0LCAxMDI0KTsKKwlpZiAoIXN3cykKKwkJcmV0dXJuIDE7CisKKwkvKiBjaGVjayBmb3Igd3JvbmcgdmVyc2lvbiBvciB6ZXJvZWQgcGFnZWNvdW50LCBmb3Igc2FuaXR5ICovCisJaWYgKCFtZW1jbXAoaWQtPmJpbV9tYWdpYywgIlNXQVBTUEFDRTIiLCBpZC0+YmltX2xlbikgJiYKKwkJCShzd3MtPnN3c192ZXJzaW9uICE9IDEgfHwgc3dzLT5zd3NfbGFzdHBhZ2UgPT0gMCkpCisJCXJldHVybiAxOworCisJLyogYXJiaXRyYXJ5IHNhbml0eSBjaGVjay4uIGlzIHRoZXJlIGFueSBnYXJiYWdlIGRvd24gdGhlcmU/ICovCisJaWYgKHN3cy0+c3dzX3BhZFszMl0gPT0gMCAmJiBzd3MtPnN3c19wYWRbMzNdID09IDApICB7CisJCWlmIChzd3MtPnN3c192b2x1bWVbMF0pCisJCQlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJMQUJFTCIsIHN3cy0+c3dzX3ZvbHVtZSwKKwkJCQkgICAgICBzaXplb2Yoc3dzLT5zd3Nfdm9sdW1lKSk7CisJCWlmIChzd3MtPnN3c191dWlkWzBdKQorCQkJc2V0X3V1aWQocHJvYmUtPmRldiwgc3dzLT5zd3NfdXVpZCwgMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX2lzbzk2NjAoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwKKwkJCSBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCQkgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKmlzbzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpsYWJlbDsKKworCWlzbyA9IChzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICopIGJ1ZjsKKwlsYWJlbCA9IGlzby0+dm9sdW1lX2lkOworCisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCAoY29uc3QgY2hhciAqKSBsYWJlbCwKKwkJICAgICAgZmlndXJlX2xhYmVsX2xlbihsYWJlbCwgMzIpKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhcgorKnVkZl9tYWdpY1tdID0geyAiQkVBMDEiLCAiQk9PVDIiLCAiQ0QwMDEiLCAiQ0RXMDIiLCAiTlNSMDIiLAorCQkgIk5TUjAzIiwgIlRFQTAxIiwgMCB9OworCitzdGF0aWMgaW50IHByb2JlX3VkZihzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLAorCQkgICAgIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICB1bnNpZ25lZCBjaGFyICpidWYgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSkKK3sKKwlpbnQgaiwgYnM7CisJc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAqaXNvc2I7CisJY29uc3QgY2hhciAqKiBtOworCisJLyogZGV0ZXJtaW5lIHRoZSBibG9jayBzaXplIGJ5IHNjYW5uaW5nIGluIDJLIGluY3JlbWVudHMKKwkgICAoYmxvY2sgc2l6ZXMgbGFyZ2VyIHRoYW4gMksgd2lsbCBiZSBudWxsIHBhZGRlZCkgKi8KKwlmb3IgKGJzID0gMTsgYnMgPCAxNjsgYnMrKykgeworCQlpc29zYiA9IChzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICopCisJCQlnZXRfYnVmZmVyKHByb2JlLCBicyoyMDQ4KzMyNzY4LCBzaXplb2YoaXNvc2IpKTsKKwkJaWYgKCFpc29zYikKKwkJCXJldHVybiAxOworCQlpZiAoaXNvc2ItPnZkX2lkWzBdKQorCQkJYnJlYWs7CisJfQorCisJLyogU2NhbiB1cCB0byBhbm90aGVyIDY0IGJsb2NrcyBsb29raW5nIGZvciBhZGRpdGlvbmFsIFZTRCdzICovCisJZm9yIChqID0gMTsgaiA8IDY0OyBqKyspIHsKKwkJaWYgKGogPiAxKSB7CisJCQlpc29zYiA9IChzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICopCisJCQkJZ2V0X2J1ZmZlcihwcm9iZSwgaipicyoyMDQ4KzMyNzY4LAorCQkJCQkgICBzaXplb2YoaXNvc2IpKTsKKwkJCWlmICghaXNvc2IpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogSWYgd2UgZmluZCBOU1IweCB0aGVuIGNhbGwgaXQgdWRmOgorCQkgICBOU1IwMSBmb3IgVURGIDEuMDAKKwkJICAgTlNSMDIgZm9yIFVERiAxLjUwCisJCSAgIE5TUjAzIGZvciBVREYgMi4wMCAqLworCQlpZiAoIW1lbWNtcChpc29zYi0+dmRfaWQsICJOU1IwIiwgNCkpCisJCQlyZXR1cm4gcHJvYmVfaXNvOTY2MChwcm9iZSwgaWQsIGJ1Zik7CisJCWZvciAobSA9IHVkZl9tYWdpYzsgKm07IG0rKykKKwkJCWlmICghbWVtY21wKCptLCBpc29zYi0+dmRfaWQsIDUpKQorCQkJCWJyZWFrOworCQlpZiAoKm0gPT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwcm9iZV9vY2ZzKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCSAgICAgIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBvY2ZzX3ZvbHVtZV9oZWFkZXIgb3ZoOworCXN0cnVjdCBvY2ZzX3ZvbHVtZV9sYWJlbCBvdmw7CisJX191MzIgbWFqb3I7CisKKwltZW1jcHkoJm92aCwgYnVmLCBzaXplb2Yob3ZoKSk7CisJbWVtY3B5KCZvdmwsIGJ1Zis1MTIsIHNpemVvZihvdmwpKTsKKworCW1ham9yID0gb2Nmc21ham9yKG92aCk7CisJaWYgKG1ham9yID09IDEpCisJCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwiU0VDX1RZUEUiLCJvY2ZzMSIsc2l6ZW9mKCJvY2ZzMSIpKTsKKwllbHNlIGlmIChtYWpvciA+PSA5KQorCQlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsIlNFQ19UWVBFIiwibnRvY2ZzIixzaXplb2YoIm50b2NmcyIpKTsKKworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIkxBQkVMIiwgb3ZsLmxhYmVsLCBvY2ZzbGFiZWxsZW4ob3ZsKSk7CisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTU9VTlQiLCBvdmgubW91bnQsIG9jZnNtb3VudGxlbihvdmgpKTsKKwlzZXRfdXVpZChwcm9iZS0+ZGV2LCBvdmwudm9sX2lkLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9vY2ZzMihzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLAorCQkgICAgICAgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlcl9ibG9jayAqb3NiOworCisJb3NiID0gKHN0cnVjdCBvY2ZzMl9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIkxBQkVMIiwgb3NiLT5zX2xhYmVsLCBzaXplb2Yob3NiLT5zX2xhYmVsKSk7CisJc2V0X3V1aWQocHJvYmUtPmRldiwgb3NiLT5zX3V1aWQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX29yYWNsZWFzbShzdHJ1Y3QgYmxraWRfcHJvYmUgKnByb2JlLAorCQkJICAgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkJICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBvcmFjbGVfYXNtX2Rpc2tfbGFiZWwgKmRsOworCisJZGwgPSAoc3RydWN0IG9yYWNsZV9hc21fZGlza19sYWJlbCAqKWJ1ZjsKKworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIkxBQkVMIiwgZGwtPmRsX2lkLCBzaXplb2YoZGwtPmRsX2lkKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfZ2ZzKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCSAgICAgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2ZzMl9zYiAqc2JkOworCWNvbnN0IGNoYXIgKmxhYmVsID0gMDsKKworCXNiZCA9IChzdHJ1Y3QgZ2ZzMl9zYiAqKWJ1ZjsKKworCWlmIChibGtpZF9iZTMyKHNiZC0+c2JfZnNfZm9ybWF0KSA9PSBHRlNfRk9STUFUX0ZTICYmCisJICAgIGJsa2lkX2JlMzIoc2JkLT5zYl9tdWx0aWhvc3RfZm9ybWF0KSA9PSBHRlNfRk9STUFUX01VTFRJKQorCXsKKwkJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiVVVJRCIsIDAsIDApOworCisJCWlmIChzdHJsZW4oc2JkLT5zYl9sb2NrdGFibGUpKQorCQkJbGFiZWwgPSBzYmQtPnNiX2xvY2t0YWJsZTsKKwkJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCBsYWJlbCwgc2l6ZW9mKHNiZC0+c2JfbG9ja3RhYmxlKSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwcm9iZV9nZnMyKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCSAgICAgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2ZzMl9zYiAqc2JkOworCWNvbnN0IGNoYXIgKmxhYmVsID0gMDsKKworCXNiZCA9IChzdHJ1Y3QgZ2ZzMl9zYiAqKWJ1ZjsKKworCWlmIChibGtpZF9iZTMyKHNiZC0+c2JfZnNfZm9ybWF0KSA9PSBHRlMyX0ZPUk1BVF9GUyAmJgorCSAgICBibGtpZF9iZTMyKHNiZC0+c2JfbXVsdGlob3N0X2Zvcm1hdCkgPT0gR0ZTMl9GT1JNQVRfTVVMVEkpCisJeworCQlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJVVUlEIiwgMCwgMCk7CisKKwkJaWYgKHN0cmxlbihzYmQtPnNiX2xvY2t0YWJsZSkpCisJCQlsYWJlbCA9IHNiZC0+c2JfbG9ja3RhYmxlOworCQlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJMQUJFTCIsIGxhYmVsLCBzaXplb2Yoc2JkLT5zYl9sb2NrdGFibGUpKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB1bmljb2RlXzE2YmVfdG9fdXRmOCh1bnNpZ25lZCBjaGFyICpzdHIsIGludCBvdXRfbGVuLAorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBpbl9sZW4pCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgaW50IGM7CisKKwlmb3IgKGkgPSBqID0gMDsgaSArIDIgPD0gaW5fbGVuOyBpICs9IDIpIHsKKwkJYyA9IChidWZbaV0gPDwgOCkgfCBidWZbaSsxXTsKKwkJaWYgKGMgPT0gMCkgeworCQkJc3RyW2pdID0gJ1wwJzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGMgPCAweDgwKSB7CisJCQlpZiAoaisxID49IG91dF9sZW4pCisJCQkJYnJlYWs7CisJCQlzdHJbaisrXSA9ICh1bnNpZ25lZCBjaGFyKSBjOworCQl9IGVsc2UgaWYgKGMgPCAweDgwMCkgeworCQkJaWYgKGorMiA+PSBvdXRfbGVuKQorCQkJCWJyZWFrOworCQkJc3RyW2orK10gPSAodW5zaWduZWQgY2hhcikgKDB4YzAgfCAoYyA+PiA2KSk7CisJCQlzdHJbaisrXSA9ICh1bnNpZ25lZCBjaGFyKSAoMHg4MCB8IChjICYgMHgzZikpOworCQl9IGVsc2UgeworCQkJaWYgKGorMyA+PSBvdXRfbGVuKQorCQkJCWJyZWFrOworCQkJc3RyW2orK10gPSAodW5zaWduZWQgY2hhcikgKDB4ZTAgfCAoYyA+PiAxMikpOworCQkJc3RyW2orK10gPSAodW5zaWduZWQgY2hhcikgKDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSk7CisJCQlzdHJbaisrXSA9ICh1bnNpZ25lZCBjaGFyKSAoMHg4MCB8IChjICYgMHgzZikpOworCQl9CisJfQorCXN0cltqXSA9ICdcMCc7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfaGZzKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJCSBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCQkgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZnNfbWRiICpoZnMgPSAoc3RydWN0IGhmc19tZGIgKikgYnVmOworCWNoYXIJdXVpZF9zdHJbMTddOworCV9fdTY0CXV1aWQ7CisKKwlpZiAoKG1lbWNtcChoZnMtPmVtYmVkX3NpZywgIkgrIiwgMikgPT0gMCkgfHwKKwkgICAgKG1lbWNtcChoZnMtPmVtYmVkX3NpZywgIkhYIiwgMikgPT0gMCkpCisJCXJldHVybiAxOwkvKiBOb3QgaGZzLCBidXQgYW4gZW1iZWRkZWQgSEZTKyAqLworCisJdXVpZCA9IGJsa2lkX2xlNjQoKigodW5zaWduZWQgbG9uZyBsb25nICopIGhmcy0+ZmluZGVyX2luZm8uaWQpKTsKKwlpZiAodXVpZCkgeworCQlzcHJpbnRmKHV1aWRfc3RyLCAiJTAxNmxsWCIsIHV1aWQpOworCQlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJVVUlEIiwgdXVpZF9zdHIsIDApOworCX0KKwlibGtpZF9zZXRfdGFnKHByb2JlLT5kZXYsICJMQUJFTCIsIGhmcy0+bGFiZWwsIGhmcy0+bGFiZWxfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByb2JlX2hmc3BsdXMoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwKKwkJCSBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkLAorCQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGZzcGx1c19leHRlbnQgZXh0ZW50c1tIRlNQTFVTX0VYVEVOVF9DT1VOVF07CisJc3RydWN0IGhmc3BsdXNfYm5vZGVfZGVzY3JpcHRvciAqZGVzY3I7CisJc3RydWN0IGhmc3BsdXNfYmhlYWRlcl9yZWNvcmQgKmJub2RlOworCXN0cnVjdCBoZnNwbHVzX2NhdGFsb2dfa2V5ICprZXk7CisJc3RydWN0IGhmc3BsdXNfdm9sX2hlYWRlciAqaGZzcGx1czsKKwlzdHJ1Y3QgaGZzX21kYiAqc2JkID0gKHN0cnVjdCBoZnNfbWRiICopIGJ1ZjsKKwl1bnNpZ25lZCBpbnQgYWxsb2NfYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYWxsb2NfZmlyc3RfYmxvY2s7CisJdW5zaWduZWQgaW50IGVtYmVkX2ZpcnN0X2Jsb2NrOworCXVuc2lnbmVkIGludCBvZmYgPSAwOworCXVuc2lnbmVkIGludCBibG9ja3NpemU7CisJdW5zaWduZWQgaW50IGNhdF9ibG9jazsKKwl1bnNpZ25lZCBpbnQgZXh0X2Jsb2NrX3N0YXJ0OworCXVuc2lnbmVkIGludCBleHRfYmxvY2tfY291bnQ7CisJdW5zaWduZWQgaW50IHJlY29yZF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgbGVhZl9ub2RlX2hlYWQ7CisJdW5zaWduZWQgaW50IGxlYWZfbm9kZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgbGVhZl9ub2RlX3NpemU7CisJdW5zaWduZWQgaW50IGxlYWZfYmxvY2s7CisJdW5zaWduZWQgaW50IGxhYmVsX2xlbjsKKwlpbnQgZXh0OworCV9fdTY0IGxlYWZfb2ZmLCB1dWlkOworCWNoYXIJdXVpZF9zdHJbMTddLCBsYWJlbFs1MTJdOworCisJLyogQ2hlY2sgZm9yIGEgSEZTKyB2b2x1bWUgZW1iZWRkZWQgaW4gYSBIRlMgdm9sdW1lICovCisJaWYgKG1lbWNtcChzYmQtPnNpZ25hdHVyZSwgIkJEIiwgMikgPT0gMCkgeworCQlpZiAoKG1lbWNtcChzYmQtPmVtYmVkX3NpZywgIkgrIiwgMikgIT0gMCkgJiYKKwkJICAgIChtZW1jbXAoc2JkLT5lbWJlZF9zaWcsICJIWCIsIDIpICE9IDApKQorCQkJLyogVGhpcyBtdXN0IGJlIGFuIEhGUyB2b2x1bWUsIHNvIGZhaWwgKi8KKwkJCXJldHVybiAxOworCisJCWFsbG9jX2Jsb2NrX3NpemUgPSBibGtpZF9iZTMyKHNiZC0+YWxfYmxrX3NpemUpOworCQlhbGxvY19maXJzdF9ibG9jayA9IGJsa2lkX2JlMTYoc2JkLT5hbF9ibF9zdCk7CisJCWVtYmVkX2ZpcnN0X2Jsb2NrID0gYmxraWRfYmUxNihzYmQtPmVtYmVkX3N0YXJ0YmxvY2spOworCQlvZmYgPSAoYWxsb2NfZmlyc3RfYmxvY2sgKiA1MTIpICsKKwkJCShlbWJlZF9maXJzdF9ibG9jayAqIGFsbG9jX2Jsb2NrX3NpemUpOworCQlidWYgPSBnZXRfYnVmZmVyKHByb2JlLCBvZmYgKyAoaWQtPmJpbV9rYm9mZiAqIDEwMjQpLAorCQkJCSBzaXplb2Yoc2JkKSk7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIDE7CisKKwkJaGZzcGx1cyA9IChzdHJ1Y3QgaGZzcGx1c192b2xfaGVhZGVyICopIGJ1ZjsKKwl9CisKKwloZnNwbHVzID0gKHN0cnVjdCBoZnNwbHVzX3ZvbF9oZWFkZXIgKikgYnVmOworCisJaWYgKChtZW1jbXAoaGZzcGx1cy0+c2lnbmF0dXJlLCAiSCsiLCAyKSAhPSAwKSAmJgorCSAgICAobWVtY21wKGhmc3BsdXMtPnNpZ25hdHVyZSwgIkhYIiwgMikgIT0gMCkpCisJCXJldHVybiAxOworCisJdXVpZCA9IGJsa2lkX2xlNjQoKigodW5zaWduZWQgbG9uZyBsb25nICopIGhmc3BsdXMtPmZpbmRlcl9pbmZvLmlkKSk7CisJaWYgKHV1aWQpIHsKKwkJc3ByaW50Zih1dWlkX3N0ciwgIiUwMTZsbFgiLCB1dWlkKTsKKwkJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiVVVJRCIsIHV1aWRfc3RyLCAwKTsKKwl9CisKKwlibG9ja3NpemUgPSBibGtpZF9iZTMyKGhmc3BsdXMtPmJsb2Nrc2l6ZSk7CisJbWVtY3B5KGV4dGVudHMsIGhmc3BsdXMtPmNhdF9maWxlLmV4dGVudHMsIHNpemVvZihleHRlbnRzKSk7CisJY2F0X2Jsb2NrID0gYmxraWRfYmUzMihleHRlbnRzWzBdLnN0YXJ0X2Jsb2NrKTsKKworCWJ1ZiA9IGdldF9idWZmZXIocHJvYmUsIG9mZiArIChjYXRfYmxvY2sgKiBibG9ja3NpemUpLCAweDIwMDApOworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKKworCWJub2RlID0gKHN0cnVjdCBoZnNwbHVzX2JoZWFkZXJfcmVjb3JkICopCisJCSZidWZbc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2Jub2RlX2Rlc2NyaXB0b3IpXTsKKworCWxlYWZfbm9kZV9oZWFkID0gYmxraWRfYmUzMihibm9kZS0+bGVhZl9oZWFkKTsKKwlsZWFmX25vZGVfc2l6ZSA9IGJsa2lkX2JlMTYoYm5vZGUtPm5vZGVfc2l6ZSk7CisJbGVhZl9ub2RlX2NvdW50ID0gYmxraWRfYmUzMihibm9kZS0+bGVhZl9jb3VudCk7CisJaWYgKGxlYWZfbm9kZV9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWxlYWZfYmxvY2sgPSAobGVhZl9ub2RlX2hlYWQgKiBsZWFmX25vZGVfc2l6ZSkgLyBibG9ja3NpemU7CisKKwkvKiBnZXQgcGh5c2ljYWwgbG9jYXRpb24gKi8KKwlmb3IgKGV4dCA9IDA7IGV4dCA8IEhGU1BMVVNfRVhURU5UX0NPVU5UOyBleHQrKykgeworCQlleHRfYmxvY2tfc3RhcnQgPSBibGtpZF9iZTMyKGV4dGVudHNbZXh0XS5zdGFydF9ibG9jayk7CisJCWV4dF9ibG9ja19jb3VudCA9IGJsa2lkX2JlMzIoZXh0ZW50c1tleHRdLmJsb2NrX2NvdW50KTsKKwkJaWYgKGV4dF9ibG9ja19jb3VudCA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJLyogdGhpcyBpcyBvdXIgZXh0ZW50ICovCisJCWlmIChsZWFmX2Jsb2NrIDwgZXh0X2Jsb2NrX2NvdW50KQorCQkJYnJlYWs7CisKKwkJbGVhZl9ibG9jayAtPSBleHRfYmxvY2tfY291bnQ7CisJfQorCWlmIChleHQgPT0gSEZTUExVU19FWFRFTlRfQ09VTlQpCisJCXJldHVybiAwOworCisJbGVhZl9vZmYgPSAoZXh0X2Jsb2NrX3N0YXJ0ICsgbGVhZl9ibG9jaykgKiBibG9ja3NpemU7CisKKwlidWYgPSBnZXRfYnVmZmVyKHByb2JlLCBvZmYgKyBsZWFmX29mZiwgbGVhZl9ub2RlX3NpemUpOworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKKworCWRlc2NyID0gKHN0cnVjdCBoZnNwbHVzX2Jub2RlX2Rlc2NyaXB0b3IgKikgYnVmOworCXJlY29yZF9jb3VudCA9IGJsa2lkX2JlMTYoZGVzY3ItPm51bV9yZWNzKTsKKwlpZiAocmVjb3JkX2NvdW50ID09IDApCisJCXJldHVybiAwOworCisJaWYgKGRlc2NyLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCXJldHVybiAwOworCisJa2V5ID0gKHN0cnVjdCBoZnNwbHVzX2NhdGFsb2dfa2V5ICopCisJCSZidWZbc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2Jub2RlX2Rlc2NyaXB0b3IpXTsKKworCWlmIChibGtpZF9iZTMyKGtleS0+cGFyZW50X2lkKSAhPSBIRlNQTFVTX1BPUl9DTklEKQorCQlyZXR1cm4gMDsKKworCWxhYmVsX2xlbiA9IGJsa2lkX2JlMTYoa2V5LT51bmljb2RlX2xlbikgKiAyOworCXVuaWNvZGVfMTZiZV90b191dGY4KGxhYmVsLCBzaXplb2YobGFiZWwpLCBrZXktPnVuaWNvZGUsIGxhYmVsX2xlbik7CisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiTEFCRUwiLCBsYWJlbCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTFZNMl9MQUJFTF9TSVpFIDUxMgorc3RhdGljIHVuc2lnbmVkIGludCBsdm0yX2NhbGNfY3JjKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjcmN0YWJbXSA9IHsKKwkJMHgwMDAwMDAwMCwgMHgxZGI3MTA2NCwgMHgzYjZlMjBjOCwgMHgyNmQ5MzBhYywKKwkJMHg3NmRjNDE5MCwgMHg2YjZiNTFmNCwgMHg0ZGIyNjE1OCwgMHg1MDA1NzEzYywKKwkJMHhlZGI4ODMyMCwgMHhmMDBmOTM0NCwgMHhkNmQ2YTNlOCwgMHhjYjYxYjM4YywKKwkJMHg5YjY0YzJiMCwgMHg4NmQzZDJkNCwgMHhhMDBhZTI3OCwgMHhiZGJkZjIxYworCX07CisJdW5zaWduZWQgaW50IGksIGNyYyA9IDB4ZjU5N2E2Y2Y7CisJY29uc3QgX191OCAqZGF0YSA9IChjb25zdCBfX3U4ICopIGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJY3JjIF49ICpkYXRhKys7CisJCWNyYyA9IChjcmMgPj4gNCkgXiBjcmN0YWJbY3JjICYgMHhmXTsKKwkJY3JjID0gKGNyYyA+PiA0KSBeIGNyY3RhYltjcmMgJiAweGZdOworCX0KKwlyZXR1cm4gY3JjOworfQorCitzdGF0aWMgaW50IHByb2JlX2x2bTIoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwKKwkJCXN0cnVjdCBibGtpZF9tYWdpYyAqaWQsCisJCQl1bnNpZ25lZCBjaGFyICpidWYpCit7CisJaW50IHNlY3RvciA9IChpZC0+YmltX2tib2ZmKSA8PCAxOworCXN0cnVjdCBsdm0yX3B2X2xhYmVsX2hlYWRlciAqbGFiZWw9IChzdHJ1Y3QgbHZtMl9wdl9sYWJlbF9oZWFkZXIgKilidWY7CisJY2hhciAqcCwgKnEsIHV1aWRbNDBdOworCXVuc2lnbmVkIGludCBpLCBiOworCisJLyogYnVmIGlzIGF0IDBrIG9yIDFrIG9mZnNldDsgZmluZCBsYWJlbCBpbnNpZGUgKi8KKwlpZiAobWVtY21wKGJ1ZiwgIkxBQkVMT05FIiwgOCkgPT0gMCkgeworCQlsYWJlbCA9IChzdHJ1Y3QgbHZtMl9wdl9sYWJlbF9oZWFkZXIgKilidWY7CisJfSBlbHNlIGlmIChtZW1jbXAoYnVmICsgNTEyLCAiTEFCRUxPTkUiLCA4KSA9PSAwKSB7CisJCWxhYmVsID0gKHN0cnVjdCBsdm0yX3B2X2xhYmVsX2hlYWRlciAqKShidWYgKyA1MTIpOworCQlzZWN0b3IrKzsKKwl9IGVsc2UgeworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoYmxraWRfbGU2NChsYWJlbC0+c2VjdG9yX3hsKSAhPSAodW5zaWduZWQpIHNlY3RvcikgeworCQlEQkcoREVCVUdfUFJPQkUsCisJCSAgICBwcmludGYoIkxWTTI6IGxhYmVsIGZvciBzZWN0b3IgJWxsdSBmb3VuZCBhdCBzZWN0b3IgJWRcbiIsCisJCQkgICBibGtpZF9sZTY0KGxhYmVsLT5zZWN0b3JfeGwpLCBzZWN0b3IpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGx2bTJfY2FsY19jcmMoJmxhYmVsLT5vZmZzZXRfeGwsIExWTTJfTEFCRUxfU0laRSAtCisJCQkgICgoY2hhciAqKSZsYWJlbC0+b2Zmc2V0X3hsIC0gKGNoYXIgKilsYWJlbCkpICE9CisJCQlibGtpZF9sZTMyKGxhYmVsLT5jcmNfeGwpKSB7CisJCURCRyhERUJVR19QUk9CRSwKKwkJICAgIHByaW50ZigiTFZNMjogbGFiZWwgY2hlY2tzdW0gaW5jb3JyZWN0IGF0IHNlY3RvciAlZFxuIiwKKwkJCSAgIHNlY3RvcikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGk9MCwgYj0xLCBwPXV1aWQsIHE9IChjaGFyICopIGxhYmVsLT5wdl91dWlkOyBpIDw9IDMyOworCSAgICAgaSsrLCBiIDw8PSAxKSB7CisJCWlmIChiICYgMHg0NDQ0NDQwKQorCQkJKnArKyA9ICctJzsKKwkJKnArKyA9ICpxKys7CisJfQorCisJYmxraWRfc2V0X3RhZyhwcm9iZS0+ZGV2LCAiVVVJRCIsIHV1aWQsIExWTTJfSURfTEVOKzYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfYnRyZnMoc3RydWN0IGJsa2lkX3Byb2JlICpwcm9iZSwKKwkJCXN0cnVjdCBibGtpZF9tYWdpYyAqaWQsCisJCQl1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpiczsKKwljb25zdCBjaGFyICpsYWJlbCA9IDA7CisKKwlicyA9IChzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoc3RybGVuKGJzLT5sYWJlbCkpCisJCWxhYmVsID0gYnMtPmxhYmVsOworCWJsa2lkX3NldF90YWcocHJvYmUtPmRldiwgIkxBQkVMIiwgbGFiZWwsIHNpemVvZihicy0+bGFiZWwpKTsKKwlzZXRfdXVpZChwcm9iZS0+ZGV2LCBicy0+ZnNpZCwgMCk7CisJcmV0dXJuIDA7Cit9CisvKgorICogVmFyaW91cyBmaWxlc3lzdGVtIG1hZ2ljcyB0aGF0IHdlIGNhbiBjaGVjayBmb3IuICBOb3RlIHRoYXQga2JvZmYgYW5kCisgKiBzYm9mZiBhcmUgaW4ga2lsb2J5dGVzIGFuZCBieXRlcyByZXNwZWN0aXZlbHkuICBBbGwgbWFnaWNzIGFyZSBpbgorICogYnl0ZSBzdHJpbmdzIHNvIHdlIGRvbid0IHdvcnJ5IGFib3V0IGVuZGlhbiBpc3N1ZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxraWRfbWFnaWMgdHlwZV9hcnJheVtdID0geworLyogIHR5cGUgICAgIGtib2ZmICAgc2JvZmYgbGVuICBtYWdpYwkJCXByb2JlICovCisgIHsgIm9yYWNsZWFzbSIsIDAsCTMyLCAgOCwgIk9SQ0xESVNLIiwJCXByb2JlX29yYWNsZWFzbSB9LAorICB7ICJudGZzIiwJIDAsCSAzLCAgOCwgIk5URlMgICAgIiwJCXByb2JlX250ZnMgfSwKKyAgeyAiamJkIiwJIDEsICAgMHgzOCwgIDIsICJcMTIzXDM1NyIsCQlwcm9iZV9qYmQgfSwKKyAgeyAiZXh0NGRldiIsCSAxLCAgIDB4MzgsICAyLCAiXDEyM1wzNTciLAkJcHJvYmVfZXh0NGRldiB9LAorICB7ICJleHQ0IiwJIDEsICAgMHgzOCwgIDIsICJcMTIzXDM1NyIsCQlwcm9iZV9leHQ0IH0sCisgIHsgImV4dDMiLAkgMSwgICAweDM4LCAgMiwgIlwxMjNcMzU3IiwJCXByb2JlX2V4dDMgfSwKKyAgeyAiZXh0MiIsCSAxLCAgIDB4MzgsICAyLCAiXDEyM1wzNTciLAkJcHJvYmVfZXh0MiB9LAorICB7ICJyZWlzZXJmcyIsCSA4LCAgIDB4MzQsICA4LCAiUmVJc0VyRnMiLAkJcHJvYmVfcmVpc2VyZnMgfSwKKyAgeyAicmVpc2VyZnMiLCA2NCwgICAweDM0LCAgOSwgIlJlSXNFcjJGcyIsCQlwcm9iZV9yZWlzZXJmcyB9LAorICB7ICJyZWlzZXJmcyIsIDY0LCAgIDB4MzQsICA5LCAiUmVJc0VyM0ZzIiwJCXByb2JlX3JlaXNlcmZzIH0sCisgIHsgInJlaXNlcmZzIiwgNjQsICAgMHgzNCwgIDgsICJSZUlzRXJGcyIsCQlwcm9iZV9yZWlzZXJmcyB9LAorICB7ICJyZWlzZXJmcyIsCSA4LAkyMCwgIDgsICJSZUlzRXJGcyIsCQlwcm9iZV9yZWlzZXJmcyB9LAorICB7ICJyZWlzZXI0IiwgIDY0LAkgMCwgIDcsICJSZUlzRXI0IiwJCXByb2JlX3JlaXNlcmZzNCB9LAorICB7ICJnZnMyIiwgICAgIDY0LCAgICAgIDAsICA0LCAiXHgwMVx4MTZceDE5XHg3MCIsICAgICBwcm9iZV9nZnMyIH0sCisgIHsgImdmcyIsICAgICAgNjQsICAgICAgMCwgIDQsICJceDAxXHgxNlx4MTlceDcwIiwgICAgIHByb2JlX2dmcyB9LAorICB7ICJ2ZmF0IiwgICAgICAwLCAgIDB4NTIsICA1LCAiTVNXSU4iLCAgICAgICAgICAgICAgICBwcm9iZV9mYXQgfSwKKyAgeyAidmZhdCIsICAgICAgMCwgICAweDUyLCAgOCwgIkZBVDMyICAgIiwgICAgICAgICAgICAgcHJvYmVfZmF0IH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAgMHgzNiwgIDUsICJNU0RPUyIsICAgICAgICAgICAgICAgIHByb2JlX2ZhdCB9LAorICB7ICJ2ZmF0IiwgICAgICAwLCAgIDB4MzYsICA4LCAiRkFUMTYgICAiLCAgICAgICAgICAgICBwcm9iZV9mYXQgfSwKKyAgeyAidmZhdCIsICAgICAgMCwgICAweDM2LCAgOCwgIkZBVDEyICAgIiwgICAgICAgICAgICAgcHJvYmVfZmF0IH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAgICAgMCwgIDEsICJcMzUzIiwgICAgICAgICAgICAgICAgIHByb2JlX2ZhdF9ub21hZ2ljIH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAgICAgMCwgIDEsICJcMzUxIiwgICAgICAgICAgICAgICAgIHByb2JlX2ZhdF9ub21hZ2ljIH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAweDFmZSwgIDIsICJcMTI1XDI1MiIsICAgICAgICAgICAgIHByb2JlX2ZhdF9ub21hZ2ljIH0sCisgIHsgIm1pbml4IiwgICAgIDEsICAgMHgxMCwgIDIsICJcMTc3XDAyMyIsICAgICAgICAgICAgIDAgfSwKKyAgeyAibWluaXgiLCAgICAgMSwgICAweDEwLCAgMiwgIlwyMTdcMDIzIiwgICAgICAgICAgICAgMCB9LAorICB7ICJtaW5peCIsCSAxLCAgIDB4MTAsICAyLCAiXDE1MFwwNDQiLAkJMCB9LAorICB7ICJtaW5peCIsCSAxLCAgIDB4MTAsICAyLCAiXDE3MFwwNDQiLAkJMCB9LAorICB7ICJ2eGZzIiwJIDEsCSAwLCAgNCwgIlwzNjVcMzc0XDAwMVwyNDUiLAkwIH0sCisgIHsgInhmcyIsCSAwLAkgMCwgIDQsICJYRlNCIiwJCQlwcm9iZV94ZnMgfSwKKyAgeyAicm9tZnMiLAkgMCwJIDAsICA4LCAiLXJvbTFmcy0iLAkJcHJvYmVfcm9tZnMgfSwKKyAgeyAiYmZzIiwJIDAsCSAwLCAgNCwgIlwzMTZcMzcyXDE3M1wwMzMiLAkwIH0sCisgIHsgImNyYW1mcyIsCSAwLAkgMCwgIDQsICJFPVwzMTVcMDUwIiwJCXByb2JlX2NyYW1mcyB9LAorICB7ICJxbng0IiwJIDAsCSA0LCAgNiwgIlFOWDRGUyIsCQkwIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJCRUEwMSIsCQlwcm9iZV91ZGYgfSwKKyAgeyAidWRmIiwJMzIsCSAxLCAgNSwgIkJPT1QyIiwJCXByb2JlX3VkZiB9LAorICB7ICJ1ZGYiLAkzMiwJIDEsICA1LCAiQ0QwMDEiLAkJcHJvYmVfdWRmIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJDRFcwMiIsCQlwcm9iZV91ZGYgfSwKKyAgeyAidWRmIiwJMzIsCSAxLCAgNSwgIk5TUjAyIiwJCXByb2JlX3VkZiB9LAorICB7ICJ1ZGYiLAkzMiwJIDEsICA1LCAiTlNSMDMiLAkJcHJvYmVfdWRmIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJURUEwMSIsCQlwcm9iZV91ZGYgfSwKKyAgeyAiaXNvOTY2MCIsCTMyLAkgMSwgIDUsICJDRDAwMSIsCQlwcm9iZV9pc285NjYwIH0sCisgIHsgImlzbzk2NjAiLAkzMiwJIDksICA1LCAiQ0RST00iLAkJcHJvYmVfaXNvOTY2MCB9LAorICB7ICJqZnMiLAkzMiwJIDAsICA0LCAiSkZTMSIsCQkJcHJvYmVfamZzIH0sCisgIHsgInpmcyIsICAgICAgIDgsCSAwLCAgOCwgIlwwXDBceDAyXHhmNVx4YjBceDA3XHhiMVx4MGMiLCBwcm9iZV96ZnMgfSwKKyAgeyAiemZzIiwgICAgICAgOCwJIDAsICA4LCAiXHgwY1x4YjFceDA3XHhiMFx4ZjVceDAyXDBcMCIsIHByb2JlX3pmcyB9LAorICB7ICJ6ZnMiLCAgICAgMjY0LAkgMCwgIDgsICJcMFwwXHgwMlx4ZjVceGIwXHgwN1x4YjFceDBjIiwgcHJvYmVfemZzIH0sCisgIHsgInpmcyIsICAgICAyNjQsCSAwLCAgOCwgIlx4MGNceGIxXHgwN1x4YjBceGY1XHgwMlwwXDAiLCBwcm9iZV96ZnMgfSwKKyAgeyAiaGZzcGx1cyIsCSAxLAkgMCwgIDIsICJCRCIsCQkJcHJvYmVfaGZzcGx1cyB9LAorICB7ICJoZnNwbHVzIiwJIDEsCSAwLCAgMiwgIkgrIiwJCQlwcm9iZV9oZnNwbHVzIH0sCisgIHsgImhmc3BsdXMiLAkgMSwJIDAsICAyLCAiSFgiLAkJCXByb2JlX2hmc3BsdXMgfSwKKyAgeyAiaGZzIiwJIDEsCSAwLCAgMiwgIkJEIiwJCQlwcm9iZV9oZnMgfSwKKyAgeyAidWZzIiwJIDgsICAweDU1YywgIDQsICJUXDAzMVwwMDFcMDAwIiwJMCB9LAorICB7ICJocGZzIiwJIDgsCSAwLCAgNCwgIklcMzUwXDIyNVwzNzEiLAkwIH0sCisgIHsgInN5c3YiLAkgMCwgIDB4M2Y4LCAgNCwgIlwwMjB+XDAzMFwzNzUiLAkwIH0sCisgIHsgInN3YXAiLAkgMCwgIDB4ZmY2LCAxMCwgIlNXQVAtU1BBQ0UiLAkJcHJvYmVfc3dhcDAgfSwKKyAgeyAic3dhcCIsCSAwLCAgMHhmZjYsIDEwLCAiU1dBUFNQQUNFMiIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd3N1c3BlbmQiLCAwLCAgMHhmZjYsICA5LCAiUzFTVVNQRU5EIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3c3VzcGVuZCIsIDAsICAweGZmNiwgIDksICJTMlNVU1BFTkQiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dzdXNwZW5kIiwgMCwgIDB4ZmY2LCAgOSwgIlVMU1VTUEVORCIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd2FwIiwJIDAsIDB4MWZmNiwgMTAsICJTV0FQLVNQQUNFIiwJCXByb2JlX3N3YXAwIH0sCisgIHsgInN3YXAiLAkgMCwgMHgxZmY2LCAxMCwgIlNXQVBTUEFDRTIiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dzdXNwZW5kIiwgMCwgMHgxZmY2LCAgOSwgIlMxU1VTUEVORCIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd3N1c3BlbmQiLCAwLCAweDFmZjYsICA5LCAiUzJTVVNQRU5EIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3c3VzcGVuZCIsIDAsIDB4MWZmNiwgIDksICJVTFNVU1BFTkQiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dhcCIsCSAwLCAweDNmZjYsIDEwLCAiU1dBUC1TUEFDRSIsCQlwcm9iZV9zd2FwMCB9LAorICB7ICJzd2FwIiwJIDAsIDB4M2ZmNiwgMTAsICJTV0FQU1BBQ0UyIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3c3VzcGVuZCIsIDAsIDB4M2ZmNiwgIDksICJTMVNVU1BFTkQiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dzdXNwZW5kIiwgMCwgMHgzZmY2LCAgOSwgIlMyU1VTUEVORCIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd3N1c3BlbmQiLCAwLCAweDNmZjYsICA5LCAiVUxTVVNQRU5EIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3YXAiLAkgMCwgMHg3ZmY2LCAxMCwgIlNXQVAtU1BBQ0UiLAkJcHJvYmVfc3dhcDAgfSwKKyAgeyAic3dhcCIsCSAwLCAweDdmZjYsIDEwLCAiU1dBUFNQQUNFMiIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd3N1c3BlbmQiLCAwLCAweDdmZjYsICA5LCAiUzFTVVNQRU5EIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3c3VzcGVuZCIsIDAsIDB4N2ZmNiwgIDksICJTMlNVU1BFTkQiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dzdXNwZW5kIiwgMCwgMHg3ZmY2LCAgOSwgIlVMU1VTUEVORCIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd2FwIiwJIDAsIDB4ZmZmNiwgMTAsICJTV0FQLVNQQUNFIiwJCXByb2JlX3N3YXAwIH0sCisgIHsgInN3YXAiLAkgMCwgMHhmZmY2LCAxMCwgIlNXQVBTUEFDRTIiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dzdXNwZW5kIiwgMCwgMHhmZmY2LCAgOSwgIlMxU1VTUEVORCIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd3N1c3BlbmQiLCAwLCAweGZmZjYsICA5LCAiUzJTVVNQRU5EIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3c3VzcGVuZCIsIDAsIDB4ZmZmNiwgIDksICJVTFNVU1BFTkQiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAib2NmcyIsCSAwLAkgOCwgIDksCSJPcmFjbGVDRlMiLAkJcHJvYmVfb2NmcyB9LAorICB7ICJvY2ZzMiIsCSAxLAkgMCwgIDYsCSJPQ0ZTVjIiLAkJcHJvYmVfb2NmczIgfSwKKyAgeyAib2NmczIiLAkgMiwJIDAsICA2LAkiT0NGU1YyIiwJCXByb2JlX29jZnMyIH0sCisgIHsgIm9jZnMyIiwJIDQsCSAwLCAgNiwJIk9DRlNWMiIsCQlwcm9iZV9vY2ZzMiB9LAorICB7ICJvY2ZzMiIsCSA4LAkgMCwgIDYsCSJPQ0ZTVjIiLAkJcHJvYmVfb2NmczIgfSwKKyAgeyAiY3J5cHRfTFVLUyIsIDAsCSAwLCAgNiwJIkxVS1NceGJhXHhiZSIsCQlwcm9iZV9sdWtzIH0sCisgIHsgInNxdWFzaGZzIiwJIDAsCSAwLCAgNCwJInNxc2giLAkJCTAgfSwKKyAgeyAic3F1YXNoZnMiLAkgMCwJIDAsICA0LAkiaHNxcyIsCQkJMCB9LAorICB7ICJsdm0ycHYiLAkgMCwgIDB4MjE4LCAgOCwgIkxWTTIgMDAxIiwJCXByb2JlX2x2bTIgfSwKKyAgeyAibHZtMnB2IiwJIDAsICAweDAxOCwgIDgsICJMVk0yIDAwMSIsCQlwcm9iZV9sdm0yIH0sCisgIHsgImx2bTJwdiIsCSAxLCAgMHgwMTgsICA4LCAiTFZNMiAwMDEiLAkJcHJvYmVfbHZtMiB9LAorICB7ICJsdm0ycHYiLAkgMSwgIDB4MjE4LCAgOCwgIkxWTTIgMDAxIiwJCXByb2JlX2x2bTIgfSwKKyAgeyAiYnRyZnMiLAkgNjQsICAweDQwLCAgOCwgIl9CSFJmU19NIiwJCXByb2JlX2J0cmZzIH0sCisgIHsgICBOVUxMLAkgMCwJIDAsICAwLCBOVUxMLAkJCU5VTEwgfQorfTsKKworLyoKKyAqIFZlcmlmeSB0aGF0IHRoZSBkYXRhIGluIGRldiBpcyBjb25zaXN0ZW50IHdpdGggd2hhdCBpcyBvbiB0aGUgYWN0dWFsCisgKiBibG9jayBkZXZpY2UgKHVzaW5nIHRoZSBkZXZuYW1lIGZpZWxkIG9ubHkpLiAgTm9ybWFsbHkgdGhpcyB3aWxsIGJlCisgKiBjYWxsZWQgd2hlbiBmaW5kaW5nIGl0ZW1zIGluIHRoZSBjYWNoZSwgYnV0IGZvciBsb25nIHJ1bm5pbmcgcHJvY2Vzc2VzCisgKiBpcyBhbHNvIGRlc2lyYWJsZSB0byByZXZhbGlkYXRlIGFuIGl0ZW0gYmVmb3JlIHVzZS4KKyAqCisgKiBJZiB3ZSBhcmUgdW5hYmxlIHRvIHJldmFsaWRhdGUgdGhlIGRhdGEsIHdlIHJldHVybiB0aGUgb2xkIGRhdGEgYW5kCisgKiBkbyBub3Qgc2V0IHRoZSBCTEtJRF9CSURfRkxfVkVSSUZJRUQgZmxhZyBvbiBpdC4KKyAqLworYmxraWRfZGV2IGJsa2lkX3ZlcmlmeShibGtpZF9jYWNoZSBjYWNoZSwgYmxraWRfZGV2IGRldikKK3sKKwlzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkOworCXN0cnVjdCBibGtpZF9wcm9iZSBwcm9iZTsKKwlibGtpZF90YWdfaXRlcmF0ZSBpdGVyOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwljb25zdCBjaGFyICp0eXBlLCAqdmFsdWU7CisJc3RydWN0IHN0YXQgc3Q7CisJdGltZV90IGRpZmYsIG5vdzsKKwlpbnQgaWR4OworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJbm93ID0gdGltZSgwKTsKKwlkaWZmID0gbm93IC0gZGV2LT5iaWRfdGltZTsKKworCWlmIChzdGF0KGRldi0+YmlkX25hbWUsICZzdCkgPCAwKSB7CisJCURCRyhERUJVR19QUk9CRSwKKwkJICAgIHByaW50ZigiYmxraWRfdmVyaWZ5OiBlcnJvciAlcyAoJWQpIHdoaWxlICIKKwkJCSAgICJ0cnlpbmcgdG8gc3RhdCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pLCBlcnJubywKKwkJCSAgIGRldi0+YmlkX25hbWUpKTsKKwlvcGVuX2VycjoKKwkJaWYgKChlcnJubyA9PSBFUEVSTSkgfHwgKGVycm5vID09IEVBQ0NFUykgfHwgKGVycm5vID09IEVOT0VOVCkpIHsKKwkJCS8qIFdlIGRvbid0IGhhdmUgcmVhZCBwZXJtaXNzaW9uLCBqdXN0IHJldHVybiBjYWNoZSBkYXRhLiAqLworCQkJREJHKERFQlVHX1BST0JFLCBwcmludGYoInJldHVybmluZyB1bnZlcmlmaWVkIGRhdGEgZm9yICVzXG4iLAorCQkJCQkJZGV2LT5iaWRfbmFtZSkpOworCQkJcmV0dXJuIGRldjsKKwkJfQorCQlibGtpZF9mcmVlX2RldihkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKG5vdyA+PSBkZXYtPmJpZF90aW1lKSAmJgorCSAgICAoc3Quc3RfbXRpbWUgPD0gZGV2LT5iaWRfdGltZSkgJiYKKwkgICAgKChkaWZmIDwgQkxLSURfUFJPQkVfTUlOKSB8fAorCSAgICAgKGRldi0+YmlkX2ZsYWdzICYgQkxLSURfQklEX0ZMX1ZFUklGSUVEICYmCisJICAgICAgZGlmZiA8IEJMS0lEX1BST0JFX0lOVEVSVkFMKSkpCisJCXJldHVybiBkZXY7CisKKwlEQkcoREVCVUdfUFJPQkUsCisJICAgIHByaW50ZigibmVlZCB0byByZXZhbGlkYXRlICVzIChjYWNoZSB0aW1lICVsdSwgc3RhdCB0aW1lICVsdSxcblx0IgorCQkgICAidGltZSBzaW5jZSBsYXN0IGNoZWNrICVsdSlcbiIsCisJCSAgIGRldi0+YmlkX25hbWUsICh1bnNpZ25lZCBsb25nKWRldi0+YmlkX3RpbWUsCisJCSAgICh1bnNpZ25lZCBsb25nKXN0LnN0X210aW1lLCAodW5zaWduZWQgbG9uZylkaWZmKSk7CisKKwlpZiAoKHByb2JlLmZkID0gb3BlbihkZXYtPmJpZF9uYW1lLCBPX1JET05MWSkpIDwgMCkgeworCQlEQkcoREVCVUdfUFJPQkUsIHByaW50ZigiYmxraWRfdmVyaWZ5OiBlcnJvciAlcyAoJWQpIHdoaWxlICIKKwkJCQkJIm9wZW5pbmcgJXNcbiIsIHN0cmVycm9yKGVycm5vKSwgZXJybm8sCisJCQkJCWRldi0+YmlkX25hbWUpKTsKKwkJZ290byBvcGVuX2VycjsKKwl9CisKKwlwcm9iZS5jYWNoZSA9IGNhY2hlOworCXByb2JlLmRldiA9IGRldjsKKwlwcm9iZS5zYmJ1ZiA9IDA7CisJcHJvYmUuYnVmID0gMDsKKwlwcm9iZS5idWZfbWF4ID0gMDsKKworCS8qCisJICogSXRlcmF0ZSBvdmVyIHRoZSB0eXBlIGFycmF5LiAgSWYgd2UgYWxyZWFkeSBrbm93IHRoZSB0eXBlLAorCSAqIHRoZW4gdHJ5IHRoYXQgZmlyc3QuICBJZiBpdCBkb2Vzbid0IHdvcmssIHRoZW4gYmxvdyBhd2F5CisJICogdGhlIHR5cGUgaW5mb3JtYXRpb24sIGFuZCB0cnkgYWdhaW4uCisJICoKKwkgKi8KK3RyeV9hZ2FpbjoKKwl0eXBlID0gMDsKKwlpZiAoIWRldi0+YmlkX3R5cGUgfHwgIXN0cmNtcChkZXYtPmJpZF90eXBlLCAibWRyYWlkIikpIHsKKwkJdXVpZF90CXV1aWQ7CisKKwkJaWYgKGNoZWNrX21kcmFpZChwcm9iZS5mZCwgdXVpZCkgPT0gMCkgeworCQkJc2V0X3V1aWQoZGV2LCB1dWlkLCAwKTsKKwkJCXR5cGUgPSAibWRyYWlkIjsKKwkJCWdvdG8gZm91bmRfdHlwZTsKKwkJfQorCX0KKwlmb3IgKGlkID0gdHlwZV9hcnJheTsgaWQtPmJpbV90eXBlOyBpZCsrKSB7CisJCWlmIChkZXYtPmJpZF90eXBlICYmCisJCSAgICBzdHJjbXAoaWQtPmJpbV90eXBlLCBkZXYtPmJpZF90eXBlKSkKKwkJCWNvbnRpbnVlOworCisJCWlkeCA9IGlkLT5iaW1fa2JvZmYgKyAoaWQtPmJpbV9zYm9mZiA+PiAxMCk7CisJCWJ1ZiA9IGdldF9idWZmZXIoJnByb2JlLCBpZHggPDwgMTAsIDEwMjQpOworCQlpZiAoIWJ1ZikKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZW1jbXAoaWQtPmJpbV9tYWdpYywgYnVmICsgKGlkLT5iaW1fc2JvZmYgJiAweDNmZiksCisJCQkgICBpZC0+YmltX2xlbikpCisJCQljb250aW51ZTsKKworCQlpZiAoKGlkLT5iaW1fcHJvYmUgPT0gTlVMTCkgfHwKKwkJICAgIChpZC0+YmltX3Byb2JlKCZwcm9iZSwgaWQsIGJ1ZikgPT0gMCkpIHsKKwkJCXR5cGUgPSBpZC0+YmltX3R5cGU7CisJCQlnb3RvIGZvdW5kX3R5cGU7CisJCX0KKwl9CisKKwlpZiAoIWlkLT5iaW1fdHlwZSAmJiBkZXYtPmJpZF90eXBlKSB7CisJCS8qCisJCSAqIFphcCB0aGUgZGV2aWNlIGZpbGVzeXN0ZW0gaW5mb3JtYXRpb24gYW5kIHRyeSBhZ2FpbgorCQkgKi8KKwkJREJHKERFQlVHX1BST0JFLAorCQkgICAgcHJpbnRmKCJwcmV2aW91cyBmcyB0eXBlICVzIG5vdCB2YWxpZCwgIgorCQkJICAgInRyeWluZyBmdWxsIHByb2JlXG4iLCBkZXYtPmJpZF90eXBlKSk7CisJCWl0ZXIgPSBibGtpZF90YWdfaXRlcmF0ZV9iZWdpbihkZXYpOworCQl3aGlsZSAoYmxraWRfdGFnX25leHQoaXRlciwgJnR5cGUsICZ2YWx1ZSkgPT0gMCkKKwkJCWJsa2lkX3NldF90YWcoZGV2LCB0eXBlLCAwLCAwKTsKKwkJYmxraWRfdGFnX2l0ZXJhdGVfZW5kKGl0ZXIpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlpZiAoIWRldi0+YmlkX3R5cGUpIHsKKwkJYmxraWRfZnJlZV9kZXYoZGV2KTsKKwkJZGV2ID0gMDsKKwkJZ290byBmb3VuZF90eXBlOworCX0KKworZm91bmRfdHlwZToKKwlpZiAoZGV2ICYmIHR5cGUpIHsKKwkJZGV2LT5iaWRfZGV2bm8gPSBzdC5zdF9yZGV2OworCQlkZXYtPmJpZF90aW1lID0gdGltZSgwKTsKKwkJZGV2LT5iaWRfZmxhZ3MgfD0gQkxLSURfQklEX0ZMX1ZFUklGSUVEOworCQljYWNoZS0+YmljX2ZsYWdzIHw9IEJMS0lEX0JJQ19GTF9DSEFOR0VEOworCisJCWJsa2lkX3NldF90YWcoZGV2LCAiVFlQRSIsIHR5cGUsIDApOworCisJCURCRyhERUJVR19QUk9CRSwgcHJpbnRmKCIlczogZGV2bm8gMHglMDRsbHgsIHR5cGUgJXNcbiIsCisJCQkgICBkZXYtPmJpZF9uYW1lLCAobG9uZyBsb25nKXN0LnN0X3JkZXYsIHR5cGUpKTsKKwl9CisKKwlmcmVlKHByb2JlLnNiYnVmKTsKKwlmcmVlKHByb2JlLmJ1Zik7CisJaWYgKHByb2JlLmZkID49IDApCisJCWNsb3NlKHByb2JlLmZkKTsKKworCXJldHVybiBkZXY7Cit9CisKK2ludCBibGtpZF9rbm93bl9mc3R5cGUoY29uc3QgY2hhciAqZnN0eXBlKQoreworCXN0cnVjdCBibGtpZF9tYWdpYyAqaWQ7CisKKwlmb3IgKGlkID0gdHlwZV9hcnJheTsgaWQtPmJpbV90eXBlOyBpZCsrKSB7CisJCWlmIChzdHJjbXAoZnN0eXBlLCBpZC0+YmltX3R5cGUpID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBURVNUX1BST0dSQU0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlibGtpZF9kZXYgZGV2OworCWJsa2lkX2NhY2hlIGNhY2hlOworCWludCByZXQ7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGRldmljZVxuIgorCQkJIlByb2JlIGEgc2luZ2xlIGRldmljZSB0byBkZXRlcm1pbmUgdHlwZVxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgIi9kZXYvbnVsbCIpKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGNyZWF0aW5nIGNhY2hlICglZClcbiIsCisJCQlhcmd2WzBdLCByZXQpOworCQlleGl0KDEpOworCX0KKwlkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBhcmd2WzFdLCBCTEtJRF9ERVZfTk9STUFMKTsKKwlpZiAoIWRldikgeworCQlwcmludGYoIiVzOiAlcyBoYXMgYW4gdW5zdXBwb3J0ZWQgdHlwZVxuIiwgYXJndlswXSwgYXJndlsxXSk7CisJCXJldHVybiAoMSk7CisJfQorCXByaW50ZigiVFlQRT0nJXMnXG4iLCBkZXYtPmJpZF90eXBlID8gZGV2LT5iaWRfdHlwZSA6ICIobnVsbCkiKTsKKwlpZiAoZGV2LT5iaWRfbGFiZWwpCisJCXByaW50ZigiTEFCRUw9JyVzJ1xuIiwgZGV2LT5iaWRfbGFiZWwpOworCWlmIChkZXYtPmJpZF91dWlkKQorCQlwcmludGYoIlVVSUQ9JyVzJ1xuIiwgZGV2LT5iaWRfdXVpZCk7CisKKwlibGtpZF9mcmVlX2RldihkZXYpOworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Byb2JlLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9wcm9iZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZmM5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9wcm9iZS5oCkBAIC0wLDAgKzEsODE1IEBACisvKgorICogcHJvYmUuaCAtIGNvbnN0YW50cyBhbmQgb24tZGlzayBzdHJ1Y3R1cmVzIGZvciBleHRyYWN0aW5nIGRldmljZSBkYXRhCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IEFuZHJpZXMgQnJvdXdlcgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzIGJ5IFRoZW9kb3JlIFRzJ28KKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2lmbmRlZiBfQkxLSURfUFJPQkVfSAorI2RlZmluZSBfQkxLSURfUFJPQkVfSAorCisjaW5jbHVkZSA8YmxraWQvYmxraWRfdHlwZXMuaD4KKworc3RydWN0IGJsa2lkX21hZ2ljOworCisjZGVmaW5lIFNCX0JVRkZFUl9TSVpFCQkweDExMDAwCisKK3N0cnVjdCBibGtpZF9wcm9iZSB7CisJaW50CQkJZmQ7CisJYmxraWRfY2FjaGUJCWNhY2hlOworCWJsa2lkX2RldgkJZGV2OworCXVuc2lnbmVkIGNoYXIJCSpzYmJ1ZjsKKwlzaXplX3QJCQlzYl92YWxpZDsKKwl1bnNpZ25lZCBjaGFyCQkqYnVmOworCXNpemVfdAkJCWJ1Zl9tYXg7Cit9OworCit0eXBlZGVmIGludCAoKmJsa2lkX3Byb2JlX3QpKHN0cnVjdCBibGtpZF9wcm9iZSAqcHJvYmUsCisJCQkgICAgIHN0cnVjdCBibGtpZF9tYWdpYyAqaWQsIHVuc2lnbmVkIGNoYXIgKmJ1Zik7CisKK3N0cnVjdCBibGtpZF9tYWdpYyB7CisJY29uc3QgY2hhcgkqYmltX3R5cGU7CS8qIHR5cGUgbmFtZSBmb3IgdGhpcyBtYWdpYyAqLworCWxvbmcJCWJpbV9rYm9mZjsJLyoga2lsb2J5dGUgb2Zmc2V0IG9mIHN1cGVyYmxvY2sgKi8KKwl1bnNpZ25lZAliaW1fc2JvZmY7CS8qIGJ5dGUgb2Zmc2V0IHdpdGhpbiBzdXBlcmJsb2NrICovCisJdW5zaWduZWQJYmltX2xlbjsJLyogbGVuZ3RoIG9mIG1hZ2ljICovCisJY29uc3QgY2hhcgkqYmltX21hZ2ljOwkvKiBtYWdpYyBzdHJpbmcgKi8KKwlibGtpZF9wcm9iZV90CWJpbV9wcm9iZTsJLyogcHJvYmUgZnVuY3Rpb24gKi8KK307CisKKy8qCisgKiBTdHJ1Y3R1cmVzIGZvciBlYWNoIG9mIHRoZSBjb250ZW50IHR5cGVzIHdlIHdhbnQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbgorICogZnJvbS4gIFdlIGRvIG5vdCBuZWNlc3NhcmlseSBuZWVkIHRoZSBtYWdpYyBmaWVsZCBoZXJlLCBiZWNhdXNlIHdlIGhhdmUKKyAqIGFscmVhZHkgaWRlbnRpZmllZCB0aGUgY29udGVudCB0eXBlIGJlZm9yZSB3ZSBnZXQgdGhpcyBmYXIuICBJdCBtYXkgc3RpbGwKKyAqIGJlIHVzZWZ1bCBpZiB0aGVyZSBhcmUgcHJvYmUgZnVuY3Rpb25zIHdoaWNoIGhhbmRsZSBtdWx0aXBsZSBjb250ZW50IHR5cGVzLgorICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayB7CisJX191MzIJCXNfaW5vZGVzX2NvdW50OworCV9fdTMyCQlzX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJc19yX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJc19mcmVlX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJc19mcmVlX2lub2Rlc19jb3VudDsKKwlfX3UzMgkJc19maXJzdF9kYXRhX2Jsb2NrOworCV9fdTMyCQlzX2xvZ19ibG9ja19zaXplOworCV9fdTMyCQlzX2R1bW15M1s3XTsKKwl1bnNpZ25lZCBjaGFyCXNfbWFnaWNbMl07CisJX191MTYJCXNfc3RhdGU7CisJX191MzIJCXNfZHVtbXk1WzhdOworCV9fdTMyCQlzX2ZlYXR1cmVfY29tcGF0OworCV9fdTMyCQlzX2ZlYXR1cmVfaW5jb21wYXQ7CisJX191MzIJCXNfZmVhdHVyZV9yb19jb21wYXQ7CisJdW5zaWduZWQgY2hhciAgIHNfdXVpZFsxNl07CisJY2hhcgkgICBzX3ZvbHVtZV9uYW1lWzE2XTsKKwljaGFyCXNfbGFzdF9tb3VudGVkWzY0XTsKKwlfX3UzMglzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7CisJX191OAlzX3ByZWFsbG9jX2Jsb2NrczsKKwlfX3U4CXNfcHJlYWxsb2NfZGlyX2Jsb2NrczsKKwlfX3UxNglzX3Jlc2VydmVkX2dkdF9ibG9ja3M7CisJX191OAlzX2pvdXJuYWxfdXVpZFsxNl07CisJX191MzIJc19qb3VybmFsX2ludW07CisJX191MzIJc19qb3VybmFsX2RldjsKKwlfX3UzMglzX2xhc3Rfb3JwaGFuOworCV9fdTMyCXNfaGFzaF9zZWVkWzRdOworCV9fdTgJc19kZWZfaGFzaF92ZXJzaW9uOworCV9fdTgJc19qbmxfYmFja3VwX3R5cGU7CisJX191MTYJc19yZXNlcnZlZF93b3JkX3BhZDsKKwlfX3UzMglzX2RlZmF1bHRfbW91bnRfb3B0czsKKwlfX3UzMglzX2ZpcnN0X21ldGFfYmc7CisJX191MzIJc19ta2ZzX3RpbWU7CisJX191MzIJc19qbmxfYmxvY2tzWzE3XTsKKwlfX3UzMglzX2Jsb2Nrc19jb3VudF9oaTsKKwlfX3UzMglzX3JfYmxvY2tzX2NvdW50X2hpOworCV9fdTMyCXNfZnJlZV9ibG9ja3NfaGk7CisJX191MTYJc19taW5fZXh0cmFfaXNpemU7CisJX191MTYJc193YW50X2V4dHJhX2lzaXplOworCV9fdTMyCXNfZmxhZ3M7CisJX191MTYgICBzX3JhaWRfc3RyaWRlOworCV9fdTE2ICAgc19tbXBfaW50ZXJ2YWw7CisJX191NjQgICBzX21tcF9ibG9jazsKKwlfX3UzMiAgIHNfcmFpZF9zdHJpcGVfd2lkdGg7CisJX191MzIgICBzX3Jlc2VydmVkWzE2M107Cit9OworCisvKiBmb3Igc19mbGFncyAqLworI2RlZmluZSBFWFQyX0ZMQUdTX1RFU1RfRklMRVNZUwkJMHgwMDA0CisKKy8qIGZvciBzX2ZlYXR1cmVfY29tcGF0ICovCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwJCTB4MDAwNAorCisvKiBmb3Igc19mZWF0dXJlX3JvX2NvbXBhdCAqLworI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUgkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFCTB4MDAwMgorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0JUUkVFX0RJUgkweDAwMDQKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9IVUdFX0ZJTEUJMHgwMDA4CisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfR0RUX0NTVU0JCTB4MDAxMAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0RJUl9OTElOSwkweDAwMjAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9FWFRSQV9JU0laRQkweDAwNDAKKworLyogZm9yIHNfZmVhdHVyZV9pbmNvbXBhdCAqLworI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUJCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUgkJMHgwMDA0CisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVgkweDAwMDgKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcJCTB4MDAxMAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUwkJMHgwMDQwIC8qIGV4dGVudHMgc3VwcG9ydCAqLworI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQJCTB4MDA4MAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTU1QCQkweDAxMDAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkcJCTB4MDIwMAorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIpCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEV8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfVU5TVVBQT1JURUQJfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfVU5TVVBQT1JURUQJfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAorCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIpCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEV8IFwKKwkJCQkJIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSfCBcCisJCQkJCSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1VOU1VQUE9SVEVECX5FWFQzX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1VOU1VQUE9SVEVECX5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAKKworCitzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrIHsKKwl1bnNpZ25lZCBjaGFyCXhzX21hZ2ljWzRdOworCV9fdTMyCQl4c19ibG9ja3NpemU7CisJX191NjQJCXhzX2RibG9ja3M7CisJX191NjQJCXhzX3JibG9ja3M7CisJX191MzIJCXhzX2R1bW15MVsyXTsKKwl1bnNpZ25lZCBjaGFyCXhzX3V1aWRbMTZdOworCV9fdTMyCQl4c19kdW1teTJbMTVdOworCWNoYXIJCXhzX2ZuYW1lWzEyXTsKKwlfX3UzMgkJeHNfZHVtbXkzWzJdOworCV9fdTY0CQl4c19pY291bnQ7CisJX191NjQJCXhzX2lmcmVlOworCV9fdTY0CQl4c19mZGJsb2NrczsKK307CisKK3N0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayB7CisJX191MzIJCXJzX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJcnNfZnJlZV9ibG9ja3M7CisJX191MzIJCXJzX3Jvb3RfYmxvY2s7CisJX191MzIJCXJzX2pvdXJuYWxfYmxvY2s7CisJX191MzIJCXJzX2pvdXJuYWxfZGV2OworCV9fdTMyCQlyc19vcmlnX2pvdXJuYWxfc2l6ZTsKKwlfX3UzMgkJcnNfZHVtbXkyWzVdOworCV9fdTE2CQlyc19ibG9ja3NpemU7CisJX191MTYJCXJzX2R1bW15M1szXTsKKwl1bnNpZ25lZCBjaGFyCXJzX21hZ2ljWzEyXTsKKwlfX3UzMgkJcnNfZHVtbXk0WzVdOworCXVuc2lnbmVkIGNoYXIJcnNfdXVpZFsxNl07CisJY2hhcgkJcnNfbGFiZWxbMTZdOworfTsKKworc3RydWN0IHJlaXNlcjRfc3VwZXJfYmxvY2sgeworCXVuc2lnbmVkIGNoYXIJcnM0X21hZ2ljWzE2XTsKKwlfX3UxNgkJcnM0X2R1bW15WzJdOworCXVuc2lnbmVkIGNoYXIJcnM0X3V1aWRbMTZdOworCXVuc2lnbmVkIGNoYXIJcnM0X2xhYmVsWzE2XTsKKwlfX3U2NAkJcnM0X2R1bW15MjsKK307CisKK3N0cnVjdCBqZnNfc3VwZXJfYmxvY2sgeworCXVuc2lnbmVkIGNoYXIJanNfbWFnaWNbNF07CisJX191MzIJCWpzX3ZlcnNpb247CisJX191NjQJCWpzX3NpemU7CisJX191MzIJCWpzX2JzaXplOwkvKiA0OiBhZ2dyZWdhdGUgYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworCV9fdTE2CQlqc19sMmJzaXplOwkvKiAyOiBsb2cyIG9mIHNfYnNpemUgKi8KKwlfX3UxNgkJanNfbDJiZmFjdG9yOwkvKiAyOiBsb2cyKHNfYnNpemUvaGFyZHdhcmUgYmxvY2sgc2l6ZSkgKi8KKwlfX3UzMgkJanNfcGJzaXplOwkvKiA0OiBoYXJkd2FyZS9MVk0gYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworCV9fdTE2CQlqc19sMnBic2l6ZTsJLyogMjogbG9nMiBvZiBzX3Bic2l6ZSAqLworCV9fdTE2IAkJanNfcGFkOwkJLyogMjogcGFkZGluZyBuZWNlc3NhcnkgZm9yIGFsaWdubWVudCAqLworCV9fdTMyCQlqc19kdW1teTJbMjZdOworCXVuc2lnbmVkIGNoYXIJanNfdXVpZFsxNl07CisJdW5zaWduZWQgY2hhcglqc19sYWJlbFsxNl07CisJdW5zaWduZWQgY2hhcglqc19sb2d1dWlkWzE2XTsKK307CisKK3N0cnVjdCByb21mc19zdXBlcl9ibG9jayB7CisJdW5zaWduZWQgY2hhcglyb3NfbWFnaWNbOF07CisJX191MzIJCXJvc19kdW1teTFbMl07CisJdW5zaWduZWQgY2hhcglyb3Nfdm9sdW1lWzE2XTsKK307CisKK3N0cnVjdCBjcmFtZnNfc3VwZXJfYmxvY2sgeworCV9fdTgJCW1hZ2ljWzRdOworCV9fdTMyCQlzaXplOworCV9fdTMyCQlmbGFnczsKKwlfX3UzMgkJZnV0dXJlOworCV9fdTgJCXNpZ25hdHVyZVsxNl07CisJc3RydWN0IGNyYW1mc19pbmZvIHsKKwkJX191MzIJCWNyYzsKKwkJX191MzIJCWVkaXRpb247CisJCV9fdTMyCQlibG9ja3M7CisJCV9fdTMyCQlmaWxlczsKKwl9IGluZm87CisJX191OAkJbmFtZVsxNl07Cit9OworCitzdHJ1Y3Qgc3dhcF9pZF9ibG9jayB7CisvKgl1bnNpZ25lZCBjaGFyCXN3c19ib290WzEwMjRdOyAqLworCV9fdTMyCQlzd3NfdmVyc2lvbjsKKwlfX3UzMgkJc3dzX2xhc3RwYWdlOworCV9fdTMyCQlzd3NfbnJiYWQ7CisJdW5zaWduZWQgY2hhcglzd3NfdXVpZFsxNl07CisJY2hhcgkJc3dzX3ZvbHVtZVsxNl07CisJdW5zaWduZWQgY2hhcglzd3NfcGFkWzExN107CisJX191MzIJCXN3c19iYWRwZzsKK307CisKKy8qIFl1Y2t5IG1pc2FsaWduZWQgdmFsdWVzICovCitzdHJ1Y3QgdmZhdF9zdXBlcl9ibG9jayB7CisvKiAwMCovCXVuc2lnbmVkIGNoYXIJdnNfaWdub3JlZFszXTsKKy8qIDAzKi8JdW5zaWduZWQgY2hhcgl2c19zeXNpZFs4XTsKKy8qIDBiKi8JdW5zaWduZWQgY2hhcgl2c19zZWN0b3Jfc2l6ZVsyXTsKKy8qIDBkKi8JX191OAkJdnNfY2x1c3Rlcl9zaXplOworLyogMGUqLwlfX3UxNgkJdnNfcmVzZXJ2ZWQ7CisvKiAxMCovCV9fdTgJCXZzX2ZhdHM7CisvKiAxMSovCXVuc2lnbmVkIGNoYXIJdnNfZGlyX2VudHJpZXNbMl07CisvKiAxMyovCXVuc2lnbmVkIGNoYXIJdnNfc2VjdG9yc1syXTsKKy8qIDE1Ki8JdW5zaWduZWQgY2hhcgl2c19tZWRpYTsKKy8qIDE2Ki8JX191MTYJCXZzX2ZhdF9sZW5ndGg7CisvKiAxOCovCV9fdTE2CQl2c19zZWNzX3RyYWNrOworLyogMWEqLwlfX3UxNgkJdnNfaGVhZHM7CisvKiAxYyovCV9fdTMyCQl2c19oaWRkZW47CisvKiAyMCovCV9fdTMyCQl2c190b3RhbF9zZWN0OworLyogMjQqLwlfX3UzMgkJdnNfZmF0MzJfbGVuZ3RoOworLyogMjgqLwlfX3UxNgkJdnNfZmxhZ3M7CisvKiAyYSovCV9fdTgJCXZzX3ZlcnNpb25bMl07CisvKiAyYyovCV9fdTMyCQl2c19yb290X2NsdXN0ZXI7CisvKiAzMCovCV9fdTE2CQl2c19pbnNmb19zZWN0b3I7CisvKiAzMiovCV9fdTE2CQl2c19iYWNrdXBfYm9vdDsKKy8qIDM0Ki8JX191MTYJCXZzX3Jlc2VydmVkMls2XTsKKy8qIDQwKi8JdW5zaWduZWQgY2hhcgl2c191bmtub3duWzNdOworLyogNDMqLwl1bnNpZ25lZCBjaGFyCXZzX3Nlcm5vWzRdOworLyogNDcqLwl1bnNpZ25lZCBjaGFyCXZzX2xhYmVsWzExXTsKKy8qIDUyKi8JdW5zaWduZWQgY2hhciAgIHZzX21hZ2ljWzhdOworLyogNWEqLwl1bnNpZ25lZCBjaGFyCXZzX2R1bW15MlsxNjRdOworLyoxZmUqLwl1bnNpZ25lZCBjaGFyCXZzX3BtYWdpY1syXTsKK307CisKKy8qIFl1Y2t5IG1pc2FsaWduZWQgdmFsdWVzICovCitzdHJ1Y3QgbXNkb3Nfc3VwZXJfYmxvY2sgeworLyogMDAqLwl1bnNpZ25lZCBjaGFyCW1zX2lnbm9yZWRbM107CisvKiAwMyovCXVuc2lnbmVkIGNoYXIJbXNfc3lzaWRbOF07CisvKiAwYiovCXVuc2lnbmVkIGNoYXIJbXNfc2VjdG9yX3NpemVbMl07CisvKiAwZCovCV9fdTgJCW1zX2NsdXN0ZXJfc2l6ZTsKKy8qIDBlKi8JX191MTYJCW1zX3Jlc2VydmVkOworLyogMTAqLwlfX3U4CQltc19mYXRzOworLyogMTEqLwl1bnNpZ25lZCBjaGFyCW1zX2Rpcl9lbnRyaWVzWzJdOworLyogMTMqLwl1bnNpZ25lZCBjaGFyCW1zX3NlY3RvcnNbMl07CisvKiAxNSovCXVuc2lnbmVkIGNoYXIJbXNfbWVkaWE7CisvKiAxNiovCV9fdTE2CQltc19mYXRfbGVuZ3RoOworLyogMTgqLwlfX3UxNgkJbXNfc2Vjc190cmFjazsKKy8qIDFhKi8JX191MTYJCW1zX2hlYWRzOworLyogMWMqLwlfX3UzMgkJbXNfaGlkZGVuOworLyogMjAqLwlfX3UzMgkJbXNfdG90YWxfc2VjdDsKKy8qIDI0Ki8JdW5zaWduZWQgY2hhcgltc191bmtub3duWzNdOworLyogMjcqLwl1bnNpZ25lZCBjaGFyCW1zX3Nlcm5vWzRdOworLyogMmIqLwl1bnNpZ25lZCBjaGFyCW1zX2xhYmVsWzExXTsKKy8qIDM2Ki8JdW5zaWduZWQgY2hhciAgIG1zX21hZ2ljWzhdOworLyogM2QqLwl1bnNpZ25lZCBjaGFyCW1zX2R1bW15MlsxOTJdOworLyoxZmUqLwl1bnNpZ25lZCBjaGFyCW1zX3BtYWdpY1syXTsKK307CisKK3N0cnVjdCB2ZmF0X2Rpcl9lbnRyeSB7CisJX191OAluYW1lWzExXTsKKwlfX3U4CWF0dHI7CisJX191MTYJdGltZV9jcmVhdDsKKwlfX3UxNglkYXRlX2NyZWF0OworCV9fdTE2CXRpbWVfYWNjOworCV9fdTE2CWRhdGVfYWNjOworCV9fdTE2CWNsdXN0ZXJfaGlnaDsKKwlfX3UxNgl0aW1lX3dyaXRlOworCV9fdTE2CWRhdGVfd3JpdGU7CisJX191MTYJY2x1c3Rlcl9sb3c7CisJX191MzIJc2l6ZTsKK307CisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGNsdXN0ZXJzICovCisjZGVmaW5lIEZBVDEyX01BWCAweEZGNAorI2RlZmluZSBGQVQxNl9NQVggMHhGRkY0CisjZGVmaW5lIEZBVDMyX01BWCAweDBGRkZGRkY2CisKK3N0cnVjdCBtaW5peF9zdXBlcl9ibG9jayB7CisJX191MTYJCW1zX25pbm9kZXM7CisJX191MTYJCW1zX256b25lczsKKwlfX3UxNgkJbXNfaW1hcF9ibG9ja3M7CisJX191MTYJCW1zX3ptYXBfYmxvY2tzOworCV9fdTE2CQltc19maXJzdGRhdGF6b25lOworCV9fdTE2CQltc19sb2dfem9uZV9zaXplOworCV9fdTMyCQltc19tYXhfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCW1zX21hZ2ljWzJdOworCV9fdTE2CQltc19zdGF0ZTsKKwlfX3UzMgkJbXNfem9uZXM7Cit9OworCitzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfcyB7CisJX191MzIgbWRfbWFnaWM7CisJX191MzIgbWFqb3JfdmVyc2lvbjsKKwlfX3UzMiBtaW5vcl92ZXJzaW9uOworCV9fdTMyIHBhdGNoX3ZlcnNpb247CisJX191MzIgZ3ZhbGlkX3dvcmRzOworCV9fdTMyIHNldF91dWlkMDsKKwlfX3UzMiBjdGltZTsKKwlfX3UzMiBsZXZlbDsKKwlfX3UzMiBzaXplOworCV9fdTMyIG5yX2Rpc2tzOworCV9fdTMyIHJhaWRfZGlza3M7CisJX191MzIgbWRfbWlub3I7CisJX191MzIgbm90X3BlcnNpc3RlbnQ7CisJX191MzIgc2V0X3V1aWQxOworCV9fdTMyIHNldF91dWlkMjsKKwlfX3UzMiBzZXRfdXVpZDM7Cit9OworCitzdHJ1Y3QgaGZzX3N1cGVyX2Jsb2NrIHsKKwljaGFyCWhfbWFnaWNbMl07CisJY2hhcgloX2R1bW15WzE4XTsKKwlfX3UzMgloX2Jsa3NpemU7Cit9OworCitzdHJ1Y3Qgb2Nmc192b2x1bWVfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyCW1pbm9yX3ZlcnNpb25bNF07CisJdW5zaWduZWQgY2hhcgltYWpvcl92ZXJzaW9uWzRdOworCXVuc2lnbmVkIGNoYXIJc2lnbmF0dXJlWzEyOF07CisJY2hhcgkJbW91bnRbMTI4XTsKKwl1bnNpZ25lZCBjaGFyICAgbW91bnRfbGVuWzJdOworfTsKKworc3RydWN0IG9jZnNfdm9sdW1lX2xhYmVsIHsKKwl1bnNpZ25lZCBjaGFyCWRpc2tfbG9ja1s0OF07CisJY2hhcgkJbGFiZWxbNjRdOworCXVuc2lnbmVkIGNoYXIJbGFiZWxfbGVuWzJdOworCXVuc2lnbmVkIGNoYXIgIHZvbF9pZFsxNl07CisJdW5zaWduZWQgY2hhciAgdm9sX2lkX2xlblsyXTsKK307CisKKyNkZWZpbmUgb2Nmc21ham9yKG8pICgoX191MzIpby5tYWpvcl92ZXJzaW9uWzBdIFwKKyAgICAgICAgICAgICAgICAgICArICgoKF9fdTMyKSBvLm1ham9yX3ZlcnNpb25bMV0pIDw8IDgpIFwKKyAgICAgICAgICAgICAgICAgICArICgoKF9fdTMyKSBvLm1ham9yX3ZlcnNpb25bMl0pIDw8IDE2KSBcCisgICAgICAgICAgICAgICAgICAgKyAoKChfX3UzMikgby5tYWpvcl92ZXJzaW9uWzNdKSA8PCAyNCkpCisjZGVmaW5lIG9jZnNsYWJlbGxlbihvKQkoKF9fdTMyKW8ubGFiZWxfbGVuWzBdICsgKCgoX191MzIpIG8ubGFiZWxfbGVuWzFdKSA8PCA4KSkKKyNkZWZpbmUgb2Nmc21vdW50bGVuKG8pCSgoX191MzIpby5tb3VudF9sZW5bMF0gKyAoKChfX3UzMikgby5tb3VudF9sZW5bMV0pPDw4KSkKKworI2RlZmluZSBPQ0ZTX01BR0lDICJPcmFjbGVDRlMiCisKK3N0cnVjdCBvY2ZzMl9zdXBlcl9ibG9jayB7CisJdW5zaWduZWQgY2hhciAgc2lnbmF0dXJlWzhdOworCXVuc2lnbmVkIGNoYXIgIHNfZHVtbXkxWzE4NF07CisJdW5zaWduZWQgY2hhciAgc19kdW1teTJbODBdOworCWNoYXIJICAgICAgIHNfbGFiZWxbNjRdOworCXVuc2lnbmVkIGNoYXIgIHNfdXVpZFsxNl07Cit9OworCisjZGVmaW5lIE9DRlMyX01JTl9CTE9DS1NJWkUgICAgICAgICAgICAgNTEyCisjZGVmaW5lIE9DRlMyX01BWF9CTE9DS1NJWkUgICAgICAgICAgICAgNDA5NgorCisjZGVmaW5lIE9DRlMyX1NVUEVSX0JMT0NLX0JMS05PICAgICAgICAgMgorCisjZGVmaW5lIE9DRlMyX1NVUEVSX0JMT0NLX1NJR05BVFVSRSAgICAgIk9DRlNWMiIKKworc3RydWN0IG9yYWNsZV9hc21fZGlza19sYWJlbCB7CisJY2hhciBkdW1teVszMl07CisJY2hhciBkbF90YWdbOF07CisJY2hhciBkbF9pZFsyNF07Cit9OworCisjZGVmaW5lIE9SQUNMRV9BU01fRElTS19MQUJFTF9NQVJLRUQgICAgIk9SQ0xESVNLIgorI2RlZmluZSBPUkFDTEVfQVNNX0RJU0tfTEFCRUxfT0ZGU0VUICAgIDMyCisKK3N0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgeworCXVuc2lnbmVkIGNoYXIJdmRfdHlwZTsKKwl1bnNpZ25lZCBjaGFyCXZkX2lkWzVdOworCXVuc2lnbmVkIGNoYXIJdmRfdmVyc2lvbjsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJc3lzdGVtX2lkWzMyXTsKKwl1bnNpZ25lZCBjaGFyCXZvbHVtZV9pZFszMl07CisJdW5zaWduZWQgY2hhcgl1bnVzZWRbOF07CisJdW5zaWduZWQgY2hhcglzcGFjZV9zaXplWzhdOworCXVuc2lnbmVkIGNoYXIJZXNjYXBlX3NlcXVlbmNlc1s4XTsKK307CisKKy8qIENvbW1vbiBnZnMvZ2ZzMiBjb25zdGFudHM6ICovCisjZGVmaW5lIEdGU19NQUdJQyAgICAgICAgICAgICAgIDB4MDExNjE5NzAKKyNkZWZpbmUgR0ZTX0RFRkFVTFRfQlNJWkUgICAgICAgNDA5NgorI2RlZmluZSBHRlNfU1VQRVJCTE9DS19PRkZTRVQJKDB4MTAgKiBHRlNfREVGQVVMVF9CU0laRSkKKyNkZWZpbmUgR0ZTX01FVEFUWVBFX1NCICAgICAgICAgMQorI2RlZmluZSBHRlNfRk9STUFUX1NCICAgICAgICAgICAxMDAKKyNkZWZpbmUgR0ZTX0xPQ0tOQU1FX0xFTiAgICAgICAgNjQKKworLyogZ2ZzMSBjb25zdGFudHM6ICovCisjZGVmaW5lIEdGU19GT1JNQVRfRlMgICAgICAgICAgIDEzMDkKKyNkZWZpbmUgR0ZTX0ZPUk1BVF9NVUxUSSAgICAgICAgMTQwMQorLyogZ2ZzMiBjb25zdGFudHM6ICovCisjZGVmaW5lIEdGUzJfRk9STUFUX0ZTICAgICAgICAgIDE4MDEKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfTVVMVEkgICAgICAgMTkwMAorCitzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciB7CisJX191MzIgbWhfbWFnaWM7CisJX191MzIgbWhfdHlwZTsKKwlfX3U2NCBfX3BhZDA7ICAgICAgICAgIC8qIFdhcyBnZW5lcmF0aW9uIG51bWJlciBpbiBnZnMxICovCisJX191MzIgbWhfZm9ybWF0OworCV9fdTMyIF9fcGFkMTsgICAgICAgICAgLyogV2FzIGluY2FybmF0aW9uIG51bWJlciBpbiBnZnMxICovCit9OworCitzdHJ1Y3QgZ2ZzMl9pbnVtIHsKKwlfX3U2NCBub19mb3JtYWxfaW5vOworCV9fdTY0IG5vX2FkZHI7Cit9OworCitzdHJ1Y3QgZ2ZzMl9zYiB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgc2JfaGVhZGVyOworCisJX191MzIgc2JfZnNfZm9ybWF0OworCV9fdTMyIHNiX211bHRpaG9zdF9mb3JtYXQ7CisJX191MzIgIF9fcGFkMDsgIC8qIFdhcyBzdXBlcmJsb2NrIGZsYWdzIGluIGdmczEgKi8KKworCV9fdTMyIHNiX2JzaXplOworCV9fdTMyIHNiX2JzaXplX3NoaWZ0OworCV9fdTMyIF9fcGFkMTsgICAvKiBXYXMgam91cm5hbCBzZWdtZW50IHNpemUgaW4gZ2ZzMSAqLworCisJc3RydWN0IGdmczJfaW51bSBzYl9tYXN0ZXJfZGlyOyAvKiBXYXMgamluZGV4IGRpbm9kZSBpbiBnZnMxICovCisJc3RydWN0IGdmczJfaW51bSBfX3BhZDI7IC8qIFdhcyByaW5kZXggZGlub2RlIGluIGdmczEgKi8KKwlzdHJ1Y3QgZ2ZzMl9pbnVtIHNiX3Jvb3RfZGlyOworCisJY2hhciBzYl9sb2NrcHJvdG9bR0ZTX0xPQ0tOQU1FX0xFTl07CisJY2hhciBzYl9sb2NrdGFibGVbR0ZTX0xPQ0tOQU1FX0xFTl07CisJLyogSW4gZ2ZzMSwgcXVvdGEgYW5kIGxpY2Vuc2UgZGlub2RlcyBmb2xsb3dlZCAqLworfTsKKworc3RydWN0IG50ZnNfc3VwZXJfYmxvY2sgeworCV9fdTgJanVtcFszXTsKKwlfX3U4CW9lbV9pZFs4XTsKKwlfX3U4CWJpb3NfcGFyYW1ldGVyX2Jsb2NrWzI1XTsKKwlfX3UxNgl1bnVzZWRbMl07CisJX191NjQJbnVtYmVyX29mX3NlY3RvcnM7CisJX191NjQJbWZ0X2NsdXN0ZXJfbG9jYXRpb247CisJX191NjQJbWZ0X21pcnJvcl9jbHVzdGVyX2xvY2F0aW9uOworCV9fczgJY2x1c3Rlcl9wZXJfbWZ0X3JlY29yZDsKKwlfX3U4CXJlc2VydmVkMVszXTsKKwlfX3M4CWNsdXN0ZXJfcGVyX2luZGV4X3JlY29yZDsKKwlfX3U4CXJlc2VydmVkMlszXTsKKwlfX3U2NAl2b2x1bWVfc2VyaWFsOworCV9fdTE2CWNoZWNrc3VtOworfTsKKworc3RydWN0IG1hc3Rlcl9maWxlX3RhYmxlX3JlY29yZCB7CisJX191MzIJbWFnaWM7CisJX191MTYJdXNhX29mczsKKwlfX3UxNgl1c2FfY291bnQ7CisJX191NjQJbHNuOworCV9fdTE2CXNlcXVlbmNlX251bWJlcjsKKwlfX3UxNglsaW5rX2NvdW50OworCV9fdTE2CWF0dHJzX29mZnNldDsKKwlfX3UxNglmbGFnczsKKwlfX3UzMglieXRlc19pbl91c2U7CisJX191MzIJYnl0ZXNfYWxsb2NhdGVkOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBmaWxlX2F0dHJpYnV0ZSB7CisJX191MzIJdHlwZTsKKwlfX3UzMglsZW47CisJX191OAlub25fcmVzaWRlbnQ7CisJX191OAluYW1lX2xlbjsKKwlfX3UxNgluYW1lX29mZnNldDsKKwlfX3UxNglmbGFnczsKKwlfX3UxNglpbnN0YW5jZTsKKwlfX3UzMgl2YWx1ZV9sZW47CisJX191MTYJdmFsdWVfb2Zmc2V0OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgTUZUX1JFQ09SRF9WT0xVTUUJCQkzCisjZGVmaW5lIE1GVF9SRUNPUkRfQVRUUl9WT0xVTUVfTkFNRQkJMHg2MAorI2RlZmluZSBNRlRfUkVDT1JEX0FUVFJfVk9MVU1FX0lORk8JCTB4NzAKKyNkZWZpbmUgTUZUX1JFQ09SRF9BVFRSX09CSkVDVF9JRAkJMHg0MAorI2RlZmluZSBNRlRfUkVDT1JEX0FUVFJfRU5ECQkJMHhmZmZmZmZmZnUKKworLyogSEZTIC8gSEZTKyAqLworc3RydWN0IGhmc19maW5kZXJfaW5mbyB7CisgICAgICAgIF9fdTMyICAgICAgICBib290X2ZvbGRlcjsKKyAgICAgICAgX191MzIgICAgICAgIHN0YXJ0X2FwcDsKKyAgICAgICAgX191MzIgICAgICAgIG9wZW5fZm9sZGVyOworICAgICAgICBfX3UzMiAgICAgICAgb3M5X2ZvbGRlcjsKKyAgICAgICAgX191MzIgICAgICAgIHJlc2VydmVkOworICAgICAgICBfX3UzMiAgICAgICAgb3N4X2ZvbGRlcjsKKyAgICAgICAgX191OCAgICAgICAgIGlkWzhdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGhmc19tZGIgeworICAgICAgICBfX3U4ICAgICAgICAgc2lnbmF0dXJlWzJdOworICAgICAgICBfX3UzMiAgICAgICAgY3JfZGF0ZTsKKyAgICAgICAgX191MzIgICAgICAgIGxzX01vZDsKKyAgICAgICAgX191MTYgICAgICAgIGF0cmI7CisgICAgICAgIF9fdTE2ICAgICAgICBubV9mbHM7CisgICAgICAgIF9fdTE2ICAgICAgICB2Ym1fc3Q7CisgICAgICAgIF9fdTE2ICAgICAgICBhbGxvY19wdHI7CisgICAgICAgIF9fdTE2ICAgICAgICBubV9hbF9ibGtzOworICAgICAgICBfX3UzMiAgICAgICAgYWxfYmxrX3NpemU7CisgICAgICAgIF9fdTMyICAgICAgICBjbHBfc2l6ZTsKKyAgICAgICAgX191MTYgICAgICAgIGFsX2JsX3N0OworICAgICAgICBfX3UzMiAgICAgICAgbnh0X2NuaWQ7CisgICAgICAgIF9fdTE2ICAgICAgICBmcmVlX2JrczsKKyAgICAgICAgX191OCAgICAgICAgIGxhYmVsX2xlbjsKKyAgICAgICAgX191OCAgICAgICAgIGxhYmVsWzI3XTsKKyAgICAgICAgX191MzIgICAgICAgIHZvbF9ia3VwOworICAgICAgICBfX3UxNiAgICAgICAgdm9sX3NlcV9udW07CisgICAgICAgIF9fdTMyICAgICAgICB3cl9jbnQ7CisgICAgICAgIF9fdTMyICAgICAgICB4dF9jbHVtcF9zaXplOworICAgICAgICBfX3UzMiAgICAgICAgY3RfY2x1bXBfc2l6ZTsKKyAgICAgICAgX191MTYgICAgICAgIG51bV9yb290X2RpcnM7CisgICAgICAgIF9fdTMyICAgICAgICBmaWxlX2NvdW50OworICAgICAgICBfX3UzMiAgICAgICAgZGlyX2NvdW50OworICAgICAgICBzdHJ1Y3QgaGZzX2ZpbmRlcl9pbmZvIGZpbmRlcl9pbmZvOworICAgICAgICBfX3U4ICAgICAgICAgZW1iZWRfc2lnWzJdOworICAgICAgICBfX3UxNiAgICAgICAgZW1iZWRfc3RhcnRibG9jazsKKyAgICAgICAgX191MTYgICAgICAgIGVtYmVkX2Jsb2NrY291bnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNkZWZpbmUgSEZTX05PREVfTEVBRgkJCTB4ZmYKKyNkZWZpbmUgSEZTUExVU19QT1JfQ05JRAkJMQorCitzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yIHsKKwlfX3UzMgkJbmV4dDsKKwlfX3UzMgkJcHJldjsKKwlfX3U4CQl0eXBlOworCV9fdTgJCWhlaWdodDsKKwlfX3UxNgkJbnVtX3JlY3M7CisJX191MTYJCXJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGhmc3BsdXNfYmhlYWRlcl9yZWNvcmQgeworCV9fdTE2CQlkZXB0aDsKKwlfX3UzMgkJcm9vdDsKKwlfX3UzMgkJbGVhZl9jb3VudDsKKwlfX3UzMgkJbGVhZl9oZWFkOworCV9fdTMyCQlsZWFmX3RhaWw7CisJX191MTYJCW5vZGVfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBoZnNwbHVzX2NhdGFsb2dfa2V5IHsKKwlfX3UxNglrZXlfbGVuOworCV9fdTMyCXBhcmVudF9pZDsKKwlfX3UxNgl1bmljb2RlX2xlbjsKKwlfX3U4CQl1bmljb2RlWzI1NSAqIDJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGhmc3BsdXNfZXh0ZW50IHsKKwlfX3UzMgkJc3RhcnRfYmxvY2s7CisJX191MzIJCWJsb2NrX2NvdW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBIRlNQTFVTX0VYVEVOVF9DT1VOVAkJOAorc3RydWN0IGhmc3BsdXNfZm9yayB7CisJX191NjQJCXRvdGFsX3NpemU7CisJX191MzIJCWNsdW1wX3NpemU7CisJX191MzIJCXRvdGFsX2Jsb2NrczsKKwlzdHJ1Y3QgaGZzcGx1c19leHRlbnQgZXh0ZW50c1tIRlNQTFVTX0VYVEVOVF9DT1VOVF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaGZzcGx1c192b2xfaGVhZGVyIHsKKwlfX3U4CQlzaWduYXR1cmVbMl07CisJX191MTYJCXZlcnNpb247CisJX191MzIJCWF0dHJpYnV0ZXM7CisJX191MzIJCWxhc3RfbW91bnRfdmVyczsKKwlfX3UzMgkJcmVzZXJ2ZWQ7CisJX191MzIJCWNyZWF0ZV9kYXRlOworCV9fdTMyCQltb2RpZnlfZGF0ZTsKKwlfX3UzMgkJYmFja3VwX2RhdGU7CisJX191MzIJCWNoZWNrZWRfZGF0ZTsKKwlfX3UzMgkJZmlsZV9jb3VudDsKKwlfX3UzMgkJZm9sZGVyX2NvdW50OworCV9fdTMyCQlibG9ja3NpemU7CisJX191MzIJCXRvdGFsX2Jsb2NrczsKKwlfX3UzMgkJZnJlZV9ibG9ja3M7CisJX191MzIJCW5leHRfYWxsb2M7CisJX191MzIJCXJzcmNfY2x1bXBfc3o7CisJX191MzIJCWRhdGFfY2x1bXBfc3o7CisJX191MzIJCW5leHRfY25pZDsKKwlfX3UzMgkJd3JpdGVfY291bnQ7CisJX191NjQJCWVuY29kaW5nc19ibXA7CisJc3RydWN0IGhmc19maW5kZXJfaW5mbyBmaW5kZXJfaW5mbzsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIGFsbG9jX2ZpbGU7CisJc3RydWN0IGhmc3BsdXNfZm9yayBleHRfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIGNhdF9maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmsgYXR0cl9maWxlOworCXN0cnVjdCBoZnNwbHVzX2Zvcmsgc3RhcnRfZmlsZTsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIHRoaXMgaXMgbHZtJ3MgbGFiZWxfaGVhZGVyICYgcHZfaGVhZGVyIGNvbWJpbmVkLiAqLworCisjZGVmaW5lIExWTTJfSURfTEVOIDMyCisKK3N0cnVjdCBsdm0yX3B2X2xhYmVsX2hlYWRlciB7CisJLyogbGFiZWxfaGVhZGVyICovCisJX191OAlpZFs4XTsJCS8qIExBQkVMT05FICovCisJX191NjQJc2VjdG9yX3hsOwkvKiBTZWN0b3IgbnVtYmVyIG9mIHRoaXMgbGFiZWwgKi8KKwlfX3UzMgljcmNfeGw7CQkvKiBGcm9tIG5leHQgZmllbGQgdG8gZW5kIG9mIHNlY3RvciAqLworCV9fdTMyCW9mZnNldF94bDsJLyogT2Zmc2V0IGZyb20gc3RhcnQgb2Ygc3RydWN0IHRvIGNvbnRlbnRzICovCisJX191OAl0eXBlWzhdOwkvKiBMVk0yIDAwMSAqLworCS8qIHB2X2hlYWRlciAqLworCV9fdTgJcHZfdXVpZFtMVk0yX0lEX0xFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKgorICogdGhpcyBpcyBhIHZlcnkgZ2VuZXJvdXMgcG9ydGlvbiBvZiB0aGUgc3VwZXIgYmxvY2ssIGdpdmluZyB1cworICogcm9vbSB0byB0cmFuc2xhdGUgMTQgY2h1bmtzIHdpdGggMyBzdHJpcGVzIGVhY2guCisgKi8KKyNkZWZpbmUgQlRSRlNfU1lTVEVNX0NIVU5LX0FSUkFZX1NJWkUgMjA0OAorI2RlZmluZSBCVFJGU19MQUJFTF9TSVpFIDI1NgorI2RlZmluZSBCVFJGU19VVUlEX1NJWkUgMTYKKyNkZWZpbmUgQlRSRlNfRlNJRF9TSVpFIDE2CisjZGVmaW5lIEJUUkZTX0NTVU1fU0laRSAzMgorCitzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0geworCS8qIHRoZSBpbnRlcm5hbCBidHJmcyBkZXZpY2UgaWQgKi8KKwlfX3U2NCBkZXZpZDsKKworCS8qIHNpemUgb2YgdGhlIGRldmljZSAqLworCV9fdTY0IHRvdGFsX2J5dGVzOworCisJLyogYnl0ZXMgdXNlZCAqLworCV9fdTY0IGJ5dGVzX3VzZWQ7CisKKwkvKiBvcHRpbWFsIGlvIGFsaWdubWVudCBmb3IgdGhpcyBkZXZpY2UgKi8KKwlfX3UzMiBpb19hbGlnbjsKKworCS8qIG9wdGltYWwgaW8gd2lkdGggZm9yIHRoaXMgZGV2aWNlICovCisJX191MzIgaW9fd2lkdGg7CisKKwkvKiBtaW5pbWFsIGlvIHNpemUgZm9yIHRoaXMgZGV2aWNlICovCisJX191MzIgc2VjdG9yX3NpemU7CisKKwkvKiB0eXBlIGFuZCBpbmZvIGFib3V0IHRoaXMgZGV2aWNlICovCisJX191NjQgdHlwZTsKKworCS8qIGV4cGVjdGVkIGdlbmVyYXRpb24gZm9yIHRoaXMgZGV2aWNlICovCisJX191NjQgZ2VuZXJhdGlvbjsKKworCS8qCisJICogc3RhcnRpbmcgYnl0ZSBvZiB0aGlzIHBhcnRpdGlvbiBvbiB0aGUgZGV2aWNlLAorCSAqIHRvIGFsbG93ciBmb3Igc3RyaXBlIGFsaWdubWVudCBpbiB0aGUgZnV0dXJlCisJICovCisJX191NjQgc3RhcnRfb2Zmc2V0OworCisJLyogZ3JvdXBpbmcgaW5mb3JtYXRpb24gZm9yIGFsbG9jYXRpb24gZGVjaXNpb25zICovCisJX191MzIgZGV2X2dyb3VwOworCisJLyogc2VlayBzcGVlZCAwLTEwMCB3aGVyZSAxMDAgaXMgZmFzdGVzdCAqLworCV9fdTggc2Vla19zcGVlZDsKKworCS8qIGJhbmR3aWR0aCAwLTEwMCB3aGVyZSAxMDAgaXMgZmFzdGVzdCAqLworCV9fdTggYmFuZHdpZHRoOworCisJLyogYnRyZnMgZ2VuZXJhdGVkIHV1aWQgZm9yIHRoaXMgZGV2aWNlICovCisJX191OCB1dWlkW0JUUkZTX1VVSURfU0laRV07CisKKwkvKiB1dWlkIG9mIEZTIHdobyBvd25zIHRoaXMgZGV2aWNlICovCisJX191OCBmc2lkW0JUUkZTX1VVSURfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKiB0aGUgc3VwZXIgYmxvY2sgYmFzaWNhbGx5IGxpc3RzIHRoZSBtYWluIHRyZWVzIG9mIHRoZSBGUworICogaXQgY3VycmVudGx5IGxhY2tzIGFueSBibG9jayBjb3VudCBldGMgZXRjCisgKi8KK3N0cnVjdCBidHJmc19zdXBlcl9ibG9jayB7CisJX191OCBjc3VtW0JUUkZTX0NTVU1fU0laRV07CisJLyogdGhlIGZpcnN0IDMgZmllbGRzIG11c3QgbWF0Y2ggc3RydWN0IGJ0cmZzX2hlYWRlciAqLworCV9fdTggZnNpZFtCVFJGU19GU0lEX1NJWkVdOyAgICAvKiBGUyBzcGVjaWZpYyB1dWlkICovCisJX191NjQgYnl0ZW5yOyAvKiB0aGlzIGJsb2NrIG51bWJlciAqLworCV9fdTY0IGZsYWdzOworCisJLyogYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgYnRyZnNfaGVhZGVyIGZyb20gaGVyZSBvd24gZG93biAqLworCV9fdTY0IG1hZ2ljOworCV9fdTY0IGdlbmVyYXRpb247CisJX191NjQgcm9vdDsKKwlfX3U2NCBjaHVua19yb290OworCV9fdTY0IGxvZ19yb290OworCisJLyogdGhpcyB3aWxsIGhlbHAgZmluZCB0aGUgbmV3IHN1cGVyIGJhc2VkIG9uIHRoZSBsb2cgcm9vdCAqLworCV9fdTY0IGxvZ19yb290X3RyYW5zaWQ7CisJX191NjQgdG90YWxfYnl0ZXM7CisJX191NjQgYnl0ZXNfdXNlZDsKKwlfX3U2NCByb290X2Rpcl9vYmplY3RpZDsKKwlfX3U2NCBudW1fZGV2aWNlczsKKwlfX3UzMiBzZWN0b3JzaXplOworCV9fdTMyIG5vZGVzaXplOworCV9fdTMyIGxlYWZzaXplOworCV9fdTMyIHN0cmlwZXNpemU7CisJX191MzIgc3lzX2NodW5rX2FycmF5X3NpemU7CisJX191NjQgY2h1bmtfcm9vdF9nZW5lcmF0aW9uOworCV9fdTY0IGNvbXBhdF9mbGFnczsKKwlfX3U2NCBjb21wYXRfcm9fZmxhZ3M7CisJX191NjQgaW5jb21wYXRfZmxhZ3M7CisJX191MTYgY3N1bV90eXBlOworCV9fdTggcm9vdF9sZXZlbDsKKwlfX3U4IGNodW5rX3Jvb3RfbGV2ZWw7CisJX191OCBsb2dfcm9vdF9sZXZlbDsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gZGV2X2l0ZW07CisKKwljaGFyIGxhYmVsW0JUUkZTX0xBQkVMX1NJWkVdOworCisJLyogZnV0dXJlIGV4cGFuc2lvbiAqLworCV9fdTY0IHJlc2VydmVkWzMyXTsKKwlfX3U4IHN5c19jaHVua19hcnJheVtCVFJGU19TWVNURU1fQ0hVTktfQVJSQVlfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKiBCeXRlIHN3YXAgZnVuY3Rpb25zCisgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBfSU5MSU5FXyBzdGF0aWMgX19pbmxpbmVfXworI2Vsc2UJCQkJLyogRm9yIFdhdGNvbSBDICovCisjZGVmaW5lIF9JTkxJTkVfIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCitzdGF0aWMgX191MTYgYmxraWRfc3dhYjE2KF9fdTE2IHZhbCk7CitzdGF0aWMgX191MzIgYmxraWRfc3dhYjMyKF9fdTMyIHZhbCk7CitzdGF0aWMgX191NjQgYmxraWRfc3dhYjY0KF9fdTY0IHZhbCk7CisKKyNpZiAoKGRlZmluZWQgX19HTlVDX18pICYmIFwKKyAgICAgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pKSkKKworI2RlZmluZSBfQkxLSURfSEFWRV9BU01fQklUT1BTXworCitfSU5MSU5FXyBfX3UzMiBibGtpZF9zd2FiMzIoX191MzIgdmFsKQoreworI2lmZGVmIEVYVDJGU19SRVFVSVJFXzQ4NgorCV9fYXNtX18oImJzd2FwICUwIiA6ICI9ciIgKHZhbCkgOiAiMCIgKHZhbCkpOworI2Vsc2UKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIJLyogc3dhcCBsb3dlciBieXRlcwkqLworCQkicm9ybCAkMTYsJTBcblx0IgkvKiBzd2FwIHdvcmRzCQkqLworCQkieGNoZ2IgJWIwLCVoMCIJCS8qIHN3YXAgaGlnaGVyIGJ5dGVzCSovCisJCToiPXEiICh2YWwpCisJCTogIjAiICh2YWwpKTsKKyNlbmRpZgorCXJldHVybiB2YWw7Cit9CisKK19JTkxJTkVfIF9fdTE2IGJsa2lkX3N3YWIxNihfX3UxNiB2YWwpCit7CisJX19hc21fXygieGNoZ2IgJWIwLCVoMCIJCS8qIHN3YXAgYnl0ZXMJCSovIFwKKwkJOiAiPXEiICh2YWwpIFwKKwkJOiAgIjAiICh2YWwpKTsgXAorCQlyZXR1cm4gdmFsOworfQorCitfSU5MSU5FXyBfX3U2NCBibGtpZF9zd2FiNjQoX191NjQgdmFsKQoreworCXJldHVybiAoYmxraWRfc3dhYjMyKHZhbCA+PiAzMikgfAorCQkoKChfX3U2NCkgYmxraWRfc3dhYjMyKHZhbCAmIDB4RkZGRkZGRkZVTCkpIDw8IDMyKSk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9CTEtJRF9IQVZFX0FTTV9CSVRPUFNfKQorCitfSU5MSU5FXyAgX191MTYgYmxraWRfc3dhYjE2KF9fdTE2IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCA+PiA4KSB8ICh2YWwgPDwgOCk7Cit9CisKK19JTkxJTkVfIF9fdTMyIGJsa2lkX3N3YWIzMihfX3UzMiB2YWwpCit7CisJcmV0dXJuICgodmFsPj4yNCkgfCAoKHZhbD4+OCkmMHhGRjAwKSB8CisJCSgodmFsPDw4KSYweEZGMDAwMCkgfCAodmFsPDwyNCkpOworfQorCitfSU5MSU5FXyBfX3U2NCBibGtpZF9zd2FiNjQoX191NjQgdmFsKQoreworCXJldHVybiAoYmxraWRfc3dhYjMyKHZhbCA+PiAzMikgfAorCQkoKChfX3U2NCkgYmxraWRfc3dhYjMyKHZhbCAmIDB4RkZGRkZGRkZVTCkpIDw8IDMyKSk7Cit9CisjZW5kaWYKKworCisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgYmxraWRfbGUxNih4KSBibGtpZF9zd2FiMTYoeCkKKyNkZWZpbmUgYmxraWRfbGUzMih4KSBibGtpZF9zd2FiMzIoeCkKKyNkZWZpbmUgYmxraWRfbGU2NCh4KSBibGtpZF9zd2FiNjQoeCkKKyNkZWZpbmUgYmxraWRfYmUxNih4KSAoeCkKKyNkZWZpbmUgYmxraWRfYmUzMih4KSAoeCkKKyNkZWZpbmUgYmxraWRfYmU2NCh4KSAoeCkKKyNlbHNlCisjZGVmaW5lIGJsa2lkX2xlMTYoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2xlMzIoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2xlNjQoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2JlMTYoeCkgYmxraWRfc3dhYjE2KHgpCisjZGVmaW5lIGJsa2lkX2JlMzIoeCkgYmxraWRfc3dhYjMyKHgpCisjZGVmaW5lIGJsa2lkX2JlNjQoeCkgYmxraWRfc3dhYjY0KHgpCisjZW5kaWYKKworI3VuZGVmIF9JTkxJTkVfCisKKyNlbmRpZiAvKiBfQkxLSURfUFJPQkVfSCAqLwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvcmVhZC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjc5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9yZWFkLmMKQEAgLTAsMCArMSw0OTMgQEAKKy8qCisgKiByZWFkLmMgLSByZWFkIHRoZSBibGtpZCBjYWNoZSBmcm9tIGRpc2ssIHRvIGF2b2lkIHNjYW5uaW5nIGFsbCBkZXZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzIFRoZW9kb3JlIFkuIFRzJ28KKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMCAvKiBmb3IgaW5jbHVzaW9uIG9mIHN0cnRvdWxsICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJibGtpZFAuaCIKKyNpbmNsdWRlICJ1dWlkL3V1aWQuaCIKKworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyNkZWZpbmUgU1RSVE9VTEwgc3RydG91bGwgLyogZGVmaW5lZCBpbiBzdGRsaWIuaCBpZiB5b3UgdHJ5IGhhcmQgZW5vdWdoICovCisjZWxzZQorLyogRklYTUU6IG5lZWQgdG8gc3VwcG9ydCByZWFsIHN0cnRvdWxsIGhlcmUgKi8KKyNkZWZpbmUgU1RSVE9VTEwgc3RydG91bAorI2VuZGlmCisKKyNpZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIFRFU1RfUFJPR1JBTQorI2RlZmluZSBibGtpZF9kZWJ1Z19kdW1wX2RldihkZXYpCShkZWJ1Z19kdW1wX2RldihkZXYpKQorc3RhdGljIHZvaWQgZGVidWdfZHVtcF9kZXYoYmxraWRfZGV2IGRldik7CisjZW5kaWYKKworLyoKKyAqIEZpbGUgZm9ybWF0OgorICoKKyAqCTxkZXZpY2UgWzxOQU1FPSJ2YWx1ZSI+IC4uLl0+ZGV2aWNlX25hbWU8L2RldmljZT4KKyAqCisgKglUaGUgZm9sbG93aW5nIHRhZ3MgYXJlIHJlcXVpcmVkIGZvciBlYWNoIGVudHJ5OgorICoJPElEPSJpZCI+CXVuaXF1ZSAod2l0aGluIHRoaXMgZmlsZSkgSUQgbnVtYmVyIG9mIHRoaXMgZGV2aWNlCisgKgk8VElNRT0idGltZSI+CShhc2NpaSB0aW1lX3QpIHRpbWUgdGhpcyBlbnRyeSB3YXMgbGFzdCByZWFkIGZyb20gZGlzaworICoJPFRZUEU9InR5cGUiPgkoZGV0ZWN0ZWQpIHR5cGUgb2YgZmlsZXN5c3RlbS9kYXRhIGZvciB0aGlzIHBhcnRpdGlvbgorICoKKyAqCVRoZSBmb2xsb3dpbmcgdGFncyBtYXkgYmUgcHJlc2VudCwgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UgY29udGVudHMKKyAqCTxMQUJFTD0ibGFiZWwiPgkodXNlciBzdXBwbGllZCkgbGFiZWwgKHZvbHVtZSBuYW1lLCBldGMpCisgKgk8VVVJRD0idXVpZCI+CShnZW5lcmF0ZWQpIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIChzZXJpYWwgbm8pCisgKi8KKworc3RhdGljIGNoYXIgKnNraXBfb3Zlcl9ibGFuayhjaGFyICpjcCkKK3sKKwl3aGlsZSAoKmNwICYmIGlzc3BhY2UoKmNwKSkKKwkJY3ArKzsKKwlyZXR1cm4gY3A7Cit9CisKK3N0YXRpYyBjaGFyICpza2lwX292ZXJfd29yZChjaGFyICpjcCkKK3sKKwljaGFyIGNoOworCisJd2hpbGUgKChjaCA9ICpjcCkpIHsKKwkJLyogSWYgd2Ugc2VlIGEgYmFja3NsYXNoLCBza2lwIHRoZSBuZXh0IGNoYXJhY3RlciAqLworCQlpZiAoY2ggPT0gJ1xcJykgeworCQkJY3ArKzsKKwkJCWlmICgqY3AgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCWNwKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaXNzcGFjZShjaCkgfHwgY2ggPT0gJzwnIHx8IGNoID09ICc+JykKKwkJCWJyZWFrOworCQljcCsrOworCX0KKwlyZXR1cm4gY3A7Cit9CisKK3N0YXRpYyBjaGFyICpzdHJpcF9saW5lKGNoYXIgKmxpbmUpCit7CisJY2hhcgkqcDsKKworCWxpbmUgPSBza2lwX292ZXJfYmxhbmsobGluZSk7CisKKwlwID0gbGluZSArIHN0cmxlbihsaW5lKSAtIDE7CisKKwl3aGlsZSAoKmxpbmUpIHsKKwkJaWYgKGlzc3BhY2UoKnApKQorCQkJKnAtLSA9ICdcMCc7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBsaW5lOworfQorCisjaWYgMAorc3RhdGljIGNoYXIgKnBhcnNlX3dvcmQoY2hhciAqKmJ1ZikKK3sKKwljaGFyICp3b3JkLCAqbmV4dDsKKworCXdvcmQgPSAqYnVmOworCWlmICgqd29yZCA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCXdvcmQgPSBza2lwX292ZXJfYmxhbmsod29yZCk7CisJbmV4dCA9IHNraXBfb3Zlcl93b3JkKHdvcmQpOworCWlmICgqbmV4dCkgeworCQljaGFyICplbmQgPSBuZXh0IC0gMTsKKwkJaWYgKCplbmQgPT0gJyInIHx8ICplbmQgPT0gJ1wnJykKKwkJCSplbmQgPSAnXDAnOworCQkqbmV4dCsrID0gJ1wwJzsKKwl9CisJKmJ1ZiA9IG5leHQ7CisKKwlpZiAoKndvcmQgPT0gJyInIHx8ICp3b3JkID09ICdcJycpCisJCXdvcmQrKzsKKwlyZXR1cm4gd29yZDsKK30KKyNlbmRpZgorCisvKgorICogU3RhcnQgcGFyc2luZyBhIG5ldyBsaW5lIGZyb20gdGhlIGNhY2hlLgorICoKKyAqIGxpbmUgc3RhcnRzIHdpdGggIjxkZXZpY2UiIHJldHVybiAxIC0+IGNvbnRpbnVlIHBhcnNpbmcgbGluZQorICogbGluZSBzdGFydHMgd2l0aCAiPGZvbyIsIGVtcHR5LCBvciAjIHJldHVybiAwIC0+IHNraXAgbGluZQorICogbGluZSBzdGFydHMgd2l0aCBvdGhlciwgcmV0dXJuIC1CTEtJRF9FUlJfQ0FDSEUgLT4gZXJyb3IKKyAqLworc3RhdGljIGludCBwYXJzZV9zdGFydChjaGFyICoqY3ApCit7CisJY2hhciAqcDsKKworCXAgPSBzdHJpcF9saW5lKCpjcCk7CisKKwkvKiBTa2lwIGNvbW1lbnQgb3IgYmxhbmsgbGluZXMuICBXZSBjYW4ndCBqdXN0IE5VTCB0aGUgZmlyc3QgJyMnIGNoYXIsCisJICogaW4gY2FzZSBpdCBpcyBpbnNpZGUgcXVvdGVzLCBvciBlc2NhcGVkLgorCSAqLworCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICcjJykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXN0cm5jbXAocCwgIjxkZXZpY2UiLCA3KSkgeworCQlEQkcoREVCVUdfUkVBRCwgcHJpbnRmKCJmb3VuZCBkZXZpY2UgaGVhZGVyOiAlOHNcbiIsIHApKTsKKwkJcCArPSA3OworCisJCSpjcCA9IHA7CisJCXJldHVybiAxOworCX0KKworCWlmICgqcCA9PSAnPCcpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1CTEtJRF9FUlJfQ0FDSEU7Cit9CisKKy8qIENvbnN1bWUgdGhlIHJlbWFpbmluZyBYTUwgb24gdGhlIGxpbmUgKGNvc21ldGljIG9ubHkpICovCitzdGF0aWMgaW50IHBhcnNlX2VuZChjaGFyICoqY3ApCit7CisJKmNwID0gc2tpcF9vdmVyX2JsYW5rKCpjcCk7CisKKwlpZiAoIXN0cm5jbXAoKmNwLCAiPC9kZXZpY2U+IiwgOSkpIHsKKwkJREJHKERFQlVHX1JFQUQsIHByaW50ZigiZm91bmQgZGV2aWNlIHRyYWlsZXIgJTlzXG4iLCAqY3ApKTsKKwkJKmNwICs9IDk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtQkxLSURfRVJSX0NBQ0hFOworfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgZGV2aWNlIHN0cnVjdCB3aXRoIGRldmljZSBuYW1lIGZpbGxlZCBpbi4gIFdpbGwgaGFuZGxlCisgKiBmaW5kaW5nIHRoZSBkZXZpY2Ugb24gbGluZXMgb2YgdGhlIGZvcm06CisgKiA8ZGV2aWNlIGZvbz1iYXI+ZGV2bmFtZTwvZGV2aWNlPgorICogPGRldmljZT5kZXZuYW1lPGZvbz5iYXI8L2Zvbz48L2RldmljZT4KKyAqLworc3RhdGljIGludCBwYXJzZV9kZXYoYmxraWRfY2FjaGUgY2FjaGUsIGJsa2lkX2RldiAqZGV2LCBjaGFyICoqY3ApCit7CisJY2hhciAqc3RhcnQsICp0bXAsICplbmQsICpuYW1lOworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IHBhcnNlX3N0YXJ0KGNwKSkgPD0gMCkKKwkJcmV0dXJuIHJldDsKKworCXN0YXJ0ID0gdG1wID0gc3RyY2hyKCpjcCwgJz4nKTsKKwlpZiAoIXN0YXJ0KSB7CisJCURCRyhERUJVR19SRUFELAorCQkgICAgcHJpbnRmKCJibGtpZDogc2hvcnQgbGluZSBwYXJzaW5nIGRldjogJXNcbiIsICpjcCkpOworCQlyZXR1cm4gLUJMS0lEX0VSUl9DQUNIRTsKKwl9CisJc3RhcnQgPSBza2lwX292ZXJfYmxhbmsoc3RhcnQgKyAxKTsKKwllbmQgPSBza2lwX292ZXJfd29yZChzdGFydCk7CisKKwlEQkcoREVCVUdfUkVBRCwgcHJpbnRmKCJkZXZpY2Ugc2hvdWxkIGJlICUqc1xuIiwKKwkJCSAgICAgICAoaW50KShlbmQgLSBzdGFydCksIHN0YXJ0KSk7CisKKwlpZiAoKipjcCA9PSAnPicpCisJCSpjcCA9IGVuZDsKKwllbHNlCisJCSgqY3ApKys7CisKKwkqdG1wID0gJ1wwJzsKKworCWlmICghKHRtcCA9IHN0cnJjaHIoZW5kLCAnPCcpKSB8fCBwYXJzZV9lbmQoJnRtcCkgPCAwKSB7CisJCURCRyhERUJVR19SRUFELAorCQkgICAgcHJpbnRmKCJibGtpZDogbWlzc2luZyA8L2RldmljZT4gZW5kaW5nOiAlc1xuIiwgZW5kKSk7CisJfSBlbHNlIGlmICh0bXApCisJCSp0bXAgPSAnXDAnOworCisJaWYgKGVuZCAtIHN0YXJ0IDw9IDEpIHsKKwkJREJHKERFQlVHX1JFQUQsIHByaW50ZigiYmxraWQ6IGVtcHR5IGRldmljZSBuYW1lOiAlc1xuIiwgKmNwKSk7CisJCXJldHVybiAtQkxLSURfRVJSX0NBQ0hFOworCX0KKworCW5hbWUgPSBibGtpZF9zdHJuZHVwKHN0YXJ0LCBlbmQtc3RhcnQpOworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtQkxLSURfRVJSX01FTTsKKworCURCRyhERUJVR19SRUFELCBwcmludGYoImZvdW5kIGRldiAlc1xuIiwgbmFtZSkpOworCisJaWYgKCEoKmRldiA9IGJsa2lkX2dldF9kZXYoY2FjaGUsIG5hbWUsIEJMS0lEX0RFVl9DUkVBVEUpKSkgeworCQlmcmVlKG5hbWUpOworCQlyZXR1cm4gLUJMS0lEX0VSUl9NRU07CisJfQorCisJZnJlZShuYW1lKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEV4dHJhY3QgYSB0YWcgb2YgdGhlIGZvcm0gTkFNRT0idmFsdWUiIGZyb20gdGhlIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdG9rZW4oY2hhciAqKm5hbWUsIGNoYXIgKip2YWx1ZSwgY2hhciAqKmNwKQoreworCWNoYXIgKmVuZDsKKworCWlmICghbmFtZSB8fCAhdmFsdWUgfHwgIWNwKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWlmICghKCp2YWx1ZSA9IHN0cmNocigqY3AsICc9JykpKQorCQlyZXR1cm4gMDsKKworCSoqdmFsdWUgPSAnXDAnOworCSpuYW1lID0gc3RyaXBfbGluZSgqY3ApOworCSp2YWx1ZSA9IHNraXBfb3Zlcl9ibGFuaygqdmFsdWUgKyAxKTsKKworCWlmICgqKnZhbHVlID09ICciJykgeworCQllbmQgPSBzdHJjaHIoKnZhbHVlICsgMSwgJyInKTsKKwkJaWYgKCFlbmQpIHsKKwkJCURCRyhERUJVR19SRUFELAorCQkJICAgIHByaW50ZigidW5iYWxhbmNlZCBxdW90ZXMgYXQ6ICVzXG4iLCAqdmFsdWUpKTsKKwkJCSpjcCA9ICp2YWx1ZTsKKwkJCXJldHVybiAtQkxLSURfRVJSX0NBQ0hFOworCQl9CisJCSgqdmFsdWUpKys7CisJCSplbmQgPSAnXDAnOworCQllbmQrKzsKKwl9IGVsc2UgeworCQllbmQgPSBza2lwX292ZXJfd29yZCgqdmFsdWUpOworCQlpZiAoKmVuZCkgeworCQkJKmVuZCA9ICdcMCc7CisJCQllbmQrKzsKKwkJfQorCX0KKwkqY3AgPSBlbmQ7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEV4dHJhY3QgYSB0YWcgb2YgdGhlIGZvcm0gPE5BTUU+dmFsdWU8L05BTUU+IGZyb20gdGhlIGxpbmUuCisgKi8KKy8qCitzdGF0aWMgaW50IHBhcnNlX3htbChjaGFyICoqbmFtZSwgY2hhciAqKnZhbHVlLCBjaGFyICoqY3ApCit7CisJY2hhciAqZW5kOworCisJaWYgKCFuYW1lIHx8ICF2YWx1ZSB8fCAhY3ApCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJKm5hbWUgPSBzdHJpcF9saW5lKCpjcCk7CisKKwlpZiAoKCpuYW1lKVswXSAhPSAnPCcgfHwgKCpuYW1lKVsxXSA9PSAnLycpCisJCXJldHVybiAwOworCisJRklYTUU6IGZpbmlzaCB0aGlzLgorfQorKi8KKworLyoKKyAqIEV4dHJhY3QgYSB0YWcgZnJvbSB0aGUgbGluZS4KKyAqCisgKiBSZXR1cm4gMSBpZiBhIHZhbGlkIHRhZyB3YXMgZm91bmQuCisgKiBSZXR1cm4gMCBpZiBubyB0YWcgZm91bmQuCisgKiBSZXR1cm4gLXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdGFnKGJsa2lkX2NhY2hlIGNhY2hlLCBibGtpZF9kZXYgZGV2LCBjaGFyICoqY3ApCit7CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgcmV0OworCisJaWYgKCFjYWNoZSB8fCAhZGV2KQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWlmICgocmV0ID0gcGFyc2VfdG9rZW4oJm5hbWUsICZ2YWx1ZSwgY3ApKSA8PSAwIC8qICYmCisJICAgIChyZXQgPSBwYXJzZV94bWwoJm5hbWUsICZ2YWx1ZSwgY3ApKSA8PSAwICovKQorCQlyZXR1cm4gcmV0OworCisJLyogU29tZSB0YWdzIGFyZSBzdG9yZWQgZGlyZWN0bHkgaW4gdGhlIGRldmljZSBzdHJ1Y3QgKi8KKwlpZiAoIXN0cmNtcChuYW1lLCAiREVWTk8iKSkKKwkJZGV2LT5iaWRfZGV2bm8gPSBTVFJUT1VMTCh2YWx1ZSwgMCwgMCk7CisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiUFJJIikpCisJCWRldi0+YmlkX3ByaSA9IHN0cnRvbCh2YWx1ZSwgMCwgMCk7CisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiVElNRSIpKQorCQlkZXYtPmJpZF90aW1lID0gU1RSVE9VTEwodmFsdWUsIDAsIDApOworCWVsc2UKKwkJcmV0ID0gYmxraWRfc2V0X3RhZyhkZXYsIG5hbWUsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKworCURCRyhERUJVR19SRUFELCBwcmludGYoIiAgICB0YWc6ICVzPVwiJXNcIlxuIiwgbmFtZSwgdmFsdWUpKTsKKworCXJldHVybiByZXQgPCAwID8gcmV0IDogMTsKK30KKworLyoKKyAqIFBhcnNlIGEgc2luZ2xlIGxpbmUgb2YgZGF0YSwgYW5kIHJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkZXYgc3RydWN0LgorICogQWRkIHRoZSBuZXcgZGV2aWNlIHRvIHRoZSBjYWNoZSBzdHJ1Y3QsIGlmIG9uZSB3YXMgcmVhZC4KKyAqCisgKiBMaW5lcyBhcmUgb2YgdGhlIGZvcm0gPGRldmljZSBbVEFHPSJ2YWx1ZSIgLi4uXT4vZGV2L2ZvbzwvZGV2aWNlPgorICoKKyAqIFJldHVybnMgLXZlIHZhbHVlIG9uIGVycm9yLgorICogUmV0dXJucyAwIG90aGVyd2lzZS4KKyAqIElmIGEgdmFsaWQgZGV2aWNlIHdhcyByZWFkLCAqZGV2X3AgaXMgbm9uLU5VTEwsIG90aGVyd2lzZSBpdCBpcyBOVUxMCisgKiAoZS5nLiBjb21tZW50IGxpbmVzLCB1bmtub3duIFhNTCBjb250ZW50LCBldGMpLgorICovCitzdGF0aWMgaW50IGJsa2lkX3BhcnNlX2xpbmUoYmxraWRfY2FjaGUgY2FjaGUsIGJsa2lkX2RldiAqZGV2X3AsIGNoYXIgKmNwKQoreworCWJsa2lkX2RldiBkZXY7CisJaW50IHJldDsKKworCWlmICghY2FjaGUgfHwgIWRldl9wKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCSpkZXZfcCA9IE5VTEw7CisKKwlEQkcoREVCVUdfUkVBRCwgcHJpbnRmKCJsaW5lOiAlc1xuIiwgY3ApKTsKKworCWlmICgocmV0ID0gcGFyc2VfZGV2KGNhY2hlLCBkZXZfcCwgJmNwKSkgPD0gMCkKKwkJcmV0dXJuIHJldDsKKworCWRldiA9ICpkZXZfcDsKKworCXdoaWxlICgocmV0ID0gcGFyc2VfdGFnKGNhY2hlLCBkZXYsICZjcCkpID4gMCkgeworCQk7CisJfQorCisJaWYgKGRldi0+YmlkX3R5cGUgPT0gTlVMTCkgeworCQlEQkcoREVCVUdfUkVBRCwKKwkJICAgIHByaW50ZigiYmxraWQ6IGRldmljZSAlcyBoYXMgbm8gVFlQRVxuIixkZXYtPmJpZF9uYW1lKSk7CisJCWJsa2lkX2ZyZWVfZGV2KGRldik7CisJfQorCisJREJHKERFQlVHX1JFQUQsIGJsa2lkX2RlYnVnX2R1bXBfZGV2KGRldikpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIGFuZCByZXR1cm4gdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIG9yCisgKiBhIG5ld2x5IGFsbG9jYXRlZCBjYWNoZSBzdHJ1Y3QuICBJZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCByZXR1cm4gYQorICogbmV3IGVtcHR5IGNhY2hlIHN0cnVjdC4KKyAqLwordm9pZCBibGtpZF9yZWFkX2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlKQoreworCUZJTEUgKmZpbGU7CisJY2hhciBidWZbNDA5Nl07CisJaW50IGZkLCBsaW5lbm8gPSAwOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCB0aGVuIHdlIGp1c3QgcmV0dXJuIGFuIGVtcHR5CisJICogc3RydWN0IHNvIHRoYXQgdGhlIGNhY2hlIGNhbiBiZSBwb3B1bGF0ZWQuCisJICovCisJaWYgKChmZCA9IG9wZW4oY2FjaGUtPmJpY19maWxlbmFtZSwgT19SRE9OTFkpKSA8IDApCisJCXJldHVybjsKKwlpZiAoZnN0YXQoZmQsICZzdCkgPCAwKQorCQlnb3RvIGVycm91dDsKKwlpZiAoKHN0LnN0X210aW1lID09IGNhY2hlLT5iaWNfZnRpbWUpIHx8CisJICAgIChjYWNoZS0+YmljX2ZsYWdzICYgQkxLSURfQklDX0ZMX0NIQU5HRUQpKSB7CisJCURCRyhERUJVR19DQUNIRSwgcHJpbnRmKCJza2lwcGluZyByZS1yZWFkIG9mICVzXG4iLAorCQkJCQljYWNoZS0+YmljX2ZpbGVuYW1lKSk7CisJCWdvdG8gZXJyb3V0OworCX0KKworCURCRyhERUJVR19DQUNIRSwgcHJpbnRmKCJyZWFkaW5nIGNhY2hlIGZpbGUgJXNcbiIsCisJCQkJY2FjaGUtPmJpY19maWxlbmFtZSkpOworCisJZmlsZSA9IGZkb3BlbihmZCwgInIiKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gZXJyb3V0OworCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZpbGUpKSB7CisJCWJsa2lkX2RldiBkZXY7CisJCXVuc2lnbmVkIGludCBlbmQ7CisKKwkJbGluZW5vKys7CisJCWlmIChidWZbMF0gPT0gMCkKKwkJCWNvbnRpbnVlOworCQllbmQgPSBzdHJsZW4oYnVmKSAtIDE7CisJCS8qIENvbnRpbnVlIHJlYWRpbmcgbmV4dCBsaW5lIGlmIGl0IGVuZHMgd2l0aCBhIGJhY2tzbGFzaCAqLworCQl3aGlsZSAoYnVmW2VuZF0gPT0gJ1xcJyAmJiBlbmQgPCBzaXplb2YoYnVmKSAtIDIgJiYKKwkJICAgICAgIGZnZXRzKGJ1ZiArIGVuZCwgc2l6ZW9mKGJ1ZikgLSBlbmQsIGZpbGUpKSB7CisJCQllbmQgPSBzdHJsZW4oYnVmKSAtIDE7CisJCQlsaW5lbm8rKzsKKwkJfQorCisJCWlmIChibGtpZF9wYXJzZV9saW5lKGNhY2hlLCAmZGV2LCBidWYpIDwgMCkgeworCQkJREJHKERFQlVHX1JFQUQsCisJCQkgICAgcHJpbnRmKCJibGtpZDogYmFkIGZvcm1hdCBvbiBsaW5lICVkXG4iLCBsaW5lbm8pKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCWZjbG9zZShmaWxlKTsKKworCS8qCisJICogSW5pdGlhbGx5IHdlIGRvIG5vdCBuZWVkIHRvIHdyaXRlIG91dCB0aGUgY2FjaGUgZmlsZS4KKwkgKi8KKwljYWNoZS0+YmljX2ZsYWdzICY9IH5CTEtJRF9CSUNfRkxfQ0hBTkdFRDsKKwljYWNoZS0+YmljX2Z0aW1lID0gc3Quc3RfbXRpbWU7CisKKwlyZXR1cm47CitlcnJvdXQ6CisJY2xvc2UoZmQpOworCXJldHVybjsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQorc3RhdGljIHZvaWQgZGVidWdfZHVtcF9kZXYoYmxraWRfZGV2IGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRmKCIgIGRldjogTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIiAgZGV2OiBuYW1lID0gJXNcbiIsIGRldi0+YmlkX25hbWUpOworCXByaW50ZigiICBkZXY6IERFVk5PPVwiMHglMGxseFwiXG4iLCAobG9uZyBsb25nKWRldi0+YmlkX2Rldm5vKTsKKwlwcmludGYoIiAgZGV2OiBUSU1FPVwiJWxsZFwiXG4iLCAobG9uZyBsb25nKWRldi0+YmlkX3RpbWUpOworCXByaW50ZigiICBkZXY6IFBSST1cIiVkXCJcbiIsIGRldi0+YmlkX3ByaSk7CisJcHJpbnRmKCIgIGRldjogZmxhZ3MgPSAweCUwOFhcbiIsIGRldi0+YmlkX2ZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmRldi0+YmlkX3RhZ3MpIHsKKwkJYmxraWRfdGFnIHRhZyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsIGJpdF90YWdzKTsKKwkJaWYgKHRhZykKKwkJCXByaW50ZigiICAgIHRhZzogJXM9XCIlc1wiXG4iLCB0YWctPmJpdF9uYW1lLAorCQkJICAgICAgIHRhZy0+Yml0X3ZhbCk7CisJCWVsc2UKKwkJCXByaW50ZigiICAgIHRhZzogTlVMTFxuIik7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKmFyZ3YpCit7CisJYmxraWRfY2FjaGUgY2FjaGUgPSBOVUxMOworCWludCByZXQ7CisKKwlibGtpZF9kZWJ1Z19tYXNrID0gREVCVUdfQUxMOworCWlmIChhcmdjID4gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbZmlsZW5hbWVdXG4iCisJCQkiVGVzdCBwYXJzaW5nIG9mIHRoZSBjYWNoZSAoZmlsZW5hbWUpXG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBhcmd2WzFdKSkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yICVkIHJlYWRpbmcgY2FjaGUgZmlsZSAlc1xuIiwgcmV0LAorCQkJYXJndlsxXSA/IGFyZ3ZbMV0gOiBCTEtJRF9DQUNIRV9GSUxFKTsKKworCWJsa2lkX3B1dF9jYWNoZShjYWNoZSk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9yZXNvbHZlLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9yZXNvbHZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZTI2OAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Jlc29sdmUuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIHJlc29sdmUuYyAtIHJlc29sdmUgbmFtZXMgYW5kIHRhZ3MgaW50byBzcGVjaWZpYyBkZXZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzIFRoZW9kb3JlIFRzJ28uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJibGtpZFAuaCIKKworLyoKKyAqIEZpbmQgYSB0YWduYW1lIChlLmcuIExBQkVMIG9yIFVVSUQpIG9uIGEgc3BlY2lmaWMgZGV2aWNlLgorICovCitjaGFyICpibGtpZF9nZXRfdGFnX3ZhbHVlKGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICp0YWduYW1lLAorCQkJICBjb25zdCBjaGFyICpkZXZuYW1lKQoreworCWJsa2lkX3RhZyBmb3VuZDsKKwlibGtpZF9kZXYgZGV2OworCWJsa2lkX2NhY2hlIGMgPSBjYWNoZTsKKwljaGFyICpyZXQgPSBOVUxMOworCisJREJHKERFQlVHX1JFU09MVkUsIHByaW50ZigibG9va2luZyBmb3IgJXMgb24gJXNcbiIsIHRhZ25hbWUsIGRldm5hbWUpKTsKKworCWlmICghZGV2bmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWNhY2hlKSB7CisJCWlmIChibGtpZF9nZXRfY2FjaGUoJmMsIE5VTEwpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmICgoZGV2ID0gYmxraWRfZ2V0X2RldihjLCBkZXZuYW1lLCBCTEtJRF9ERVZfTk9STUFMKSkgJiYKKwkgICAgKGZvdW5kID0gYmxraWRfZmluZF90YWdfZGV2KGRldiwgdGFnbmFtZSkpKQorCQlyZXQgPSBibGtpZF9zdHJkdXAoZm91bmQtPmJpdF92YWwpOworCisJaWYgKCFjYWNoZSkKKwkJYmxraWRfcHV0X2NhY2hlKGMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIExvY2F0ZSBhIGRldmljZSBuYW1lIGZyb20gYSB0b2tlbiAoTkFNRT12YWx1ZSBzdHJpbmcpLCBvciAobmFtZSwgdmFsdWUpCisgKiBwYWlyLiAgSW4gdGhlIGNhc2Ugb2YgYSB0b2tlbiwgdmFsdWUgaXMgaWdub3JlZC4gIElmIHRoZSAidG9rZW4iIGlzIG5vdAorICogb2YgdGhlIGZvcm0gIk5BTUU9dmFsdWUiIGFuZCB0aGVyZSBpcyBubyB2YWx1ZSBnaXZlbiwgdGhlbiBpdCBpcyBhc3N1bWVkCisgKiB0byBiZSB0aGUgYWN0dWFsIGRldm5hbWUgYW5kIGEgY29weSBpcyByZXR1cm5lZC4KKyAqLworY2hhciAqYmxraWRfZ2V0X2Rldm5hbWUoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKnRva2VuLAorCQkJY29uc3QgY2hhciAqdmFsdWUpCit7CisJYmxraWRfZGV2IGRldjsKKwlibGtpZF9jYWNoZSBjID0gY2FjaGU7CisJY2hhciAqdCA9IDAsICp2ID0gMDsKKwljaGFyICpyZXQgPSBOVUxMOworCisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWNhY2hlKSB7CisJCWlmIChibGtpZF9nZXRfY2FjaGUoJmMsIE5VTEwpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCURCRyhERUJVR19SRVNPTFZFLAorCSAgICBwcmludGYoImxvb2tpbmcgZm9yICVzJXMlcyAlc1xuIiwgdG9rZW4sIHZhbHVlID8gIj0iIDogIiIsCisJCSAgIHZhbHVlID8gdmFsdWUgOiAiIiwgY2FjaGUgPyAiaW4gY2FjaGUiIDogImZyb20gZGlzayIpKTsKKworCWlmICghdmFsdWUpIHsKKwkJaWYgKCFzdHJjaHIodG9rZW4sICc9JykpIHsKKwkJCXJldCA9IGJsa2lkX3N0cmR1cCh0b2tlbik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlibGtpZF9wYXJzZV90YWdfc3RyaW5nKHRva2VuLCAmdCwgJnYpOworCQlpZiAoIXQgfHwgIXYpCisJCQlnb3RvIG91dDsKKwkJdG9rZW4gPSB0OworCQl2YWx1ZSA9IHY7CisJfQorCisJZGV2ID0gYmxraWRfZmluZF9kZXZfd2l0aF90YWcoYywgdG9rZW4sIHZhbHVlKTsKKwlpZiAoIWRldikKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBibGtpZF9zdHJkdXAoYmxraWRfZGV2X2Rldm5hbWUoZGV2KSk7CisKK291dDoKKwlmcmVlKHQpOworCWZyZWUodik7CisJaWYgKCFjYWNoZSkgeworCQlibGtpZF9wdXRfY2FjaGUoYyk7CisJfQorCXJldHVybiAocmV0KTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnZhbHVlOworCWJsa2lkX2NhY2hlIGNhY2hlOworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoYXJnYyAhPSAyICYmIGFyZ2MgIT0gMykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOlx0JXMgdGFnbmFtZT12YWx1ZVxuIgorCQkJIlx0JXMgdGFnbmFtZSBkZXZuYW1lXG4iCisJCQkiRmluZCB3aGljaCBkZXZpY2UgaG9sZHMgYSBnaXZlbiB0b2tlbiBvclxuIgorCQkJIkZpbmQgd2hhdCB0aGUgdmFsdWUgb2YgYSB0YWcgaXMgaW4gYSBkZXZpY2VcbiIsCisJCQlhcmd2WzBdLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsICIvZGV2L251bGwiKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBnZXQgYmxraWQgY2FjaGVcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChhcmd2WzJdKSB7CisJCXZhbHVlID0gYmxraWRfZ2V0X3RhZ192YWx1ZShjYWNoZSwgYXJndlsxXSwgYXJndlsyXSk7CisJCXByaW50ZigiJXMgaGFzIHRhZyAlcz0lc1xuIiwgYXJndlsyXSwgYXJndlsxXSwKKwkJICAgICAgIHZhbHVlID8gdmFsdWUgOiAiPG1pc3Npbmc+Iik7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSBibGtpZF9nZXRfZGV2bmFtZShjYWNoZSwgYXJndlsxXSwgTlVMTCk7CisJCXByaW50ZigiJXMgaGFzIHRhZyAlc1xuIiwgdmFsdWUgPyB2YWx1ZSA6ICI8bm9uZT4iLCBhcmd2WzFdKTsKKwl9CisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gdmFsdWUgPyAwIDogMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvc2F2ZS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvc2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDJlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC9zYXZlLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBzYXZlLmMgLSB3cml0ZSB0aGUgY2FjaGUgc3RydWN0IHRvIGRpc2sKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfTUtERVZfSAorI2luY2x1ZGUgPHN5cy9ta2Rldi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgImJsa2lkUC5oIgorCitzdGF0aWMgaW50IHNhdmVfZGV2KGJsa2lkX2RldiBkZXYsIEZJTEUgKmZpbGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlmICghZGV2IHx8IGRldi0+YmlkX25hbWVbMF0gIT0gJy8nKQorCQlyZXR1cm4gMDsKKworCURCRyhERUJVR19TQVZFLAorCSAgICBwcmludGYoImRldmljZSAlcywgdHlwZSAlc1xuIiwgZGV2LT5iaWRfbmFtZSwgZGV2LT5iaWRfdHlwZSA/CisJCSAgIGRldi0+YmlkX3R5cGUgOiAiKG51bGwpIikpOworCisJZnByaW50ZihmaWxlLAorCQkiPGRldmljZSBERVZOTz1cIjB4JTA0bHhcIiBUSU1FPVwiJWxkXCIiLAorCQkodW5zaWduZWQgbG9uZykgZGV2LT5iaWRfZGV2bm8sIChsb25nKSBkZXYtPmJpZF90aW1lKTsKKwlpZiAoZGV2LT5iaWRfcHJpKQorCQlmcHJpbnRmKGZpbGUsICIgUFJJPVwiJWRcIiIsIGRldi0+YmlkX3ByaSk7CisJbGlzdF9mb3JfZWFjaChwLCAmZGV2LT5iaWRfdGFncykgeworCQlibGtpZF90YWcgdGFnID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywgYml0X3RhZ3MpOworCQlmcHJpbnRmKGZpbGUsICIgJXM9XCIlc1wiIiwgdGFnLT5iaXRfbmFtZSx0YWctPmJpdF92YWwpOworCX0KKwlmcHJpbnRmKGZpbGUsICI+JXM8L2RldmljZT5cbiIsIGRldi0+YmlkX25hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgdGhlIGNhY2hlIHN0cnVjdCB0byB0aGUgY2FjaGUgZmlsZSBvbiBkaXNrLgorICovCitpbnQgYmxraWRfZmx1c2hfY2FjaGUoYmxraWRfY2FjaGUgY2FjaGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwljaGFyICp0bXAgPSBOVUxMOworCWNvbnN0IGNoYXIgKm9wZW5lZCA9IE5VTEw7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJRklMRSAqZmlsZSA9IE5VTEw7CisJaW50IGZkLCByZXQgPSAwOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlpZiAobGlzdF9lbXB0eSgmY2FjaGUtPmJpY19kZXZzKSB8fAorCSAgICAhKGNhY2hlLT5iaWNfZmxhZ3MgJiBCTEtJRF9CSUNfRkxfQ0hBTkdFRCkpIHsKKwkJREJHKERFQlVHX1NBVkUsIHByaW50Zigic2tpcHBpbmcgY2FjaGUgZmlsZSB3cml0ZVxuIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmaWxlbmFtZSA9IGNhY2hlLT5iaWNfZmlsZW5hbWUgPyBjYWNoZS0+YmljX2ZpbGVuYW1lOiBCTEtJRF9DQUNIRV9GSUxFOworCisJLyogSWYgd2UgY2FuJ3Qgd3JpdGUgdG8gdGhlIGNhY2hlIGZpbGUsIHRoZW4gZG9uJ3QgZXZlbiB0cnkgKi8KKwlpZiAoKChyZXQgPSBzdGF0KGZpbGVuYW1lLCAmc3QpKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB8fAorCSAgICAocmV0ID09IDAgJiYgYWNjZXNzKGZpbGVuYW1lLCBXX09LKSA8IDApKSB7CisJCURCRyhERUJVR19TQVZFLAorCQkgICAgcHJpbnRmKCJjYW4ndCB3cml0ZSB0byBjYWNoZSBmaWxlICVzXG4iLCBmaWxlbmFtZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRyeSBhbmQgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHNvCisJICogdGhhdCBpbiBjYXNlIG9mIGVycm9yIHdlIGRvbid0IG92ZXJ3cml0ZSB0aGUgY2FjaGUgZmlsZS4KKwkgKiBJZiB0aGUgY2FjaGUgZmlsZSBkb2Vzbid0IHlldCBleGlzdCwgaXQgaXNuJ3QgYSByZWd1bGFyCisJICogZmlsZSAoZS5nLiAvZGV2L251bGwgb3IgYSBzb2NrZXQpLCBvciB3ZSBjb3VsZG4ndCBjcmVhdGUKKwkgKiBhIHRlbXBvcmFyeSBmaWxlIHRoZW4gd2Ugb3BlbiBpdCBkaXJlY3RseS4KKwkgKi8KKwlpZiAocmV0ID09IDAgJiYgU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQl0bXAgPSBtYWxsb2Moc3RybGVuKGZpbGVuYW1lKSArIDgpOworCQlpZiAodG1wKSB7CisJCQlzcHJpbnRmKHRtcCwgIiVzLVhYWFhYWCIsIGZpbGVuYW1lKTsKKwkJCWZkID0gbWtzdGVtcCh0bXApOworCQkJaWYgKGZkID49IDApIHsKKwkJCQlmaWxlID0gZmRvcGVuKGZkLCAidyIpOworCQkJCW9wZW5lZCA9IHRtcDsKKwkJCX0KKwkJCWZjaG1vZChmZCwgMDY0NCk7CisJCX0KKwl9CisKKwlpZiAoIWZpbGUpIHsKKwkJZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOworCQlvcGVuZWQgPSBmaWxlbmFtZTsKKwl9CisKKwlEQkcoREVCVUdfU0FWRSwKKwkgICAgcHJpbnRmKCJ3cml0aW5nIGNhY2hlIGZpbGUgJXMgKHJlYWxseSAlcylcbiIsCisJCSAgIGZpbGVuYW1lLCBvcGVuZWQpKTsKKworCWlmICghZmlsZSkgeworCQlyZXQgPSBlcnJubzsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaChwLCAmY2FjaGUtPmJpY19kZXZzKSB7CisJCWJsa2lkX2RldiBkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LCBiaWRfZGV2cyk7CisJCWlmICghZGV2LT5iaWRfdHlwZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHJldCA9IHNhdmVfZGV2KGRldiwgZmlsZSkpIDwgMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChyZXQgPj0gMCkgeworCQljYWNoZS0+YmljX2ZsYWdzICY9IH5CTEtJRF9CSUNfRkxfQ0hBTkdFRDsKKwkJcmV0ID0gMTsKKwl9CisKKwlmY2xvc2UoZmlsZSk7CisJaWYgKG9wZW5lZCAhPSBmaWxlbmFtZSkgeworCQlpZiAocmV0IDwgMCkgeworCQkJdW5saW5rKG9wZW5lZCk7CisJCQlEQkcoREVCVUdfU0FWRSwKKwkJCSAgICBwcmludGYoInVubGlua2VkIHRlbXAgY2FjaGUgJXNcbiIsIG9wZW5lZCkpOworCQl9IGVsc2UgeworCQkJY2hhciAqYmFja3VwOworCisJCQliYWNrdXAgPSBtYWxsb2Moc3RybGVuKGZpbGVuYW1lKSArIDUpOworCQkJaWYgKGJhY2t1cCkgeworCQkJCXNwcmludGYoYmFja3VwLCAiJXMub2xkIiwgZmlsZW5hbWUpOworCQkJCXVubGluayhiYWNrdXApOworCQkJCWxpbmsoZmlsZW5hbWUsIGJhY2t1cCk7CisJCQkJZnJlZShiYWNrdXApOworCQkJfQorCQkJcmVuYW1lKG9wZW5lZCwgZmlsZW5hbWUpOworCQkJREJHKERFQlVHX1NBVkUsCisJCQkgICAgcHJpbnRmKCJtb3ZlZCB0ZW1wIGNhY2hlICVzXG4iLCBvcGVuZWQpKTsKKwkJfQorCX0KKworZXJyb3V0OgorCWZyZWUodG1wKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgVEVTVF9QUk9HUkFNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxraWRfY2FjaGUgY2FjaGUgPSBOVUxMOworCWludCByZXQ7CisKKwlibGtpZF9kZWJ1Z19tYXNrID0gREVCVUdfQUxMOworCWlmIChhcmdjID4gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbZmlsZW5hbWVdXG4iCisJCQkiVGVzdCBsb2FkaW5nL3NhdmluZyBhIGNhY2hlIChmaWxlbmFtZSlcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgIi9kZXYvbnVsbCIpKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGNyZWF0aW5nIGNhY2hlICglZClcbiIsCisJCQlhcmd2WzBdLCByZXQpOworCQlleGl0KDEpOworCX0KKwlpZiAoKHJldCA9IGJsa2lkX3Byb2JlX2FsbChjYWNoZSkpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yICglZCkgcHJvYmluZyBkZXZpY2VzXG4iLCByZXQpOworCQlleGl0KDEpOworCX0KKwljYWNoZS0+YmljX2ZpbGVuYW1lID0gYmxraWRfc3RyZHVwKGFyZ3ZbMV0pOworCisJaWYgKChyZXQgPSBibGtpZF9mbHVzaF9jYWNoZShjYWNoZSkpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yICglZCkgc2F2aW5nIGNhY2hlXG4iLCByZXQpOworCQlleGl0KDEpOworCX0KKworCWJsa2lkX3B1dF9jYWNoZShjYWNoZSk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90YWcuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3RhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOWVmODkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90YWcuYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIHRhZy5jIC0gYWxsb2NhdGlvbi9pbml0aWFsaXphdGlvbi9mcmVlIHJvdXRpbmVzIGZvciB0YWcgc3RydWN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYmxraWRQLmgiCisKK3N0YXRpYyBibGtpZF90YWcgYmxraWRfbmV3X3RhZyh2b2lkKQoreworCWJsa2lkX3RhZyB0YWc7CisKKwlpZiAoISh0YWcgPSAoYmxraWRfdGFnKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnKSkpKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTElTVF9IRUFEKCZ0YWctPmJpdF90YWdzKTsKKwlJTklUX0xJU1RfSEVBRCgmdGFnLT5iaXRfbmFtZXMpOworCisJcmV0dXJuIHRhZzsKK30KKworI2lmZGVmIENPTkZJR19CTEtJRF9ERUJVRwordm9pZCBibGtpZF9kZWJ1Z19kdW1wX3RhZyhibGtpZF90YWcgdGFnKQoreworCWlmICghdGFnKSB7CisJCXByaW50ZigiICAgIHRhZzogTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIiAgICB0YWc6ICVzPVwiJXNcIlxuIiwgdGFnLT5iaXRfbmFtZSwgdGFnLT5iaXRfdmFsKTsKK30KKyNlbmRpZgorCit2b2lkIGJsa2lkX2ZyZWVfdGFnKGJsa2lkX3RhZyB0YWcpCit7CisJaWYgKCF0YWcpCisJCXJldHVybjsKKworCURCRyhERUJVR19UQUcsIHByaW50ZigiICAgIGZyZWVpbmcgdGFnICVzPSVzXG4iLCB0YWctPmJpdF9uYW1lLAorCQkgICB0YWctPmJpdF92YWwgPyB0YWctPmJpdF92YWwgOiAiKE5VTEwpIikpOworCURCRyhERUJVR19UQUcsIGJsa2lkX2RlYnVnX2R1bXBfdGFnKHRhZykpOworCisJbGlzdF9kZWwoJnRhZy0+Yml0X3RhZ3MpOwkvKiBsaXN0IG9mIHRhZ3MgZm9yIHRoaXMgZGV2aWNlICovCisJbGlzdF9kZWwoJnRhZy0+Yml0X25hbWVzKTsJLyogbGlzdCBvZiB0YWdzIHdpdGggdGhpcyB0eXBlICovCisKKwlmcmVlKHRhZy0+Yml0X25hbWUpOworCWZyZWUodGFnLT5iaXRfdmFsKTsKKworCWZyZWUodGFnKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGRlc2lyZWQgdGFnIG9uIGEgZGV2aWNlLiAgSWYgdmFsdWUgaXMgTlVMTCwgdGhlbiB0aGUKKyAqIGZpcnN0IHN1Y2ggdGFnIGlzIHJldHVybmVkLCBvdGhlcndpc2UgcmV0dXJuIG9ubHkgZXhhY3QgdGFnIGlmIGZvdW5kLgorICovCitibGtpZF90YWcgYmxraWRfZmluZF90YWdfZGV2KGJsa2lkX2RldiBkZXYsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlmICghZGV2IHx8ICF0eXBlKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmRldi0+YmlkX3RhZ3MpIHsKKwkJYmxraWRfdGFnIHRtcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsCisJCQkJCSAgIGJpdF90YWdzKTsKKworCQlpZiAoIXN0cmNtcCh0bXAtPmJpdF9uYW1lLCB0eXBlKSkKKwkJCXJldHVybiB0bXA7CisJfQorCXJldHVybiBOVUxMOworfQorCitleHRlcm4gaW50IGJsa2lkX2Rldl9oYXNfdGFnKGJsa2lkX2RldiBkZXYsIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWJsa2lkX3RhZwkJdGFnOworCisJaWYgKCFkZXYgfHwgIXR5cGUpCisJCXJldHVybiAtMTsKKworCXRhZyA9IGJsa2lkX2ZpbmRfdGFnX2RldihkZXYsIHR5cGUpOworCWlmICghdmFsdWUpCisJCXJldHVybiAodGFnICE9IE5VTEwpOworCWlmICghdGFnIHx8IHN0cmNtcCh0YWctPmJpdF92YWwsIHZhbHVlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBkZXNpcmVkIHRhZyB0eXBlIGluIHRoZSBjYWNoZS4KKyAqIFdlIHJldHVybiB0aGUgaGVhZCB0YWcgZm9yIHRoaXMgdGFnIHR5cGUuCisgKi8KK3N0YXRpYyBibGtpZF90YWcgYmxraWRfZmluZF9oZWFkX2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICp0eXBlKQoreworCWJsa2lkX3RhZyBoZWFkID0gTlVMTCwgdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlpZiAoIWNhY2hlIHx8ICF0eXBlKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlLT5iaWNfdGFncykgeworCQl0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLCBiaXRfdGFncyk7CisJCWlmICghc3RyY21wKHRtcC0+Yml0X25hbWUsIHR5cGUpKSB7CisJCQlEQkcoREVCVUdfVEFHLAorCQkJICAgIHByaW50ZigiICAgIGZvdW5kIGNhY2hlIHRhZyBoZWFkICVzXG4iLCB0eXBlKSk7CisJCQloZWFkID0gdG1wOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGhlYWQ7Cit9CisKKy8qCisgKiBTZXQgYSB0YWcgb24gYW4gZXhpc3RpbmcgZGV2aWNlLgorICoKKyAqIElmIHZhbHVlIGlzIE5VTEwsIHRoZW4gZGVsZXRlIHRoZSB0YWdzZnJvbSB0aGUgZGV2aWNlLgorICovCitpbnQgYmxraWRfc2V0X3RhZyhibGtpZF9kZXYgZGV2LCBjb25zdCBjaGFyICpuYW1lLAorCQkgIGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBpbnQgdmxlbmd0aCkKK3sKKwlibGtpZF90YWcJdCA9IDAsIGhlYWQgPSAwOworCWNoYXIJCSp2YWwgPSAwOworCWNoYXIJCSoqZGV2X3ZhciA9IDA7CisKKwlpZiAoIWRldiB8fCAhbmFtZSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlpZiAoISh2YWwgPSBibGtpZF9zdHJuZHVwKHZhbHVlLCB2bGVuZ3RoKSkgJiYgdmFsdWUpCisJCXJldHVybiAtQkxLSURfRVJSX01FTTsKKworCS8qCisJICogQ2VydGFpbiBjb21tb24gdGFncyBhcmUgbGlua2VkIGRpcmVjdGx5IHRvIHRoZSBkZXZpY2Ugc3RydWN0CisJICogV2UgbmVlZCB0byBrbm93IHdoYXQgdGhleSBhcmUgYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UgYmVjYXVzZQorCSAqIHRoZSBmdW5jdGlvbiBuYW1lIHBhcmFtZXRlciBtaWdodCBnZXQgZnJlZWQgbGF0ZXIgb24uCisJICovCisJaWYgKCFzdHJjbXAobmFtZSwgIlRZUEUiKSkKKwkJZGV2X3ZhciA9ICZkZXYtPmJpZF90eXBlOworCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxBQkVMIikpCisJCWRldl92YXIgPSAmZGV2LT5iaWRfbGFiZWw7CisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiVVVJRCIpKQorCQlkZXZfdmFyID0gJmRldi0+YmlkX3V1aWQ7CisKKwl0ID0gYmxraWRfZmluZF90YWdfZGV2KGRldiwgbmFtZSk7CisJaWYgKCF2YWx1ZSkgeworCQlpZiAodCkKKwkJCWJsa2lkX2ZyZWVfdGFnKHQpOworCX0gZWxzZSBpZiAodCkgeworCQlpZiAoIXN0cmNtcCh0LT5iaXRfdmFsLCB2YWwpKSB7CisJCQkvKiBTYW1lIHRoaW5nLCBleGl0ICovCisJCQlmcmVlKHZhbCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmcmVlKHQtPmJpdF92YWwpOworCQl0LT5iaXRfdmFsID0gdmFsOworCX0gZWxzZSB7CisJCS8qIEV4aXN0aW5nIHRhZyBub3QgcHJlc2VudCwgYWRkIHRvIGRldmljZSAqLworCQlpZiAoISh0ID0gYmxraWRfbmV3X3RhZygpKSkKKwkJCWdvdG8gZXJyb3V0OworCQl0LT5iaXRfbmFtZSA9IGJsa2lkX3N0cmR1cChuYW1lKTsKKwkJdC0+Yml0X3ZhbCA9IHZhbDsKKwkJdC0+Yml0X2RldiA9IGRldjsKKworCQlsaXN0X2FkZF90YWlsKCZ0LT5iaXRfdGFncywgJmRldi0+YmlkX3RhZ3MpOworCisJCWlmIChkZXYtPmJpZF9jYWNoZSkgeworCQkJaGVhZCA9IGJsa2lkX2ZpbmRfaGVhZF9jYWNoZShkZXYtPmJpZF9jYWNoZSwKKwkJCQkJCSAgICAgdC0+Yml0X25hbWUpOworCQkJaWYgKCFoZWFkKSB7CisJCQkJaGVhZCA9IGJsa2lkX25ld190YWcoKTsKKwkJCQlpZiAoIWhlYWQpCisJCQkJCWdvdG8gZXJyb3V0OworCisJCQkJREJHKERFQlVHX1RBRywKKwkJCQkgICAgcHJpbnRmKCIgICAgY3JlYXRpbmcgbmV3IGNhY2hlIHRhZyBoZWFkICVzXG4iLCBuYW1lKSk7CisJCQkJaGVhZC0+Yml0X25hbWUgPSBibGtpZF9zdHJkdXAobmFtZSk7CisJCQkJaWYgKCFoZWFkLT5iaXRfbmFtZSkKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJbGlzdF9hZGRfdGFpbCgmaGVhZC0+Yml0X3RhZ3MsCisJCQkJCSAgICAgICZkZXYtPmJpZF9jYWNoZS0+YmljX3RhZ3MpOworCQkJfQorCQkJbGlzdF9hZGRfdGFpbCgmdC0+Yml0X25hbWVzLCAmaGVhZC0+Yml0X25hbWVzKTsKKwkJfQorCX0KKworCS8qIExpbmsgY29tbW9uIHRhZ3MgZGlyZWN0bHkgdG8gdGhlIGRldmljZSBzdHJ1Y3QgKi8KKwlpZiAoZGV2X3ZhcikKKwkJKmRldl92YXIgPSB2YWw7CisKKwlpZiAoZGV2LT5iaWRfY2FjaGUpCisJCWRldi0+YmlkX2NhY2hlLT5iaWNfZmxhZ3MgfD0gQkxLSURfQklDX0ZMX0NIQU5HRUQ7CisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwlpZiAodCkKKwkJYmxraWRfZnJlZV90YWcodCk7CisJZWxzZSBmcmVlKHZhbCk7CisJaWYgKGhlYWQpCisJCWJsa2lkX2ZyZWVfdGFnKGhlYWQpOworCXJldHVybiAtQkxLSURfRVJSX01FTTsKK30KKworCisvKgorICogUGFyc2UgYSAiTkFNRT12YWx1ZSIgc3RyaW5nLiAgVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbgorICogcGFyc2VfdG9rZW4sIGJlY2F1c2UgdGhhdCB3aWxsIGVuZCBhbiB1bnF1b3RlZCB2YWx1ZSBhdCBhIHNwYWNlLCB3aGlsZQorICogdGhpcyB3aWxsIGFzc3VtZSB0aGF0IGFuIHVucXVvdGVkIHZhbHVlIGlzIHRoZSByZXN0IG9mIHRoZSB0b2tlbiAoZS5nLgorICogaWYgd2UgYXJlIHBhc3NlZCBhbiBhbHJlYWR5IHF1b3RlZCBzdHJpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHdlIGRvbid0CisgKiBoYXZlIHRvIGJvdGggcXVvdGUgYW5kIGVzY2FwZSBxdW90ZSBzbyB0aGF0IHRoZSBxdW90ZXMgbWFrZSBpdCB0bworICogdXMpLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgLTEgb24gZmFpbHVyZS4KKyAqLworaW50IGJsa2lkX3BhcnNlX3RhZ19zdHJpbmcoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKipyZXRfdHlwZSwgY2hhciAqKnJldF92YWwpCit7CisJY2hhciAqbmFtZSwgKnZhbHVlLCAqY3A7CisKKwlEQkcoREVCVUdfVEFHLCBwcmludGYoInRyeWluZyB0byBwYXJzZSAnJXMnIGFzIGEgdGFnXG4iLCB0b2tlbikpOworCisJaWYgKCF0b2tlbiB8fCAhKGNwID0gc3RyY2hyKHRva2VuLCAnPScpKSkKKwkJcmV0dXJuIC0xOworCisJbmFtZSA9IGJsa2lkX3N0cmR1cCh0b2tlbik7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLTE7CisJdmFsdWUgPSBuYW1lICsgKGNwIC0gdG9rZW4pOworCSp2YWx1ZSsrID0gJ1wwJzsKKwlpZiAoKnZhbHVlID09ICciJyB8fCAqdmFsdWUgPT0gJ1wnJykgeworCQljaGFyIGMgPSAqdmFsdWUrKzsKKwkJaWYgKCEoY3AgPSBzdHJyY2hyKHZhbHVlLCBjKSkpCisJCQlnb3RvIGVycm91dDsgLyogbWlzc2luZyBjbG9zaW5nIHF1b3RlICovCisJCSpjcCA9ICdcMCc7CisJfQorCXZhbHVlID0gYmxraWRfc3RyZHVwKHZhbHVlKTsKKwlpZiAoIXZhbHVlKQorCQlnb3RvIGVycm91dDsKKworCSpyZXRfdHlwZSA9IG5hbWU7CisJKnJldF92YWwgPSB2YWx1ZTsKKworCXJldHVybiAwOworCitlcnJvdXQ6CisJZnJlZShuYW1lKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUYWcgaXRlcmF0aW9uIHJvdXRpbmVzIGZvciB0aGUgcHVibGljIGxpYmJsa2lkIGludGVyZmFjZS4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBkbyBub3QgZXhwb3NlIHRoZSBsaXN0LmggaW1wbGVtZW50YXRpb24sIHdoaWNoIGFyZSBhCisgKiBjb250YW1pbmF0aW9uIG9mIHRoZSBuYW1lc3BhY2UsIGFuZCB3aGljaCBmb3JjZSB1cyB0byByZXZlYWwgZmFyLCBmYXIKKyAqIHRvbyBtdWNoIG9mIG91ciBpbnRlcm5hbCBpbXBsZW1lbmF0aW9uLiAgSSdtIG5vdCBjb252aW5jZWQgSSB3YW50CisgKiB0byBrZWVwIGxpc3QuaCBpbiB0aGUgbG9uZyB0ZXJtLCBhbnl3YXkuICBJdCdzIGZpbmUgZm9yIGtlcm5lbAorICogcHJvZ3JhbW1pbmcsIGJ1dCBwZXJmb3JtYW5jZSBpcyBub3QgdGhlICMxIHByaW9yaXR5IGZvciB0aGlzCisgKiBsaWJyYXJ5LCBhbmQgSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGUgdHJhZGVvZmYgb2YgdHlwZS1zYWZldHkgZm9yCisgKiBwZXJmb3JtYW5jZSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIFt0eXRzbzoyMDAzMDEyNS4yMDA3RVNUXQorICovCisKKy8qCisgKiBUaGlzIHNlcmllcyBvZiBmdW5jdGlvbnMgaXRlcmF0ZSBvdmVyIGFsbCB0YWdzIGluIGEgZGV2aWNlCisgKi8KKyNkZWZpbmUgVEFHX0lURVJBVEVfTUFHSUMJMHgwMWE1Mjg0YworCitzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZ19pdGVyYXRlIHsKKwlpbnQJCQltYWdpYzsKKwlibGtpZF9kZXYJCWRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpwOworfTsKKworZXh0ZXJuIGJsa2lkX3RhZ19pdGVyYXRlIGJsa2lkX3RhZ19pdGVyYXRlX2JlZ2luKGJsa2lkX2RldiBkZXYpCit7CisJYmxraWRfdGFnX2l0ZXJhdGUJaXRlcjsKKworCWl0ZXIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnX2l0ZXJhdGUpKTsKKwlpZiAoaXRlcikgeworCQlpdGVyLT5tYWdpYyA9IFRBR19JVEVSQVRFX01BR0lDOworCQlpdGVyLT5kZXYgPSBkZXY7CisJCWl0ZXItPnAJPSBkZXYtPmJpZF90YWdzLm5leHQ7CisJfQorCXJldHVybiAoaXRlcik7Cit9CisKKy8qCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorICovCitleHRlcm4gaW50IGJsa2lkX3RhZ19uZXh0KGJsa2lkX3RhZ19pdGVyYXRlIGl0ZXIsCisJCQkgIGNvbnN0IGNoYXIgKip0eXBlLCBjb25zdCBjaGFyICoqdmFsdWUpCit7CisJYmxraWRfdGFnIHRhZzsKKworCSp0eXBlID0gMDsKKwkqdmFsdWUgPSAwOworCWlmICghaXRlciB8fCBpdGVyLT5tYWdpYyAhPSBUQUdfSVRFUkFURV9NQUdJQyB8fAorCSAgICBpdGVyLT5wID09ICZpdGVyLT5kZXYtPmJpZF90YWdzKQorCQlyZXR1cm4gLTE7CisJdGFnID0gbGlzdF9lbnRyeShpdGVyLT5wLCBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywgYml0X3RhZ3MpOworCSp0eXBlID0gdGFnLT5iaXRfbmFtZTsKKwkqdmFsdWUgPSB0YWctPmJpdF92YWw7CisJaXRlci0+cCA9IGl0ZXItPnAtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiB2b2lkIGJsa2lkX3RhZ19pdGVyYXRlX2VuZChibGtpZF90YWdfaXRlcmF0ZSBpdGVyKQoreworCWlmICghaXRlciB8fCBpdGVyLT5tYWdpYyAhPSBUQUdfSVRFUkFURV9NQUdJQykKKwkJcmV0dXJuOworCWl0ZXItPm1hZ2ljID0gMDsKKwlmcmVlKGl0ZXIpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZGV2aWNlIHdoaWNoIG1hdGNoZXMgYSBwYXJ0aWN1bGFyCisgKiB0eXBlL3ZhbHVlIHBhaXIuICBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRldmljZSB0aGF0IG1hdGNoZXMgdGhlCisgKiBzZWFyY2ggc3BlY2lmaWNhdGlvbiwgaXQgcmV0dXJucyB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkKKyAqIHZhbHVlLiAgVGhpcyBhbGxvd3MgdXMgdG8gZ2l2ZSBwcmVmZXJlbmNlIHRvIEVWTVMgb3IgTFZNIGRldmljZXMuCisgKi8KK2V4dGVybiBibGtpZF9kZXYgYmxraWRfZmluZF9kZXZfd2l0aF90YWcoYmxraWRfY2FjaGUgY2FjaGUsCisJCQkJCSBjb25zdCBjaGFyICp0eXBlLAorCQkJCQkgY29uc3QgY2hhciAqdmFsdWUpCit7CisJYmxraWRfdGFnCWhlYWQ7CisJYmxraWRfZGV2CWRldjsKKwlpbnQJCXByaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludAkJcHJvYmVfbmV3ID0gMDsKKworCWlmICghY2FjaGUgfHwgIXR5cGUgfHwgIXZhbHVlKQorCQlyZXR1cm4gTlVMTDsKKworCWJsa2lkX3JlYWRfY2FjaGUoY2FjaGUpOworCisJREJHKERFQlVHX1RBRywgcHJpbnRmKCJsb29raW5nIGZvciAlcz0lcyBpbiBjYWNoZVxuIiwgdHlwZSwgdmFsdWUpKTsKKwordHJ5X2FnYWluOgorCXByaSA9IC0xOworCWRldiA9IDA7CisJaGVhZCA9IGJsa2lkX2ZpbmRfaGVhZF9jYWNoZShjYWNoZSwgdHlwZSk7CisKKwlpZiAoaGVhZCkgeworCQlsaXN0X2Zvcl9lYWNoKHAsICZoZWFkLT5iaXRfbmFtZXMpIHsKKwkJCWJsa2lkX3RhZyB0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLAorCQkJCQkJICAgYml0X25hbWVzKTsKKworCQkJaWYgKCFzdHJjbXAodG1wLT5iaXRfdmFsLCB2YWx1ZSkgJiYKKwkJCSAgICAodG1wLT5iaXRfZGV2LT5iaWRfcHJpID4gcHJpKSAmJgorCQkJICAgICFhY2Nlc3ModG1wLT5iaXRfZGV2LT5iaWRfbmFtZSwgRl9PSykpIHsKKwkJCQlkZXYgPSB0bXAtPmJpdF9kZXY7CisJCQkJcHJpID0gZGV2LT5iaWRfcHJpOworCQkJfQorCQl9CisJfQorCWlmIChkZXYgJiYgIShkZXYtPmJpZF9mbGFncyAmIEJMS0lEX0JJRF9GTF9WRVJJRklFRCkpIHsKKwkJZGV2ID0gYmxraWRfdmVyaWZ5KGNhY2hlLCBkZXYpOworCQlpZiAoIWRldiB8fCAoZGV2ICYmIChkZXYtPmJpZF9mbGFncyAmIEJMS0lEX0JJRF9GTF9WRVJJRklFRCkpKQorCQkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKCFkZXYgJiYgIXByb2JlX25ldykgeworCQlpZiAoYmxraWRfcHJvYmVfYWxsX25ldyhjYWNoZSkgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCXByb2JlX25ldysrOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlpZiAoIWRldiAmJiAhKGNhY2hlLT5iaWNfZmxhZ3MgJiBCTEtJRF9CSUNfRkxfUFJPQkVEKSkgeworCQlpZiAoYmxraWRfcHJvYmVfYWxsKGNhY2hlKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCXJldHVybiBkZXY7Cit9CisKKyNpZmRlZiBURVNUX1BST0dSQU0KKyNpZmRlZiBIQVZFX0dFVE9QVF9ICisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZWxzZQorZXh0ZXJuIGNoYXIgKm9wdGFyZzsKK2V4dGVybiBpbnQgb3B0aW5kOworI2VuZGlmCisKK3ZvaWQgdXNhZ2UoY2hhciAqcHJvZykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWYgYmxraWRfZmlsZV0gWy1tIGRlYnVnX21hc2tdIGRldmljZSAiCisJCSJbdHlwZSB2YWx1ZV1cbiIsCisJCXByb2cpOworCWZwcmludGYoc3RkZXJyLCAiXHRMaXN0IGFsbCB0YWdzIGZvciBhIGRldmljZSBhbmQgZXhpdFxuIik7CisJZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWJsa2lkX3RhZ19pdGVyYXRlCWl0ZXI7CisJYmxraWRfY2FjaGUgCQljYWNoZSA9IE5VTEw7CisJYmxraWRfZGV2CQlkZXY7CisJaW50CQkJYywgcmV0LCBmb3VuZDsKKwlpbnQJCQlmbGFncyA9IEJMS0lEX0RFVl9GSU5EOworCWNoYXIJCQkqdG1wOworCWNoYXIJCQkqZmlsZSA9IE5VTEw7CisJY2hhcgkJCSpkZXZuYW1lID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF90eXBlID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF92YWx1ZSA9IE5VTEw7CisJY29uc3QgY2hhcgkJKnR5cGUsICp2YWx1ZTsKKworCXdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgIm06ZjoiKSkgIT0gRU9GKQorCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZic6CisJCQlmaWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJYmxraWRfZGVidWdfbWFzayA9IHN0cnRvdWwgKG9wdGFyZywgJnRtcCwgMCk7CisJCQlpZiAoKnRtcCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBkZWJ1ZyBtYXNrOiAlc1xuIiwKKwkJCQkJb3B0YXJnKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJdXNhZ2UoYXJndlswXSk7CisJCX0KKwlpZiAoYXJnYyA+IG9wdGluZCkKKwkJZGV2bmFtZSA9IGFyZ3Zbb3B0aW5kKytdOworCWlmIChhcmdjID4gb3B0aW5kKQorCQlzZWFyY2hfdHlwZSA9IGFyZ3Zbb3B0aW5kKytdOworCWlmIChhcmdjID4gb3B0aW5kKQorCQlzZWFyY2hfdmFsdWUgPSBhcmd2W29wdGluZCsrXTsKKwlpZiAoIWRldm5hbWUgfHwgKGFyZ2MgIT0gb3B0aW5kKSkKKwkJdXNhZ2UoYXJndlswXSk7CisKKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGZpbGUpKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGNyZWF0aW5nIGNhY2hlICglZClcbiIsCisJCQlhcmd2WzBdLCByZXQpOworCQlleGl0KDEpOworCX0KKworCWRldiA9IGJsa2lkX2dldF9kZXYoY2FjaGUsIGRldm5hbWUsIGZsYWdzKTsKKwlpZiAoIWRldikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDYW4gbm90IGZpbmQgZGV2aWNlIGluIGJsa2lkIGNhY2hlXG4iLAorCQkJZGV2bmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChzZWFyY2hfdHlwZSkgeworCQlmb3VuZCA9IGJsa2lkX2Rldl9oYXNfdGFnKGRldiwgc2VhcmNoX3R5cGUsIHNlYXJjaF92YWx1ZSk7CisJCXByaW50ZigiRGV2aWNlICVzOiAoJXMsICVzKSAlc1xuIiwgYmxraWRfZGV2X2Rldm5hbWUoZGV2KSwKKwkJICAgICAgIHNlYXJjaF90eXBlLCBzZWFyY2hfdmFsdWUgPyBzZWFyY2hfdmFsdWUgOiAiTlVMTCIsCisJCSAgICAgICBmb3VuZCA/ICJGT1VORCIgOiAiTk9UIEZPVU5EIik7CisJCXJldHVybighZm91bmQpOworCX0KKwlwcmludGYoIkRldmljZSAlcy4uLlxuIiwgYmxraWRfZGV2X2Rldm5hbWUoZGV2KSk7CisKKwlpdGVyID0gYmxraWRfdGFnX2l0ZXJhdGVfYmVnaW4oZGV2KTsKKwl3aGlsZSAoYmxraWRfdGFnX25leHQoaXRlciwgJnR5cGUsICZ2YWx1ZSkgPT0gMCkgeworCQlwcmludGYoIlx0VGFnICVzIGhhcyB2YWx1ZSAlc1xuIiwgdHlwZSwgdmFsdWUpOworCX0KKwlibGtpZF90YWdfaXRlcmF0ZV9lbmQoaXRlcik7CisKKwlibGtpZF9wdXRfY2FjaGUoY2FjaGUpOworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RfcHJvYmUuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0X3Byb2JlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliM2VkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0X3Byb2JlLmluCkBAIC0wLDAgKzEsNjIgQEAKKworVEVTVFM9JCoKKworaWYgdGVzdCAiJFRFU1RTInggPSB4IDsgdGhlbgorCWZvciBpIGluICRTUkNESVIvdGVzdHMvKi5pbWcuYnoyCisJZG8KKwkJVEVTVFM9IiRURVNUUyBgYmFzZW5hbWUgJGkgLmltZy5iejJgIgorCWRvbmUKK2ZpCisKK21rZGlyIC1wIHRlc3RzL3RtcAorCitmb3IgaSBpbiAkVEVTVFMKK2RvCisJcHJpbnRmICIlczogIiAkaQorCVJFU1VMVFM9JFNSQ0RJUi90ZXN0cy8kaS5yZXN1bHRzCisJSU1BR0VfQloyPSRTUkNESVIvdGVzdHMvJGkuaW1nLmJ6MgorCUlNQUdFPXRlc3RzL3RtcC8kaS5pbWcuJCQKKwlpZiB0ZXN0ICEgLWYgJElNQUdFX0JaMiAtYSAhIC1mICRSRVNVTFRTIDsKKwl0aGVuCisJCWVjaG8gIm5vbi1leGlzdGVudCIKKwkJY29udGludWUKKwlmaQorCWlmIFsgIiRpIiA9ICJzd2FwMCIgXTsgdGhlbgorCQkjIHN3YXAgaXMgbmF0aXZlLWVuZGlhbiwgc28gcmVnZW5lcmF0ZSBiZWZvcmUgdGVzdGluZworCQlkZCBpZj0vZGV2L3plcm8gb2Y9JElNQUdFIGJzPTE2ayBjb3VudD02NCAyPiAvZGV2L251bGwKKwkJbWtzd2FwIC12MCAkSU1BR0UgPiAvZGV2L251bGwKKwllbGlmIFsgIiRpIiA9ICJzd2FwMSIgXTsgdGhlbgorCQkjIHN3YXAgaXMgbmF0aXZlLWVuZGlhbiwgc28gcmVnZW5lcmF0ZSBiZWZvcmUgdGVzdGluZworCQlkZCBpZj0vZGV2L3plcm8gb2Y9JElNQUdFIGJzPTE2ayBjb3VudD02NCAyPiAvZGV2L251bGwKKwkJIyBjaGVjayBpZiBta3N3YXAgc3VwcG9ydHMgdGhlICItVSIgb3B0aW9uCisJCWlmIG1rc3dhcCAtaCAyPiYxIHwgZ3JlcCAtcSAtLSAnLVUnOyB0aGVuCisJCQlVVUlEPSItVSA4ZmY4ZTc3Zi04NTUzLTQ4NWUtODY1Ni01OGJlNjdhODE2NjYiCisJCWVsc2UKKwkJCVJNVVVJRD0ifCBncmVwIC12IFVVSUQiCisJCQlSRVNfVE1QPSRTUkNESVIvdGVzdHMvdG1wLyRpLnJlc3VsdHMKKwkJCWdyZXAgLXYgVVVJRCAkUkVTVUxUUyA+ICRSRVNfVE1QCisJCQlSRVNVTFRTPSRSRVNfVE1QCisJCWZpCisJCW1rc3dhcCAtdjEgLUwgU1dBUC1URVNUICRVVUlEICRJTUFHRSA+L2Rldi9udWxsCisJZWxzZQorCQlidW56aXAyIDwgJElNQUdFX0JaMiA+ICRJTUFHRQorCWZpCisJZXZhbCAuL3RzdF9wcm9iZSAkSU1BR0UgJFJNVVVJRCA+IHRlc3RzLyRpLm91dAorCXJtIC1mICRJTUFHRSB0ZXN0cy8kaS5vayB0ZXN0cy8kaS5mYWlsZWQKKwljbXAgLXMgdGVzdHMvJGkub3V0ICRSRVNVTFRTCisJdW5zZXQgUk1VVUlECisJaWYgWyAkPyA9IDAgXTsgIHRoZW4KKwkJZWNobyBvaworCQl0b3VjaCB0ZXN0cy8kaS5vaworCWVsc2UJCisJCWVjaG8gZmFpbGVkCisJCWRpZmYgLWMgdGVzdHMvJGkub3V0ICRSRVNVTFRTID4gdGVzdHMvJGkuZmFpbGVkCisJZmkKK2RvbmUKKworbnVtX29rPWBscyB0ZXN0cy8qLm9rIDI+L2Rldi9udWxsIHwgd2MgLWxgCitudW1fZmFpbGVkPWBscyB0ZXN0cy8qLmZhaWxlZCAyPi9kZXYvbnVsbCB8IHdjIC1sYAorCitlY2hvICIkbnVtX29rIHRlc3RzIHN1Y2NlZWRlZAkkbnVtX2ZhaWxlZCB0ZXN0cyBmYWlsZWQiCisKK3Rlc3QgIiRudW1fZmFpbGVkIiAtZXEgMCB8fCBleGl0IDEKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2NyYW1mcy5pbWcuYnoyIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvY3JhbWZzLmltZy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzODExNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2NyYW1mcy5pbWcuYnoyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2NyYW1mcy5yZXN1bHRzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvY3JhbWZzLnJlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0ZDllMgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2NyYW1mcy5yZXN1bHRzCkBAIC0wLDAgKzEsMiBAQAorVFlQRT0nY3JhbWZzJworTEFCRUw9J3Rlc3QtY3JhbScKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2V4dDIuaW1nLmJ6MiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2V4dDIuaW1nLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTgxMWNlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZXh0Mi5pbWcuYnoyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2V4dDIucmVzdWx0cyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2V4dDIucmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE3YTJhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZXh0Mi5yZXN1bHRzCkBAIC0wLDAgKzEsMyBAQAorVFlQRT0nZXh0MicKK0xBQkVMPSd0ZXN0LWV4dDInCitVVUlEPScyMmYwZWFjMy01Yzg5LTRlYzEtOTA3Ni02MDc5OTExOWFhZWEnCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9leHQzLmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9leHQzLmltZy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5NDU5OAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2V4dDMuaW1nLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9leHQzLnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9leHQzLnJlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjMjI1MgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2V4dDMucmVzdWx0cwpAQCAtMCwwICsxLDMgQEAKK1RZUEU9J2V4dDMnCitMQUJFTD0ndGVzdC1leHQzJworVVVJRD0nMzVmNjZkYWItNDc3ZS00MDkwLWE4NzItOTVlZTBlNDkzYWQ2JwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0LmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9mYXQuaW1nLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE3ZjJkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0LmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0LnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9mYXQucmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQxODcyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0LnJlc3VsdHMKQEAgLTAsMCArMSwzIEBACitUWVBFPSd2ZmF0JworTEFCRUw9J1RFU1QtRkFUJworVVVJRD0nREVBRC1CRUVGJwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0MzJfbGFiZWxfNjRNQi5pbWcuYnoyIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0MzJfbGFiZWxfNjRNQi5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzYyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9mYXQzMl9sYWJlbF82NE1CLmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0MzJfbGFiZWxfNjRNQi5yZXN1bHRzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvZmF0MzJfbGFiZWxfNjRNQi5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjU2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9mYXQzMl9sYWJlbF82NE1CLnJlc3VsdHMKQEAgLTAsMCArMSwzIEBACitUWVBFPSd2ZmF0JworTEFCRUw9J0JJTkdPJworVVVJRD0nOENCNS1CQTQ5JwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvaXNvLmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9pc28uaW1nLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWZiNmFkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvaXNvLmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvaXNvLnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9pc28ucmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVkMWRjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvaXNvLnJlc3VsdHMKQEAgLTAsMCArMSwyIEBACitUWVBFPSdpc285NjYwJworTEFCRUw9J3Rlc3QtaXNvJwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvamJkLmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9qYmQuaW1nLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ3ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvamJkLmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvamJkLnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9qYmQucmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQzMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvamJkLnJlc3VsdHMKQEAgLTAsMCArMSwyIEBACitUWVBFPSdqYmQnCitVVUlEPScwZDdhMDdkZi03YjA2LTQ4MjktYmNlNy0zYjljM2VjZTU3MGMnCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9qZnMuaW1nLmJ6MiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2pmcy5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGQyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9qZnMuaW1nLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9qZnMucmVzdWx0cyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL2pmcy5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzUyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9qZnMucmVzdWx0cwpAQCAtMCwwICsxLDMgQEAKK1RZUEU9J2pmcycKK0xBQkVMPSd0ZXN0LWpmcycKK1VVSUQ9JzliZjdiODJlLTc1ODMtNGM3NC05OWE0LTE4OWE2OTFmMjdiNScKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL21pbml4LmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9taW5peC5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWYzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9taW5peC5pbWcuYnoyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL21pbml4LnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9taW5peC5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjQ0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9taW5peC5yZXN1bHRzCkBAIC0wLDAgKzEgQEAKK1RZUEU9J21pbml4JwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvb2NmczIuaW1nLmJ6MiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL29jZnMyLmltZy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhZDkxNQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL29jZnMyLmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvb2NmczIucmVzdWx0cyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL29jZnMyLnJlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4YWZhMwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL29jZnMyLnJlc3VsdHMKQEAgLTAsMCArMSwzIEBACitUWVBFPSdvY2ZzMicKK0xBQkVMPSd0ZXN0LW9jZnMyJworVVVJRD0nNmI2YmZiZWEtM2E3OS00ZjBjLWIxNjYtYTIwNzc2MTAyNDQ1JwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyMy5pbWcuYnoyIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyMy5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDJiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yZWlzZXIzLmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyMy5yZXN1bHRzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyMy5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2JiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yZWlzZXIzLnJlc3VsdHMKQEAgLTAsMCArMSwzIEBACitUWVBFPSdyZWlzZXJmcycKK0xBQkVMPSdURVNUUkVJU0VSJworVVVJRD0nOWVmZTc4NjMtYjEyNC00NmRjLWFkNjgtOGVjZDA0MjMwYTdiJwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyNC5pbWcuYnoyIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyNC5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGQxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yZWlzZXI0LmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyNC5yZXN1bHRzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvcmVpc2VyNC5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTIyODkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yZWlzZXI0LnJlc3VsdHMKQEAgLTAsMCArMSwzIEBACitUWVBFPSdyZWlzZXI0JworTEFCRUw9J1RFU1RSNCcKK1VVSUQ9Jzk3MjI2MzNjLWQ2OWEtNDg4MS1iMWM4LWJlZGVjYmJmMzlkMicKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3JvbWZzLmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yb21mcy5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTMxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yb21mcy5pbWcuYnoyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3JvbWZzLnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yb21mcy5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTg2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9yb21mcy5yZXN1bHRzCkBAIC0wLDAgKzEsMiBAQAorVFlQRT0ncm9tZnMnCitMQUJFTD0ndGVzdC1yb21mcycKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3NtYWxsLWZhdDMyLmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zbWFsbC1mYXQzMi5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTBmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zbWFsbC1mYXQzMi5pbWcuYnoyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3NtYWxsLWZhdDMyLnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zbWFsbC1mYXQzMi5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWViZjQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zbWFsbC1mYXQzMi5yZXN1bHRzCkBAIC0wLDAgKzEsMyBAQAorVFlQRT0ndmZhdCcKK0xBQkVMPSdURVNUVkZBVCcKK1VVSUQ9JzE0MjMtQUFFMScKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3N3YXAwLmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zd2FwMC5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MWUzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zd2FwMC5pbWcuYnoyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3N3YXAwLnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zd2FwMC5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDJhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zd2FwMC5yZXN1bHRzCkBAIC0wLDAgKzEgQEAKK1RZUEU9J3N3YXAnCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zd2FwMS5pbWcuYnoyIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvc3dhcDEuaW1nLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFiOWVkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvc3dhcDEuaW1nLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy9zd2FwMS5yZXN1bHRzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvc3dhcDEucmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTA0ZTVkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvc3dhcDEucmVzdWx0cwpAQCAtMCwwICsxLDMgQEAKK1RZUEU9J3N3YXAnCitMQUJFTD0nU1dBUC1URVNUJworVVVJRD0nOGZmOGU3N2YtODU1My00ODVlLTg2NTYtNThiZTY3YTgxNjY2JwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvdWRmLmltZy5iejIgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy91ZGYuaW1nLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDJkZWIwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvdWRmLmltZy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvdWRmLnJlc3VsdHMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy91ZGYucmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdhYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvdWRmLnJlc3VsdHMKQEAgLTAsMCArMSwyIEBACitUWVBFPSd1ZGYnCitMQUJFTD0ndGVzdC11ZGYnCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy94ZnMuaW1nLmJ6MiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3hmcy5pbWcuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjk4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy94ZnMuaW1nLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy94ZnMucmVzdWx0cyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3hmcy5yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZThkODgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ibGtpZC90ZXN0cy94ZnMucmVzdWx0cwpAQCAtMCwwICsxLDMgQEAKK1RZUEU9J3hmcycKK0xBQkVMPSd0ZXN0LXhmcycKK1VVSUQ9JzhjOGEwYTVhLTlmNTctNDkyZS05NjEwLTQ1YTYxZjM4ZjU4YScKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3pmcy5pbWcuYnoyIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvemZzLmltZy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNDQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3pmcy5pbWcuYnoyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3pmcy5yZXN1bHRzIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdGVzdHMvemZzLnJlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmOGZiOQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3Rlc3RzL3pmcy5yZXN1bHRzCkBAIC0wLDAgKzEgQEAKK1RZUEU9J3pmcycKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3RzdF90eXBlcy5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdHN0X3R5cGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwM2M4YgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3RzdF90eXBlcy5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBUaGlzIHRlc3RpbmcgcHJvZ3JhbSBtYWtlcyBzdXJlIHRoZSBibGtpZF90eXBlcyBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgImJsa2lkL2Jsa2lkX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKHNpemVvZihfX3U4KSAhPSAxKSB7CisJCXByaW50ZigiU2l6ZW9mKF9fdTgpIGlzICVkIHNob3VsZCBiZSAxXG4iLAorCQkgICAgICAgKGludClzaXplb2YoX191OCkpOworCQlleGl0KDEpOworCX0KKwlpZiAoc2l6ZW9mKF9fczgpICE9IDEpIHsKKwkJcHJpbnRmKCJTaXplb2YoX3M4KSBpcyAlZCBzaG91bGQgYmUgMVxuIiwKKwkJICAgICAgIChpbnQpc2l6ZW9mKF9fczgpKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHNpemVvZihfX3UxNikgIT0gMikgeworCQlwcmludGYoIlNpemVvZihfX3UxNikgaXMgJWQgc2hvdWxkIGJlIDJcbiIsCisJCSAgICAgICAoaW50KXNpemVvZihfX3UxNikpOworCQlleGl0KDEpOworCX0KKwlpZiAoc2l6ZW9mKF9fczE2KSAhPSAyKSB7CisJCXByaW50ZigiU2l6ZW9mKF9fczE2KSBpcyAlZCBzaG91bGQgYmUgMlxuIiwKKwkJICAgICAgIChpbnQpc2l6ZW9mKF9fczE2KSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChzaXplb2YoX191MzIpICE9IDQpIHsKKwkJcHJpbnRmKCJTaXplb2YoX191MzIpIGlzICVkIHNob3VsZCBiZSA0XG4iLAorCQkgICAgICAgKGludClzaXplb2YoX191MzIpKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHNpemVvZihfX3MzMikgIT0gNCkgeworCQlwcmludGYoIlNpemVvZihfX3MzMikgaXMgJWQgc2hvdWxkIGJlIDRcbiIsCisJCSAgICAgICAoaW50KXNpemVvZihfX3MzMikpOworCQlleGl0KDEpOworCX0KKwlpZiAoc2l6ZW9mKF9fdTY0KSAhPSA4KSB7CisJCXByaW50ZigiU2l6ZW9mKF9fdTY0KSBpcyAlZCBzaG91bGQgYmUgOFxuIiwKKwkJICAgICAgIChpbnQpc2l6ZW9mKF9fdTY0KSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChzaXplb2YoX19zNjQpICE9IDgpIHsKKwkJcHJpbnRmKCJTaXplb2YoX19zNjQpIGlzICVkIHNob3VsZCBiZSA4XG4iLAorCQkgICAgICAgKGludClzaXplb2YoX19zNjQpKTsKKwkJZXhpdCgxKTsKKwl9CisJcHJpbnRmKCJUaGUgYmxraWRfdHlwZXMuaCB0eXBlcyBhcmUgY29ycmVjdC5cbiIpOworCWV4aXQoMCk7Cit9CisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3ZlcnNpb24uYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Jsa2lkL3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc1NGZhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvYmxraWQvdmVyc2lvbi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiB2ZXJzaW9uLmMgLS0tIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgYmxraWQgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPGJsa2lkL2Jsa2lkLmg+CisjaW5jbHVkZSAiLi4vLi4vdmVyc2lvbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqbGliX3ZlcnNpb24gPSBFMkZTUFJPR1NfVkVSU0lPTjsKK3N0YXRpYyBjb25zdCBjaGFyICpsaWJfZGF0ZSA9IEUyRlNQUk9HU19EQVRFOworCitpbnQgYmxraWRfcGFyc2VfdmVyc2lvbl9zdHJpbmcoY29uc3QgY2hhciAqdmVyX3N0cmluZykKK3sKKwljb25zdCBjaGFyICpjcDsKKwlpbnQgdmVyc2lvbiA9IDA7CisKKwlmb3IgKGNwID0gdmVyX3N0cmluZzsgKmNwOyBjcCsrKSB7CisJCWlmICgqY3AgPT0gJy4nKQorCQkJY29udGludWU7CisJCWlmICghaXNkaWdpdCgqY3ApKQorCQkJYnJlYWs7CisJCXZlcnNpb24gPSAodmVyc2lvbiAqIDEwKSArICgqY3AgLSAnMCcpOworCX0KKwlyZXR1cm4gdmVyc2lvbjsKK30KKworaW50IGJsa2lkX2dldF9saWJyYXJ5X3ZlcnNpb24oY29uc3QgY2hhciAqKnZlcl9zdHJpbmcsCisJCQkgICAgICAgY29uc3QgY2hhciAqKmRhdGVfc3RyaW5nKQoreworCWlmICh2ZXJfc3RyaW5nKQorCQkqdmVyX3N0cmluZyA9IGxpYl92ZXJzaW9uOworCWlmIChkYXRlX3N0cmluZykKKwkJKmRhdGVfc3RyaW5nID0gbGliX2RhdGU7CisKKwlyZXR1cm4gYmxraWRfcGFyc2VfdmVyc2lvbl9zdHJpbmcobGliX3ZlcnNpb24pOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvTWFrZWZpbGUuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2UyNzNjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNTcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGxpYi9ldAorIworCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAordG9wX2J1aWxkZGlyID0gLi4vLi4KK215X2RpciA9IGxpYi9ldAorSU5TVEFMTCA9IEBJTlNUQUxMQAorCitERVBfTUFLRUZJTEUgPSAkKERFUF9MSUJfTUFLRUZJTEVTKQorCitATUNPTkZJR0AKKworYWxsOjogY29tcGlsZV9ldCBjb21fZXJyLnBjCisKK09CSlM9IGVycm9yX21lc3NhZ2UubyBldF9uYW1lLm8gaW5pdF9ldC5vIGNvbV9lcnIubyBjb21fcmlnaHQubworU1JDUyA9ICQoc3JjZGlyKS9lcnJvcl9tZXNzYWdlLmMgJChzcmNkaXIpL2V0X25hbWUuYyAkKHNyY2RpcikvaW5pdF9ldC5jIFwKKwkkKHNyY2RpcikvY29tX2Vyci5jICQoc3JjZGlyKS9jb21fcmlnaHQuYworCitIRklMRVM9IGNvbV9lcnIuaAorU0hBUkVfRklMRVM9IGV0X2MuYXdrIGV0X2guYXdrCisKK0xJQlJBUlk9IGxpYmNvbV9lcnIKK0xJQkRJUj0gZXQKKworRUxGX1ZFUlNJT04gPSAyLjEKK0VMRl9TT19WRVJTSU9OID0gMgorRUxGX0lNQUdFID0gbGliY29tX2VycgorRUxGX01ZRElSID0gZXQKK0VMRl9JTlNUQUxMX0RJUiA9ICQocm9vdF9saWJkaXIpCitFTEZfT1RIRVJfTElCUyA9IEBTRU1fSU5JVF9MSUJACisKK0JTRExJQl9WRVJTSU9OID0gMS4xCitCU0RMSUJfSU1BR0UgPSBsaWJjb21fZXJyCitCU0RMSUJfTVlESVIgPSBldAorQlNETElCX0lOU1RBTExfRElSID0gJChyb290X2xpYmRpcikKKworIworIyB3aGF0IHRvIGJ1aWxkLi4uCisjCisuYy5vOgorCSQoRSkgIglDQyAkPCIKKwkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgLWMgJDwgLW8gJEAKK0BQUk9GSUxFX0NNVEAJJChRKSAkKENDKSAkKEFMTF9DRkxBR1MpIC1nIC1wZyAtbyBwcm9maWxlZC8kKi5vIC1jICQ8CitAQ0hFQ0tFUl9DTVRACSQoUSkgJChDQykgJChBTExfQ0ZMQUdTKSAtY2hlY2tlciAtZyAtbyBjaGVja2VyLyQqLm8gLWMgJDwKK0BFTEZfQ01UQAkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgLWZQSUMgLW8gZWxmc2hhcmVkLyQqLm8gLWMgJDwKK0BCU0RMSUJfQ01UQAkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgJChCU0RMSUJfUElDX0ZMQUcpIC1vIHBpYy8kKi5vIC1jICQ8CisKK0BNQUtFRklMRV9MSUJSQVJZQAorQE1BS0VGSUxFX0VMRkAKK0BNQUtFRklMRV9CU0RMSUJACitATUFLRUZJTEVfUFJPRklMRUAKK0BNQUtFRklMRV9DSEVDS0VSQAorCitjb21waWxlX2V0OiAkKERFUF9TVUJTVElUVVRFKSAkKHNyY2RpcikvY29tcGlsZV9ldC5zaC5pbgorCSQoRSkgIglTVUJTVCAkQCIKKwkkKFEpICQoU1VCU1RJVFVURSkgJChzcmNkaXIpL2NvbXBpbGVfZXQuc2guaW4gY29tcGlsZV9ldAorCSQoUSkgJChDSE1PRCkgK3ggY29tcGlsZV9ldAorCitjb21fZXJyLnBzIDogY29tX2Vyci5kdmkKK2NvbV9lcnIuZHZpOiBjb21fZXJyLnRleGluZm8KKworY29tX2Vycl9hYnQuaHRtbDogJChzcmNkaXIpL2NvbV9lcnIudGV4aW5mbworCSQoRSkgIglURVhJMkhUTUwgJEAiCisJLSQoUSkgdGV4aTJodG1sIC1zcGxpdF9jaGFwdGVyICQoc3JjZGlyKS9jb21fZXJyLnRleGluZm8KKwktJChRKSBpZiB0ZXN0IC1kIGNvbV9lcnIgOyB0aGVuIFwKKwkJbXYgY29tX2Vyci8qIC4gOyBybWRpciBjb21fZXJyIDsgXAorCQlmaQorCitjb21fZXJyLnBjOiAkKHNyY2RpcikvY29tX2Vyci5wYy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCSQoRSkgIglDT05GSUcuU1RBVFVTICRAIgorCSQoUSkgY2QgJCh0b3BfYnVpbGRkaXIpOyBDT05GSUdfRklMRVM9bGliL2V0L2NvbV9lcnIucGMgLi9jb25maWcuc3RhdHVzCisKKyNsaWJjb21fZXJyLm86CSQoTElCT0JKUykKKyMJJChMRCkgLXIgLXMgLW8gbGliY29tX2Vyci5vICQoTElCT0JKUykKKyMJY2htb2QgLXggbGliY29tX2Vyci5vCisKK1RBR1M6CSQoU1JDUykKKwkkKFRBR1MpICQoU1JDUykKKworaW5zdGFsbGRpcnM6OgorCSQoRSkgIglNS0lOU1RBTExESVJTICQobGliZGlyKSAkKGluY2x1ZGVkaXIpL2V0ICQoZGF0YWRpcikvZXQgJChiaW5kaXIpICQobWFuMWRpcikgJChtYW4zZGlyKSIKKwkkKFEpICQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQobGliZGlyKSBcCisJCSQoREVTVERJUikkKGluY2x1ZGVkaXIpL2V0ICQoREVTVERJUikkKGRhdGFkaXIpL2V0IFwKKwkJJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW4xZGlyKSBcCisJCSQoREVTVERJUikkKG1hbjNkaXIpICQoREVTVERJUikkKGxpYmRpcikvcGtnY29uZmlnCisKK2luc3RhbGw6OiBjb21waWxlX2V0IGxpYmNvbV9lcnIuYSAkKEhGSUxFUykgaW5zdGFsbGRpcnMgY29tX2Vyci5wYworCSQoRSkgIglJTlNUQUxMX0RBVEEgJChsaWJkaXIpL2xpYmNvbV9lcnIuYSIKKwkkKFEpICQoSU5TVEFMTF9EQVRBKSBsaWJjb21fZXJyLmEgJChERVNURElSKSQobGliZGlyKS9saWJjb21fZXJyLmEKKwktJChRKSAkKFJBTkxJQikgJChERVNURElSKSQobGliZGlyKS9saWJjb21fZXJyLmEKKwkkKFEpICQoQ0hNT0QpICQoTElCTU9ERSkgJChERVNURElSKSQobGliZGlyKS9saWJjb21fZXJyLmEKKwkkKFEpIGZvciBpIGluICQoSEZJTEVTKTsgZG8gXAorCQllY2hvICIJSU5TVEFMTF9EQVRBICQoaW5jbHVkZWRpcikvZXQvJCRpIjsgXAorCQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkaSAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9ldC8kJGk7IFwKKwlkb25lCisJJChRKSBmb3IgaSBpbiAkKFNIQVJFX0ZJTEVTKTsgZG8gXAorCQllY2hvICIJSU5TVEFMTF9EQVRBICQoZGF0YWRpcikvZXQvJCRpIjsgXAorCQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkaSAkKERFU1RESVIpJChkYXRhZGlyKS9ldC8kJGk7IFwKKwlkb25lCisJJChFKSAiCUlOU1RBTExfU0NSSVBUICQoYmluZGlyKS9jb21waWxlX2V0IgorCSQoUSkgJChJTlNUQUxMX1NDUklQVCkgY29tcGlsZV9ldCAkKERFU1RESVIpJChiaW5kaXIpL2NvbXBpbGVfZXQKKwkkKEUpICIJSU5TVEFMTF9EQVRBICQobWFuM2RpcikvY29tX2Vyci4zIgorCSQoUSkgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9jb21fZXJyLjMgJChERVNURElSKSQobWFuM2RpcikvY29tX2Vyci4zCisJJChFKSAiCUlOU1RBTExfREFUQSAkKG1hbjFkaXIpL2NvbXBpbGVfZXQuMSIKKwkkKFEpICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvY29tcGlsZV9ldC4xIFwKKwkJCSQoREVTVERJUikkKG1hbjFkaXIpL2NvbXBpbGVfZXQuMQorCSQoRSkgIglJTlNUQUxMX0RBVEEgJChsaWJkaXIpL3BrZ2NvbmZpZy9jb21fZXJyLnBjIgorCSQoUSkgJChJTlNUQUxMX0RBVEEpIGNvbV9lcnIucGMgJChERVNURElSKSQobGliZGlyKS9wa2djb25maWcvY29tX2Vyci5wYworCit1bmluc3RhbGw6OgorCSQoUk0pIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliY29tX2Vyci5hIFwKKwkJJChERVNURElSKSQoYmluZGlyKS9jb21waWxlX2V0IFwKKwkJJChERVNURElSKSQobGliZGlyKS9wa2djb25maWcvY29tX2Vyci5wYworCSQoUk0pIC1yZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9ldCAkKERFU1RESVIpJChkYXRhZGlyKS9ldAorCitjaGVjazo6IGNvbXBpbGVfZXQKKwlmb3IgaSBpbiAkKHNyY2RpcikvdGVzdF9jYXNlcy8qLmV0IDsgZG8gXAorCQl0PWBiYXNlbmFtZSAkJGkgfCBzZWQgLWUgJ3MvLmV0Ly8nYDsgXAorCQkuL2NvbXBpbGVfZXQgLS1idWlsZC10cmVlICQkaSA7IFwKKwkJZGlmZiAtYyAkKHNyY2RpcikvdGVzdF9jYXNlcy8kJHQuYyAkJHQuYyA+ICQkdC5mYWlsZWQ7IFwKKwkJaWYgWyAkJD8gLW5lIDAgXTsgdGhlbiBlY2hvIFRlc3QgY2FzZSAkJHQgZmFpbGVkOyBleGl0IDEgOyBmaSA7IFwKKwkJZGlmZiAtYyAkKHNyY2RpcikvdGVzdF9jYXNlcy8kJHQuaCAkJHQuaCA+PiAkJHQuZmFpbGVkOyBcCisJCWlmIFsgJCQ/IC1uZSAwIF07IHRoZW4gZWNobyBUZXN0IGNhc2UgJCR0IGZhaWxlZDsgZXhpdCAxIDsgZmkgOyBcCisJCSQoUk0pIC1mICQkdC5jICQkdC5oICQkdC5mYWlsZWQ7IFwKKwkJZWNobyAiVGVzdCBjYXNlICQkdCBzdWNjZWVkZWQiIDsgXAorCWRvbmUKKworY2xlYW46OgorCSQoUk0pIC1mIGNvbXBpbGVfZXQgbGliY29tX2Vyci5hIGxpYmNvbV9lcnJfcC5hIGNvbV9lcnIuaW5mbworCSQoUk0pIC1mICQoT0JKUykgcHJvZmlsZWQvKgorCSQoUk0pIC1mICp+IFwjKiAqLmJhayAqLm90bCAqLmF1eCAqLnRvYyAqLlBTICouZHZpICoucHMgVEFHUyAqLmxuICouaHRtbAorCSQoUk0pIC1mIC4uL2xpYmNvbV9lcnIuYSAuLi9saWJjb21fZXJyX3AuYQorCittb3N0bHljbGVhbjo6IGNsZWFuCitkaXN0Y2xlYW46OiBjbGVhbgorCSQoUk0pIC1mIC5kZXBlbmQgTWFrZWZpbGUgY29tX2Vyci5wYyBcCisJCSQoc3JjZGlyKS9UQUdTICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5vbGQKKworJChPQkpTKTogc3ViZGlycworCisjICsrKyBEZXBlbmRlbmN5IGxpbmUgZWF0ZXIgKysrCisjIAorIyBNYWtlZmlsZSBkZXBlbmRlbmNpZXMgZm9sbG93LiAgVGhpcyBtdXN0IGJlIHRoZSBsYXN0IHNlY3Rpb24gaW4KKyMgdGhlIE1ha2VmaWxlLmluIGZpbGUKKyMKK2Vycm9yX21lc3NhZ2UubzogJChzcmNkaXIpL2Vycm9yX21lc3NhZ2UuYyAkKHNyY2RpcikvY29tX2Vyci5oIFwKKyAkKHNyY2RpcikvZXJyb3JfdGFibGUuaCAkKHNyY2RpcikvaW50ZXJuYWwuaAorZXRfbmFtZS5vOiAkKHNyY2RpcikvZXRfbmFtZS5jICQoc3JjZGlyKS9jb21fZXJyLmggJChzcmNkaXIpL2Vycm9yX3RhYmxlLmggXAorICQoc3JjZGlyKS9pbnRlcm5hbC5oCitpbml0X2V0Lm86ICQoc3JjZGlyKS9pbml0X2V0LmMgJChzcmNkaXIpL2NvbV9lcnIuaCAkKHNyY2RpcikvZXJyb3JfdGFibGUuaAorY29tX2Vyci5vOiAkKHNyY2RpcikvY29tX2Vyci5jICQoc3JjZGlyKS9jb21fZXJyLmggJChzcmNkaXIpL2Vycm9yX3RhYmxlLmggXAorICQoc3JjZGlyKS9pbnRlcm5hbC5oCitjb21fcmlnaHQubzogJChzcmNkaXIpL2NvbV9yaWdodC5jICQoc3JjZGlyKS9jb21fZXJyLmggXAorICQoc3JjZGlyKS9lcnJvcl90YWJsZS5oCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fZXJyLjMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fZXJyLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyNWYwOQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbV9lcnIuMwpAQCAtMCwwICsxLDg3IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg4IE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksCisuXCIgU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIEJvYXJkLiAgCisuXCIKKy5USCBDT01fRVJSIDMgIjIyIE5vdiAxOTg4IiBTSVBCCisuU0ggTkFNRQorY29tX2VyciBcLSBjb21tb24gZXJyb3IgZGlzcGxheSByb3V0aW5lCisuU0ggU1lOT1BTSVMKKy5uZgorICNpbmNsdWRlIDxldC9jb21fZXJyLmg+Cit2b2lkICgqXGZJcHJvY1xmUikgKGNvbnN0IGNoYXIgKiwgbG9uZywgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKy5QUAordm9pZCBjb21fZXJyIChjb25zdCBjaGFyICp3aG9hbWksIGxvbmcgY29kZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworLlBQCitwcm9jID0gc2V0X2NvbV9lcnJfaG9vayAocHJvYyk7CisuUFAKK3Byb2MgPSByZXNldF9jb21fZXJyX2hvb2sgKCk7CisuUFAKK3ZvaWQgaW5pdGlhbGl6ZV9YWFhYX2Vycm9yX3RhYmxlICgpOworLmZpCisuU0ggREVTQ1JJUFRJT04KKy5JIENvbV9lcnIKK2Rpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbQorLkkgc3RkZXJyCisoc2VlCisuSVIgc3RkaW8gKDNTKSkKK2NvbXBvc2VkIG9mIHRoZQorLkkgd2hvYW1pCitzdHJpbmcsIHdoaWNoIHNob3VsZCBzcGVjaWZ5IHRoZSBwcm9ncmFtIG5hbWUgb3Igc29tZSBzdWJwb3J0aW9uIG9mCithIHByb2dyYW0sIGZvbGxvd2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkIGZyb20gdGhlCisuSSBjb2RlCit2YWx1ZSAoZGVyaXZlZCBmcm9tCisuSVIgY29tcGlsZV9ldCAoMSkpLAorYW5kIGEgc3RyaW5nIHByb2R1Y2VkIHVzaW5nIHRoZQorLkkgZm9ybWF0CitzdHJpbmcgYW5kIGFueSBmb2xsb3dpbmcgYXJndW1lbnRzLCBpbiB0aGUgc2FtZSBzdHlsZSBhcworLklSIGZwcmludGYgKDMpLgorCitUaGUgYmVoYXZpb3Igb2YKKy5JIGNvbV9lcnIKK2NhbiBiZSBtb2RpZmllZCB1c2luZworLkkgc2V0X2NvbV9lcnJfaG9vazsKK3RoaXMgZGVmaW5lcyBhIHByb2NlZHVyZSB3aGljaCBpcyBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0bworLkkgY29tX2VyciwKK2luc3RlYWQgb2YgdGhlIGRlZmF1bHQgaW50ZXJuYWwgcHJvY2VkdXJlIHdoaWNoIHNlbmRzIHRoZSBmb3JtYXR0ZWQKK3RleHQgdG8gZXJyb3Igb3V0cHV0LiAgVGh1cyB0aGUgZXJyb3IgbWVzc2FnZXMgZnJvbSBhIHByb2dyYW0gY2FuIGFsbAorZWFzaWx5IGJlIGRpdmVydGVkIHRvIGFub3RoZXIgZm9ybSBvZiBkaWFnbm9zdGljIGxvZ2dpbmcsIHN1Y2ggYXMKKy5JUiBzeXNsb2cgKDMpLgorLkkgUmVzZXRfY29tX2Vycl9ob29rCittYXkgYmUgdXNlZCB0byByZXN0b3JlIHRoZSBiZWhhdmlvciBvZgorLkkgY29tX2VycgordG8gaXRzIGRlZmF1bHQgZm9ybS4gIEJvdGggcHJvY2VkdXJlcyByZXR1cm4gdGhlIHByZXZpb3VzIGBgaG9vaycnCit2YWx1ZS4gIFRoZXNlIGBgaG9vaycnIHByb2NlZHVyZXMgbXVzdCBoYXZlIHRoZSBkZWNsYXJhdGlvbiBnaXZlbiBmb3IKKy5JIHByb2MKK2Fib3ZlIGluIHRoZSBzeW5vcHNpcy4KKworVGhlCisuSSBpbml0aWFsaXplX1hYWFhfZXJyb3JfdGFibGUKK3JvdXRpbmUgaXMgZ2VuZXJhdGVkIG1lY2hhbmljYWxseSBieQorLklSIGNvbXBpbGVfZXQgKDEpCitmcm9tIGEgc291cmNlIGZpbGUgY29udGFpbmluZyBuYW1lcyBhbmQgYXNzb2NpYXRlZCBzdHJpbmdzLiAgRWFjaAordGFibGUgaGFzIGEgbmFtZSBvZiB1cCB0byBmb3VyIGNoYXJhY3RlcnMsIHdoaWNoIGlzIHVzZWQgaW4gcGxhY2Ugb2YKK3RoZQorLkIgWFhYWAoraW4gdGhlIG5hbWUgb2YgdGhlIHJvdXRpbmUuICBUaGVzZSByb3V0aW5lcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQorYW55IG9mIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGVzIGFyZSB1c2VkLCBzbyB0aGF0IHRoZQorLkkgY29tX2VycgorbGlicmFyeSB3aWxsIHJlY29nbml6ZSBlcnJvciBjb2RlcyBmcm9tIHRoZXNlIHRhYmxlcyB3aGVuIHRoZXkgYXJlCit1c2VkLgorCitUaGUKKy5CIGNvbV9lcnIuaAoraGVhZGVyIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFueSBzb3VyY2UgZmlsZSB0aGF0IHVzZXMgcm91dGluZXMKK2Zyb20gdGhlCisuSSBjb21fZXJyCitsaWJyYXJ5OyBleGVjdXRhYmxlIGZpbGVzIG11c3QgYmUgbGlua2VkIHVzaW5nCisuSSBgYC1sY29tX2VycicnCitpbiBvcmRlciB0byBjYXVzZSB0aGUKKy5JIGNvbV9lcnIKK2xpYnJhcnkgdG8gYmUgaW5jbHVkZWQuCisKKy5cIiAuSVIgZm9yIG1hbnVhbCBlbnRyaWVzCisuXCIgLlBQIGZvciBwYXJhZ3JhcGggYnJlYWtzCisKKy5TSCAiU0VFIEFMU08iCitjb21waWxlX2V0ICgxKSwgc3lzbG9nICgzKS4KKworS2VuIFJhZWJ1cm4sICJBIENvbW1vbiBFcnJvciBEZXNjcmlwdGlvbiBMaWJyYXJ5IGZvciBVTklYIi4KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbV9lcnIuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbV9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWFmMTNjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvY29tX2Vyci5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgTUlUIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBCb2FyZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1RFUk1JT1NfSAorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgImNvbV9lcnIuaCIKKyNpbmNsdWRlICJlcnJvcl90YWJsZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyB2b2lkCitkZWZhdWx0X2NvbV9lcnJfcHJvYyAoY29uc3QgY2hhciAqd2hvYW1pLCBlcnJjb2RlX3QgY29kZSwgY29uc3QKKwkJICAgICAgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCisJQ09NX0VSUl9BVFRSKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpOworCitzdGF0aWMgdm9pZAorZGVmYXVsdF9jb21fZXJyX3Byb2MgKGNvbnN0IGNoYXIgKndob2FtaSwgZXJyY29kZV90IGNvZGUsIGNvbnN0CisJCSAgICAgIGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworICAgIGludCBkb19jciA9IDEsIGZkID0gZmlsZW5vKHN0ZGVycik7CisKKyAgICBpZiAod2hvYW1pKSB7CisJZnB1dHMod2hvYW1pLCBzdGRlcnIpOworCWZwdXRzKCI6ICIsIHN0ZGVycik7CisgICAgfQorICAgIGlmIChjb2RlKSB7CisJZnB1dHMoZXJyb3JfbWVzc2FnZShjb2RlKSwgc3RkZXJyKTsKKwlmcHV0cygiICIsIHN0ZGVycik7CisgICAgfQorICAgIGlmIChmbXQpIHsKKyAgICAgICAgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgICB9CisgICAgaWYgKCFpc2F0dHkoZmQpKQorCWRvX2NyID0gMDsKKyNpZmRlZiBIQVZFX1RFUk1JT1NfSAorICAgIGVsc2UgeworCXN0cnVjdCB0ZXJtaW9zIHQ7CisKKwlpZiAoKHRjZ2V0YXR0cihmZCwgJnQpKSA9PSAwICYmCisJICAgICh0LmNfb2ZsYWcgJiBPUE9TVCkgJiYgKHQuY19vZmxhZyAmIE9OTENSKSkKKwlkb19jciA9IDA7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGRvX2NyKQorCWZwdXRjKCdccicsIHN0ZGVycik7CisgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKK30KKwordHlwZWRlZiB2b2lkICgqZXJyZikgKGNvbnN0IGNoYXIgKiwgZXJyY29kZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCitlcnJmIGNvbV9lcnJfaG9vayA9IGRlZmF1bHRfY29tX2Vycl9wcm9jOworCit2b2lkIGNvbV9lcnJfdmEgKGNvbnN0IGNoYXIgKndob2FtaSwgZXJyY29kZV90IGNvZGUsIGNvbnN0IGNoYXIgKmZtdCwKKwkJIHZhX2xpc3QgYXJncykKK3sKKyAgICAoKmNvbV9lcnJfaG9vaykgKHdob2FtaSwgY29kZSwgZm10LCBhcmdzKTsKK30KKwordm9pZCBjb21fZXJyIChjb25zdCBjaGFyICp3aG9hbWksCisJICAgICAgZXJyY29kZV90IGNvZGUsCisJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBwdmFyOworCisgICAgaWYgKCFjb21fZXJyX2hvb2spCisJY29tX2Vycl9ob29rID0gZGVmYXVsdF9jb21fZXJyX3Byb2M7CisgICAgdmFfc3RhcnQocHZhciwgZm10KTsKKyAgICBjb21fZXJyX3ZhICh3aG9hbWksIGNvZGUsIGZtdCwgcHZhcik7CisgICAgdmFfZW5kKHB2YXIpOworfQorCitlcnJmIHNldF9jb21fZXJyX2hvb2sgKG5ld19wcm9jKQorICAgIGVycmYgbmV3X3Byb2M7Cit7CisgICAgZXJyZiB4ID0gY29tX2Vycl9ob29rOworCisgICAgaWYgKG5ld19wcm9jKQorCWNvbV9lcnJfaG9vayA9IG5ld19wcm9jOworICAgIGVsc2UKKwljb21fZXJyX2hvb2sgPSBkZWZhdWx0X2NvbV9lcnJfcHJvYzsKKworICAgIHJldHVybiB4OworfQorCitlcnJmIHJlc2V0X2NvbV9lcnJfaG9vayAoKSB7CisgICAgZXJyZiB4ID0gY29tX2Vycl9ob29rOworICAgIGNvbV9lcnJfaG9vayA9IGRlZmF1bHRfY29tX2Vycl9wcm9jOworICAgIHJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvY29tX2Vyci5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvY29tX2Vyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjEwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fZXJyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciBjb21tb24gZXJyb3IgZGVzY3JpcHRpb24gbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgMTk4OCwgU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIEJvYXJkIG9mIHRoZQorICogTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neS4KKyAqCisgKiBGb3IgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRpb24gaW5mbywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIHN1cHBsaWVkCisgKiB3aXRoIHRoaXMgcGFja2FnZS4KKyAqLworCisjaWYgIWRlZmluZWQoX19DT01fRVJSX0gpICYmICFkZWZpbmVkKF9fQ09NX0VSUl9IX18pCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBDT01fRVJSX0FUVFIoeCkgX19hdHRyaWJ1dGVfXyh4KQorI2Vsc2UKKyNkZWZpbmUgQ09NX0VSUl9BVFRSKHgpCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCit0eXBlZGVmIGxvbmcgZXJyY29kZV90OworCitzdHJ1Y3QgZXJyb3JfdGFibGUgeworCWNoYXIgY29uc3QgKiBjb25zdCAqIG1zZ3M7CisJbG9uZyBiYXNlOworCWludCBuX21zZ3M7Cit9Oworc3RydWN0IGV0X2xpc3Q7CisKK2V4dGVybiB2b2lkIGNvbV9lcnIgKGNvbnN0IGNoYXIgKiwgbG9uZywgY29uc3QgY2hhciAqLCAuLi4pCisJQ09NX0VSUl9BVFRSKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOworCitleHRlcm4gdm9pZCBjb21fZXJyX3ZhIChjb25zdCBjaGFyICp3aG9hbWksIGVycmNvZGVfdCBjb2RlLCBjb25zdCBjaGFyICpmbXQsCisJCSB2YV9saXN0IGFyZ3MpCisJQ09NX0VSUl9BVFRSKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpOworCitleHRlcm4gY2hhciBjb25zdCAqZXJyb3JfbWVzc2FnZSAobG9uZyk7CitleHRlcm4gdm9pZCAoKmNvbV9lcnJfaG9vaykgKGNvbnN0IGNoYXIgKiwgbG9uZywgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK2V4dGVybiB2b2lkICgqc2V0X2NvbV9lcnJfaG9vayAodm9pZCAoKikgKGNvbnN0IGNoYXIgKiwgbG9uZywKKwkJCQkJICBjb25zdCBjaGFyICosIHZhX2xpc3QpKSkKKwkoY29uc3QgY2hhciAqLCBsb25nLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworZXh0ZXJuIHZvaWQgKCpyZXNldF9jb21fZXJyX2hvb2sgKHZvaWQpKSAoY29uc3QgY2hhciAqLCBsb25nLAorCQkJCQkgIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitleHRlcm4gaW50IGluaXRfZXJyb3JfdGFibGUoY29uc3QgY2hhciAqIGNvbnN0ICptc2dzLCBsb25nIGJhc2UsIGludCBjb3VudCk7CisKK2V4dGVybiBlcnJjb2RlX3QgYWRkX2Vycm9yX3RhYmxlKGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSAqIGV0KTsKK2V4dGVybiBlcnJjb2RlX3QgcmVtb3ZlX2Vycm9yX3RhYmxlKGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSAqIGV0KTsKK2V4dGVybiB2b2lkIGFkZF90b19lcnJvcl90YWJsZShzdHJ1Y3QgZXRfbGlzdCAqbmV3X3RhYmxlKTsKKworLyogUHJvdmlkZWQgZm9yIEhlaW1kYWxsIGNvbXBhdGliaWxpdHkgKi8KK2V4dGVybiBjb25zdCBjaGFyICpjb21fcmlnaHQoc3RydWN0IGV0X2xpc3QgKmxpc3QsIGxvbmcgY29kZSk7CitleHRlcm4gY29uc3QgY2hhciAqY29tX3JpZ2h0X3Ioc3RydWN0IGV0X2xpc3QgKmxpc3QsIGxvbmcgY29kZSwgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIGluaXRpYWxpemVfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QsCisJCQkJICAgICBjb25zdCBjaGFyICoqbWVzc2FnZXMsCisJCQkJICAgICBpbnQgbnVtX2Vycm9ycywKKwkJCQkgICAgIGxvbmcgYmFzZSk7CitleHRlcm4gdm9pZCBmcmVlX2Vycm9yX3RhYmxlKHN0cnVjdCBldF9saXN0ICpldCk7CisKKy8qIFByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgY29tX2VyciBsaWJyYXJpZXMgKi8KK2V4dGVybiBpbnQgZXRfbGlzdF9sb2NrKHZvaWQpOworZXh0ZXJuIGludCBldF9saXN0X3VubG9jayh2b2lkKTsKKworI2RlZmluZSBfX0NPTV9FUlJfSAorI2RlZmluZSBfX0NPTV9FUlJfSF9fCisjZW5kaWYgLyogIWRlZmluZWQoX19DT01fRVJSX0gpICYmICFkZWZpbmVkKF9fQ09NX0VSUl9IX18pKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbV9lcnIucGMuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fZXJyLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmVmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fZXJyLnBjLmluCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBjb21fZXJyCitEZXNjcmlwdGlvbjogQ29tbW9uIGVycm9yIGRlc2NyaXB0aW9uIGxpYnJhcnkKK1ZlcnNpb246IEBFMkZTUFJPR1NfVkVSU0lPTkAKK1JlcXVpcmVzOgorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vZXQKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sY29tX2VycgorTGlicy5wcml2YXRlOiBAU0VNX0lOSVRfTElCQApkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvY29tX2Vyci50ZXhpbmZvIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvY29tX2Vyci50ZXhpbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmE0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fZXJyLnRleGluZm8KQEAgLTAsMCArMSw1NDEgQEAKK1xpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi0KKworQGMgJEhlYWRlciQKK0BjICRTb3VyY2UkCitAYyAkTG9ja2VyJAorCitAYyBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBzb3VyY2UgZmlsZSBpcyBpbiB0ZXhpbmZvIGZvcm1hdCAobW9yZQorQGMgb3IgbGVzcyksIGl0IGlzIG5vdCB5ZXQgc3VpdGFibGUgZm9yIHR1cm5pbmcgaW50byBhbiBgYGluZm8nJworQGMgZmlsZS4gIFNvcnJ5LCBtYXliZSBuZXh0IHRpbWUuCitAYworQGMgSW4gb3JkZXIgdG8gcHJvZHVjZSBoYXJkY29weSBkb2N1bWVudGF0aW9uIGZyb20gYSB0ZXhpbmZvIGZpbGUsCitAYyBydW4gYGB0ZXggY29tX2Vyci50ZXhpbmZvJycgd2hpY2ggd2lsbCBsb2FkIGluIHRleGluZm8udGV4LAorQGMgcHJvdmlkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uICAodGV4aW5mby50ZXggaXMgZnJvbSB0aGUgRnJlZQorQGMgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kIGlzIHVuZGVyIGRpZmZlcmVudCBjb3B5cmlnaHQgcmVzdHJpY3Rpb25zCitAYyBmcm9tIHRoZSByZXN0IG9mIHRoaXMgcGFja2FnZS4pCisKK0BzZXRmaWxlbmFtZSBjb21fZXJyCitAc2V0dGl0bGUgQSBDb21tb24gRXJyb3IgRGVzY3JpcHRpb24gTGlicmFyeSBmb3IgVU5JWAorCitAaWZpbmZvCitAZGlyY2F0ZWdvcnkgRGV2ZWxvcG1lbnQKK0BkaXJlbnRyeQorKiBDb21fZXJyOiAoY29tX2VycikuICAgQSBDb21tb24gRXJyb3IgRGVzY3JpcHRpb24gTGlicmFyeSBmb3IgVU5JWC4KK0BlbmQgZGlyZW50cnkKK0BlbmQgaWZpbmZvCisKK0BpZnRleAorQHRvbGVyYW5jZSAxMDAwMAorCitAYyBNdXRhdGUgc2VjdGlvbiBoZWFkZXJzLi4uCitAYmVnaW5ncm91cAorICBAY2F0Y29kZREjPTYKKyAgQGdkZWZAc2VjaGVhZGluZyMxIzIjM3tAc2VjaGVhZGluZ2kgeyMzQGVuc3BhY2UgIzF9fQorQGVuZGdyb3VwCitAZW5kIGlmdGV4CisKK0BpZmluZm8KK1RoaXMgZmlsZSBkb2N1bWVudHMgdGhlIHVzZSBvZiB0aGUgQ29tbW9uIEVycm9yIERlc2NyaXB0aW9uIGxpYnJhcnkuCisKK0NvcHlyaWdodCAoQykgMTk4NywgMTk4OCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQgb2YgdGhlCitNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKK3RoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCit3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4KK21ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKK3B1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitOb3RlIHRoYXQgdGhlIGZpbGUgdGV4aW5mby50ZXgsIHByb3ZpZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24sIGlzIGZyb20KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZCBpcyB1bmRlciBkaWZmZXJlbnQgY29weXJpZ2h0IHJlc3RyaWN0aW9ucworZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoaXMgcGFja2FnZS4KKworQGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKK3Jlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKKyh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KKworQGVuZCBpZ25vcmUKKworQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAorCitAdGl0bGVwYWdlCitAY2VudGVyIEB0aXRsZWZvbnR7QSBDb21tb24gRXJyb3IgRGVzY3JpcHRpb259CitAY2VudGVyIEB0aXRsZWZvbnR7TGlicmFyeSBmb3IgVU5JWH0KK0BzcCAyCitAY2VudGVyIEtlbiBSYWVidXJuCitAY2VudGVyIEJpbGwgU29tbWVyZmVsZAorQHNwIDEKK0BjZW50ZXIgTUlUIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBCb2FyZAorQHNwIDMKK0BjZW50ZXIgbGFzdCB1cGRhdGVkIDEgSmFudWFyeSAxOTg5CitAY2VudGVyIGZvciB2ZXJzaW9uIDEuMgorQGNlbnRlciAqKipEUkFGVCBDT1BZIE9OTFkqKioKKworQHZza2lwIDJpbgorCitAY2VudGVyIEBie0Fic3RyYWN0fQorCitVTklYIGhhcyBhbHdheXMgaGFkIGEgY2xlYW4gYW5kIHNpbXBsZSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UsIHdpdGggYQorc3RhbmRhcmQgc2V0IG9mIGVycm9yIGNvZGVzIHBhc3NlZCBiZXR3ZWVuIHRoZSBrZXJuZWwgYW5kIHVzZXIKK3Byb2dyYW1zLiAgVW5mb3J0dW5hdGVseSwgdGhlIHNhbWUgY2Fubm90IGJlIHNhaWQgb2YgbWFueSBvZiB0aGUKK2xpYnJhcmllcyBsYXllcmVkIG9uIHRvcCBvZiB0aGUgcHJpbWl0aXZlcyBwcm92aWRlZCBieSB0aGUga2VybmVsLgorVHlwaWNhbGx5LCBlYWNoIG9uZSBoYXMgdXNlZCBhIGRpZmZlcmVudCBzdHlsZSBvZiBpbmRpY2F0aW5nIGVycm9ycyB0bwordGhlaXIgY2FsbGVycywgbGVhZGluZyB0byBhIHRvdGFsIGhvZGdlcG9kZ2Ugb2YgZXJyb3IgaGFuZGxpbmcsIGFuZAorY29uc2lkZXJhYmxlIGFtb3VudHMgb2Ygd29yayBmb3IgdGhlIHByb2dyYW1tZXIuICBUaGlzIHBhcGVyIGRlc2NyaWJlcworYSBsaWJyYXJ5IGFuZCBhc3NvY2lhdGVkIHV0aWxpdGllcyB3aGljaCBhbGxvd3MgYSBtb3JlIHVuaWZvcm0gd2F5IGZvcgorbGlicmFyaWVzIHRvIHJldHVybiBlcnJvcnMgdG8gdGhlaXIgY2FsbGVycywgYW5kIGZvciBwcm9ncmFtcyB0bworZGVzY3JpYmUgZXJyb3JzIGFuZCBleGNlcHRpb25hbCBjb25kaXRpb25zIHRvIHRoZWlyIHVzZXJzLgorCitAcGFnZQorQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5ODcsIDE5ODggYnkgdGhlIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZworQm9hcmQgb2YgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAordGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKK3dpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBhbmQgdGhlIE0uSS5ULiBTLkkuUC5CLgorbWFrZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK05vdGUgdGhhdCB0aGUgZmlsZSB0ZXhpbmZvLnRleCwgcHJvdmlkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgZnJvbQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kIGlzIHVuZGVyIGRpZmZlcmVudCBjb3B5cmlnaHQgcmVzdHJpY3Rpb25zCitmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhpcyBwYWNrYWdlLgorCitAZW5kIHRpdGxlcGFnZQorCisKK0Bub2RlIFRvcCwgV2h5IGNvbV9lcnI/LCAoZGlyKSwgKGRpcikKKworQHRvcCBBIENvbW1vbiBFcnJvciBEZXNjcmlwdGlvbiBMaWJyYXJ5IGZvciBVTklYCisKK1RoaXMgbWFudWFsIGRvY3VtZW50cyB0aGUgY29tX2VyciBsaWJyYXJ5LgorCitAbWVudQorKiBXaHkgY29tX2Vycj86OiAgICAgICAgICAgICAgICAKKyogRXJyb3IgY29kZXM6OiAgICAgICAgICAgICAgICAgCisqIEVycm9yIHRhYmxlIHNvdXJjZSBmaWxlOjogICAgIAorKiBUaGUgZXJyb3ItdGFibGUgY29tcGlsZXI6OiAgICAKKyogUnVuLXRpbWUgc3VwcG9ydCByb3V0aW5lczo6ICAgCisqIENvZGluZyBDb252ZW50aW9uczo6ICAgICAgICAgIAorKiBCdWlsZGluZyBhbmQgSW5zdGFsbGF0aW9uOjogICAKKyogQnVnIFJlcG9ydHM6OiAgICAgICAgICAgICAgICAgCisqIEFja25vd2xlZGdlbWVudHM6OiAgICAgICAgICAgIAorQGVuZCBtZW51CisKK0BlbmQgaWZpbmZvCisKK0BwYWdlCisKK0Bub2RlIFdoeSBjb21fZXJyPywgRXJyb3IgY29kZXMsIFRvcCwgVG9wCitAc2VjdGlvbiBXaHkgY29tX2Vycj8KKworSW4gYnVpbGRpbmcgYXBwbGljYXRpb24gc29mdHdhcmUgcGFja2FnZXMsIGEgcHJvZ3JhbW1lciBvZnRlbiBoYXMgdG8KK2RlYWwgd2l0aCBhIG51bWJlciBvZiBsaWJyYXJpZXMsIGVhY2ggb2Ygd2hpY2ggY2FuIHVzZSBhIGRpZmZlcmVudAorZXJyb3ItcmVwb3J0aW5nIG1lY2hhbmlzbS4gIFNvbWV0aW1lcyBvbmUgb2YgdHdvIHZhbHVlcyBpcyByZXR1cm5lZCwKK2luZGljYXRpbmcgc2ltcGx5IFNVQ0NFU1Mgb3IgRkFJTFVSRSwgd2l0aCBubyBkZXNjcmlwdGlvbiBvZiBlcnJvcnMKK2VuY291bnRlcmVkLiAgU29tZXRpbWVzIGl0IGlzIGFuIGluZGV4IGludG8gYSB0YWJsZSBvZiB0ZXh0IHN0cmluZ3MsCit3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBpcyBkZXBlbmRlbnQgb24gdGhlIGxpYnJhcnkgYmVpbmcKK3VzZWQgd2hlbiB0aGUgZXJyb3IgaXMgZ2VuZXJhdGVkOyBzaW5jZSBlYWNoIHRhYmxlIHN0YXJ0cyBudW1iZXJpbmcgYXQKKzAgb3IgMSwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhcyB0byB0aGUgc291cmNlIG9mIHRoZSBlcnJvciBjb2RlIGlzCituZWVkZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHRhYmxlIHRvIGxvb2sgYXQuICBTb21ldGltZXMgbm8gdGV4dCBtZXNzYWdlcyBhcmUKK3N1cHBsaWVkIGF0IGFsbCwgYW5kIHRoZSBwcm9ncmFtbWVyIG11c3Qgc3VwcGx5IHRoZW0gYXQgYW55IHBvaW50IGF0IHdoaWNoCitoZSBtYXkgd2lzaCB0byByZXBvcnQgZXJyb3IgY29uZGl0aW9ucy4KK09mdGVuLCBhIGdsb2JhbCB2YXJpYWJsZSBpcyBhc3NpZ25lZCBzb21lIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGVycm9yLCBidXQKK3RoZSBwcm9ncmFtbWVyIGhhcyB0byBrbm93IGluIGVhY2ggY2FzZSB3aGV0aGVyIHRvIGxvb2sgYXQgQGNvZGV7ZXJybm99LAorQGNvZGV7aF9lcnJub30sIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBAY29kZXtoZXNfZXJyKCl9LCBvciB3aGF0ZXZlciBvdGhlcgordmFyaWFibGVzIG9yIHJvdXRpbmVzIGFyZSBzcGVjaWZpZWQuCitBbmQgd2hhdCBoYXBwZW5zIGlmIHNvbWV0aGluZworaW4gdGhlIHByb2NlZHVyZSBvZgorZXhhbWluaW5nIG9yIHJlcG9ydGluZyB0aGUgZXJyb3IgY2hhbmdlcyB0aGUgc2FtZSB2YXJpYWJsZT8KKworVGhlIHBhY2thZ2Ugd2UgaGF2ZSBkZXZlbG9wZWQgaXMgYW4gYXR0ZW1wdCB0byBwcmVzZW50IGEgY29tbW9uCitlcnJvci1oYW5kbGluZyBtZWNoYW5pc20gdG8gbWFuaXB1bGF0ZSB0aGUgbW9zdCBjb21tb24gZm9ybSBvZiBlcnJvciBjb2RlCitpbiBhIGZhc2hpb24gdGhhdCBkb2VzIG5vdCBoYXZlIHRoZSBwcm9ibGVtcyBsaXN0ZWQgYWJvdmUuCisKK0EgbGlzdCBvZiB1cCB0byAyNTYgdGV4dCBtZXNzYWdlcyBpcyBzdXBwbGllZCB0byBhIHRyYW5zbGF0b3Igd2UgaGF2ZQord3JpdHRlbiwgYWxvbmcgd2l0aCB0aGUgdGhyZWUtIHRvIGZvdXItY2hhcmFjdGVyIGBgbmFtZScnIG9mIHRoZSBlcnJvcgordGFibGUuICBUaGUgbGlicmFyeSB1c2luZyB0aGlzIGVycm9yIHRhYmxlIG5lZWQgb25seSBjYWxsIGEgcm91dGluZQorZ2VuZXJhdGVkIGZyb20gdGhpcyBlcnJvci10YWJsZSBzb3VyY2UgdG8gbWFrZSB0aGUgdGFibGUgYGBrbm93bicnIHRvIHRoZQorY29tX2VyciBsaWJyYXJ5LCBhbmQgYW55IGVycm9yIGNvZGUgdGhlIGxpYnJhcnkgZ2VuZXJhdGVzIGNhbiBiZSBjb252ZXJ0ZWQKK3RvIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2UuICBUaGVyZSBpcyBhbHNvIGEgZGVmYXVsdCBmb3JtYXQgZm9yCitlcnJvciBjb2RlcyBhY2NpZGVudGFsbHkgcmV0dXJuZWQgYmVmb3JlIG1ha2luZyB0aGUgdGFibGUga25vd24sIHdoaWNoIGlzCitvZiB0aGUgZm9ybSBAc2FtcHt1bmtub3duIGNvZGUgZm9vIDMyfSwgd2hlcmUgQHNhbXB7Zm9vfSB3b3VsZCBiZSB0aGUgbmFtZQorb2YgdGhlIHRhYmxlLgorCitAbm9kZSBFcnJvciBjb2RlcywgRXJyb3IgdGFibGUgc291cmNlIGZpbGUsIFdoeSBjb21fZXJyPywgVG9wCitAc2VjdGlvbiBFcnJvciBjb2RlcworCitFcnJvciBjb2RlcyB0aGVtc2VsdmVzIGFyZSAzMiBiaXQgKHNpZ25lZCkgaW50ZWdlcnMsIG9mIHdoaWNoIHRoZSBoaWdoCitvcmRlciAyNCBiaXRzIGFyZSBhbiBpZGVudGlmaWVyIG9mIHdoaWNoIGVycm9yIHRhYmxlIHRoZSBlcnJvciBjb2RlIGlzCitmcm9tLCBhbmQgdGhlIGxvdyBvcmRlciA4IGJpdHMgYXJlIGEgc2VxdWVudGlhbCBlcnJvciBudW1iZXIgd2l0aGluCit0aGUgdGFibGUuICBBbiBlcnJvciBjb2RlIG1heSB0aHVzIGJlIGVhc2lseSBkZWNvbXBvc2VkIGludG8gaXRzIGNvbXBvbmVudAorcGFydHMuICBPbmx5IHRoZSBsb3dlc3QgMzIgYml0cyBvZiBhbiBlcnJvciBjb2RlIGFyZSBjb25zaWRlcmVkIHNpZ25pZmljYW50CitvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgd2lkZXIgdmFsdWVzLgorCitFcnJvciB0YWJsZSAwIGlzIGRlZmluZWQgdG8gbWF0Y2ggdGhlIFVOSVggc3lzdGVtIGNhbGwgZXJyb3IgdGFibGUKKyhAY29kZXtzeXNfZXJybGlzdH0pOyB0aGlzIGFsbG93cyBAY29kZXtlcnJub30gdmFsdWVzIHRvIGJlIHVzZWQgZGlyZWN0bHkKK2luIHRoZSBsaWJyYXJ5IChhc3N1bWluZyB0aGF0IEBjb2Rle2Vycm5vfSBpcyBvZiBhIHR5cGUgd2l0aCB0aGUgc2FtZSB3aWR0aAorYXMgQHR7bG9uZ30pLiAgT3RoZXIgZXJyb3IgdGFibGUgbnVtYmVycyBhcmUgZm9ybWVkIGJ5IGNvbXBhY3RpbmcgdG9nZXRoZXIKK3RoZSBmaXJzdCBmb3VyIGNoYXJhY3RlcnMgb2YgdGhlIGVycm9yIHRhYmxlIG5hbWUuICBUaGUgbWFwcGluZyBiZXR3ZWVuCitjaGFyYWN0ZXJzIGluIHRoZSBuYW1lIGFuZCBudW1lcmljIHZhbHVlcyBpbiB0aGUgZXJyb3IgY29kZSBhcmUgZGVmaW5lZCBpbgorYSBzeXN0ZW0taW5kZXBlbmRlbnQgZmFzaGlvbiwgc28gdGhhdCB0d28gc3lzdGVtcyB0aGF0IGNhbiBwYXNzIGludGVncmFsCit2YWx1ZXMgYmV0d2VlbiB0aGVtIGNhbiByZWxpYWJseSBwYXNzIGVycm9yIGNvZGVzIHdpdGhvdXQgbG9zcyBvZiBtZWFuaW5nOwordGhpcyBzaG91bGQgd29yayBldmVuIGlmIHRoZSBjaGFyYWN0ZXIgc2V0cyB1c2VkIGFyZSBub3QgdGhlIHNhbWUuCisoSG93ZXZlciwgaWYgdGhpcyBpcyB0byBiZSBkb25lLCBlcnJvciB0YWJsZSAwIHNob3VsZCBiZSBhdm9pZGVkLCBzaW5jZSB0aGUKK2xvY2FsIHN5c3RlbSBjYWxsIGVycm9yIHRhYmxlcyBtYXkgZGlmZmVyLikKKworQW55IHZhcmlhYmxlIHdoaWNoIGlzIHRvIGNvbnRhaW4gYW4gZXJyb3IgY29kZSBzaG91bGQgYmUgZGVjbGFyZWQgQHR7bG9uZ30uCitUaGUgZHJhZnQgcHJvcG9zZWQgQW1lcmljYW4gTmF0aW9uYWwgU3RhbmRhcmQgZm9yIEMgKGFzIG9mIE1heSwgMTk4OCkKK3JlcXVpcmVzIHRoYXQgQHR7bG9uZ30gdmFyaWFibGVzIGJlIGF0IGxlYXN0IDMyIGJpdHM7IGFueSBzeXN0ZW0gd2hpY2ggZG9lcworbm90IHN1cHBvcnQgMzItYml0IEB0e2xvbmd9IHZhbHVlcyBjYW5ub3QgbWFrZSB1c2Ugb2YgdGhpcyBwYWNrYWdlIChub3IKK211Y2ggb3RoZXIgc29mdHdhcmUgdGhhdCBhc3N1bWVzIGFuIEFOU0ktQyBlbnZpcm9ubWVudCBiYXNlKSB3aXRob3V0CitzaWduaWZpY2FudCBlZmZvcnQuCisKK0Bub2RlIEVycm9yIHRhYmxlIHNvdXJjZSBmaWxlLCBUaGUgZXJyb3ItdGFibGUgY29tcGlsZXIsIEVycm9yIGNvZGVzLCBUb3AKK0BzZWN0aW9uIEVycm9yIHRhYmxlIHNvdXJjZSBmaWxlCisKK1RoZSBlcnJvciB0YWJsZSBzb3VyY2UgZmlsZSBiZWdpbnMgd2l0aCB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHRhYmxlIG5hbWUsCithcworCitAZXhhbXBsZQorZXJyb3JfdGFibGUgQHZhcnt0YWJsZW5hbWV9CitAZW5kIGV4YW1wbGUKKworSW5kaXZpZHVhbCBlcnJvciBjb2RlcyBhcmUKK3NwZWNpZmllZCB3aXRoCisKK0BleGFtcGxlCitlcnJvcl9jb2RlIEB2YXJ7RVJST1JfTkFNRX0sIEB2YXJ7InRleHQgbWVzc2FnZSJ9CitAZW5kIGV4YW1wbGUKKword2hlcmUgQHNhbXB7ZWN9IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBzaG9ydCBmb3JtIG9mIEBzYW1we2Vycm9yX2NvZGV9LiAgVG8KK2luZGljYXRlIHRoZSBlbmQgb2YgdGhlIHRhYmxlLCB1c2UgQHNhbXB7ZW5kfS4gIFRodXMsIGEgKHNob3J0KSBzYW1wbGUKK2Vycm9yIHRhYmxlIG1pZ2h0IGJlOgorCitAZXhhbXBsZQorCisgICAgICAgIGVycm9yX3RhYmxlICAgICBkc2MKKworICAgICAgICBlcnJvcl9jb2RlICAgICAgRFNDX0RVUF9NVEdfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZWV0aW5nIGFscmVhZHkgZXhpc3RzIgorCisgICAgICAgIGVjICAgICAgICAgICAgICBEU0NfQkFEX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBiYWQgbWVldGluZyBwYXRobmFtZSB3YXMgZ2l2ZW4iCisKKyAgICAgICAgZWMgICAgICAgICAgICAgIERTQ19CQURfTU9ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBtb2RlIGZvciB0aGlzIGFjY2VzcyBjb250cm9sIGxpc3QiCisKKyAgICAgICAgZW5kCisKK0BlbmQgZXhhbXBsZQorCitAbm9kZSBUaGUgZXJyb3ItdGFibGUgY29tcGlsZXIsIFJ1bi10aW1lIHN1cHBvcnQgcm91dGluZXMsIEVycm9yIHRhYmxlIHNvdXJjZSBmaWxlLCBUb3AKK0BzZWN0aW9uIFRoZSBlcnJvci10YWJsZSBjb21waWxlcgorCitUaGUgZXJyb3IgdGFibGUgY29tcGlsZXIgaXMgbmFtZWQgQGNvZGV7Y29tcGlsZV9ldH0uICBJdCB0YWtlcyBvbmUKK2FyZ3VtZW50LCB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlIChlbmRpbmcgaW4gQHNhbXB7LmV0fSwgZS5nLiwKK0BzYW1we2RzY19lcnIuZXR9KSBjb250YWluaW5nIGFuIGVycm9yIHRhYmxlIHNvdXJjZSBmaWxlLiAgSXQgcGFyc2VzIHRoZQorZXJyb3IgdGFibGUsIGFuZCBnZW5lcmF0ZXMgdHdvIG91dHB1dCBmaWxlcyAtLSBhIEMgaGVhZGVyIGZpbGUKKyhAc2FtcHtkaXNjdXNzX2Vyci5ofSkgd2hpY2ggY29udGFpbnMgZGVmaW5pdGlvbnMgb2YgdGhlIG51bWVyaWNhbCB2YWx1ZXMKK29mIHRoZSBlcnJvciBjb2RlcyBkZWZpbmVkIGluIHRoZSBlcnJvciB0YWJsZSwgYW5kIGEgQyBzb3VyY2UgZmlsZSB3aGljaAorc2hvdWxkIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgd2l0aCB0aGUgZXhlY3V0YWJsZS4gIFRoZSBoZWFkZXIgZmlsZSBtdXN0IGJlCitpbmNsdWRlZCBpbiB0aGUgc291cmNlIG9mIGEgbW9kdWxlIHdoaWNoIHdpc2hlcyB0byByZWZlcmVuY2UgdGhlIGVycm9yCitjb2RlcyBkZWZpbmVkOyB0aGUgb2JqZWN0IG1vZHVsZSBnZW5lcmF0ZWQgZnJvbSB0aGUgQyBjb2RlIG1heSBiZSBsaW5rZWQgaW4KK3RvIGEgcHJvZ3JhbSB3aGljaCB3aXNoZXMgdG8gdXNlIHRoZSBwcmludGVkIGZvcm1zIG9mIHRoZSBlcnJvciBjb2Rlcy4KKworQG5vZGUgUnVuLXRpbWUgc3VwcG9ydCByb3V0aW5lcywgQ29kaW5nIENvbnZlbnRpb25zLCBUaGUgZXJyb3ItdGFibGUgY29tcGlsZXIsIFRvcAorQHNlY3Rpb24gUnVuLXRpbWUgc3VwcG9ydCByb3V0aW5lcworCitBbnkgc291cmNlIGZpbGUgd2hpY2ggdXNlcyB0aGUgcm91dGluZXMgc3VwcGxpZWQgd2l0aCBvciBwcm9kdWNlZCBieSB0aGUKK2NvbV9lcnIgcGFja2FnZSBzaG91bGQgaW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUgQGZpbGV7PGNvbV9lcnIuaD59LiAgSXQKK2NvbnRhaW5zIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgd2hpY2ggbWF5IGJlIG5lZWRlZCBvbiBzb21lIHN5c3RlbXMuCisoU29tZSBmdW5jdGlvbnMgY2Fubm90IGJlIHJlZmVyZW5jZWQgcHJvcGVybHkgd2l0aG91dCB0aGUgcmV0dXJuIHR5cGUKK2RlY2xhcmF0aW9ucyBpbiB0aGlzIGZpbGUuICBTb21lIGZ1bmN0aW9ucyBtYXkgd29yayBwcm9wZXJseSBvbiBtb3N0CithcmNoaXRlY3R1cmVzIGV2ZW4gd2l0aG91dCB0aGUgaGVhZGVyIGZpbGUsIGJ1dCByZWx5aW5nIG9uIHRoaXMgaXMgbm90CityZWNvbW1lbmRlZC4pCisKK1RoZSBydW4tdGltZSBzdXBwb3J0IHJvdXRpbmVzIGFuZCB2YXJpYWJsZXMgcHJvdmlkZWQgdmlhIHRoaXMgcGFja2FnZQoraW5jbHVkZSB0aGUgZm9sbG93aW5nOgorCitAZXhhbXBsZQordm9pZCBpbml0aWFsaXplX0B2YXJ7eHh4eH1fZXJyb3JfdGFibGUgKHZvaWQpOworQGVuZCBleGFtcGxlCisKK09uZSBvZiB0aGVzZSByb3V0aW5lcyBpcyBidWlsdCBieSB0aGUgZXJyb3IgY29tcGlsZXIgZm9yIGVhY2ggZXJyb3IgdGFibGUuCitJdCBtYWtlcyB0aGUgQHZhcnt4eHh4fSBlcnJvciB0YWJsZSBgYGtub3duJycgdG8gdGhlIGVycm9yIHJlcG9ydGluZworc3lzdGVtLiAgQnkgY29udmVudGlvbiwgdGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGluaXRpYWxpemF0aW9uCityb3V0aW5lIG9mIHRoZSBAdmFye3h4eHh9IGxpYnJhcnkuICBJZiB0aGUgbGlicmFyeSBoYXMgbm8gaW5pdGlhbGl6YXRpb24KK3JvdXRpbmUsIHNvbWUgY29tYmluYXRpb24gb2Ygcm91dGluZXMgd2hpY2ggZm9ybSB0aGUgY29yZSBvZiB0aGUgbGlicmFyeQorc2hvdWxkIGVuc3VyZSB0aGF0IHRoaXMgcm91dGluZSBpcyBjYWxsZWQuICBJdCBpcyBub3QgYWR2aXNlZCB0byBsZWF2ZSBpdAordGhlIGNhbGxlciB0byBtYWtlIHRoaXMgY2FsbC4KKworVGhlcmUgaXMgbm8gaGFybSBpbiBjYWxsaW5nIHRoaXMgcm91dGluZSBtb3JlIHRoYW4gb25jZS4KKworQGV4YW1wbGUKKyNkZWZpbmUgRVJST1JfVEFCTEVfQkFTRV9AdmFye3h4eHh9IEB2YXJ7bm5ubm59TAorQGVuZCBleGFtcGxlCisKK1RoaXMgc3ltYm9sIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZXJyb3IgY29kZSBlbnRyeSBpbiB0aGUKK3NwZWNpZmllZCB0YWJsZS4KK1RoaXMgcmFyZWx5IG5lZWRzIGJlIHVzZWQgYnkgdGhlCitwcm9ncmFtbWVyLgorCitAZGVmdHlwZWZ1biBjb25zdCBjaGFyICplcnJvcl9tZXNzYWdlIChsb25nIEB2YXJ7Y29kZX0pOworCitUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHN0cmluZyBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQKK3dpdGggQGNvZGV7Y29kZX07IGlmIHRoaXMgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIHVua25vd24gZXJyb3IgdGFibGUsIG9yCitpZiB0aGUgY29kZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBrbm93biBlcnJvciB0YWJsZSBidXQgdGhlIGNvZGUgaXMgbm90CitpbiB0aGUgdGFibGUsIGEgc3RyaW5nIG9mIHRoZSBmb3JtIEBzYW1we1Vua25vd24gY29kZSBAdmFye3h4eHggbm59fSBpcworcmV0dXJuZWQsIHdoZXJlIEB2YXJ7eHh4eH0gaXMgdGhlIGVycm9yIHRhYmxlIG5hbWUgcHJvZHVjZWQgYnkKK3JldmVyc2luZyB0aGUgY29tcGFjdGlvbiBwZXJmb3JtZWQgb24gdGhlIGVycm9yIHRhYmxlIG51bWJlciBpbXBsaWVkCitieSB0aGF0IGVycm9yIGNvZGUsIGFuZCBAdmFye25ufSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhhdCBiYXNlIHZhbHVlLgorCitBbHRob3VnaCB0aGlzIHJvdXRpbmUgaXMgYXZhaWxhYmxlIGZvciB1c2Ugd2hlbiBuZWVkZWQsIGl0cyB1c2Ugc2hvdWxkIGJlCitsZWZ0IHRvIGNpcmN1bXN0YW5jZXMgd2hpY2ggcmVuZGVyIEBjb2Rle2NvbV9lcnJ9IChiZWxvdykgdW51c2FibGUuCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1bgordm9pZCBjb21fZXJyIChjb25zdCBjaGFyICpAdmFye3dob2FtaX0sIGxvbmcgQHZhcntlcnJvcl9jb2RlfSwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pOyAgICAgICAgICAgICAKKworVGhpcyByb3V0aW5lIHByb3ZpZGVzIGFuIGFsdGVybmF0ZSB3YXkgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZXMgdG8KK3N0YW5kYXJkIGVycm9yOyBpdCBhbGxvd3MgdGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgcGFzc2VkIGluIGFzIGEKK3BhcmFtZXRlciwgcmF0aGVyIHRoYW4gaW4gYW4gZXh0ZXJuYWwgdmFyaWFibGUuICBAZW1waHtQcm92aWRlIGdyYW1tYXRpY2FsCitjb250ZXh0IGZvciBgYG1lc3NhZ2UuJyd9CisKK1RoZSBtb2R1bGUgcmVwb3J0aW5nIHRoZSBlcnJvciBzaG91bGQgYmUgcGFzc2VkIGluIHZpYSBAdmFye3dob2FtaX0uCitJZiBAdmFye2Zvcm1hdH0gaXMgQGNvZGV7KGNoYXIgKilOVUxMfSwgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIHdpbGwgbm90IGJlCitwcmludGVkLiAgQHZhcntmb3JtYXR9IG1heSBub3QgYmUgb21pdHRlZC4KKworQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuCit2b2lkIGNvbV9lcnJfdmEgKGNvbnN0IGNoYXIgKkB2YXJ7d2hvYW1pfSwgbG9uZyBAdmFye2Vycm9yX2NvZGV9LCBjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIHZhX2xpc3QgQHZhcnthcmdzfSk7CisKK1RoaXMgcm91dGluZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UsIGVxdWl2YWxlbnQgdG8gQGNvZGV7Y29tX2Vycn0gYWJvdmUsCit3aGljaCBtYXkgYmUgdXNlZCBieSBoaWdoZXItbGV2ZWwgdmFyaWFkaWMgZnVuY3Rpb25zIChmdW5jdGlvbnMgd2hpY2gKK2FjY2VwdCB2YXJpYWJsZSBudW1iZXJzIG9mIGFyZ3VtZW50cykuCisKK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biB2b2lkICgqc2V0X2NvbV9lcnJfaG9vayAodm9pZCAoKkB2YXJ7cHJvY30pIChjb25zdCBjaGFyICpAdmFye3dob2FtaX0sIGxvbmcgQHZhcntlcnJvcl9jb2RlfSwgdmFfbGlzdCBAdmFye2FyZ3N9KSkpIChjb25zdCBjaGFyICpAdmFye3dob2FtaX0sIGxvbmcgQHZhcntlcnJvcl9jb2RlfSwgdmFfbGlzdCBAdmFye2FyZ3N9KTsKKworQGRlZnR5cGVmdW54IHZvaWQgcmVzZXRfY29tX2Vycl9ob29rICgpOworCitUaGVzZSB0d28gcm91dGluZXMgYWxsb3cgYSByb3V0aW5lIHRvIGJlIGR5bmFtaWNhbGx5IHN1YnN0aXR1dGVkIGZvcgorQHNhbXB7Y29tX2Vycn0uICBBZnRlciBAc2FtcHtzZXRfY29tX2Vycl9ob29rfSBoYXMgYmVlbiBjYWxsZWQsCitjYWxscyB0byBAc2FtcHtjb21fZXJyfSB3aWxsIHR1cm4gaW50byBjYWxscyB0byB0aGUgbmV3IGhvb2sgcm91dGluZS4KK0BzYW1we3Jlc2V0X2NvbV9lcnJfaG9va30gdHVybnMgb2ZmIHRoaXMgaG9vay4gIFRoaXMgbWF5IGludGVuZGVkIHRvCitiZSB1c2VkIGluIGRhZW1vbnMgKHRvIHVzZSBhIHJvdXRpbmUgd2hpY2ggY2FsbHMgQGNpdGV7c3lzbG9nKDMpfSksIG9yCitpbiBhIHdpbmRvdyBzeXN0ZW0gYXBwbGljYXRpb24gKHdoaWNoIGNvdWxkIHBvcCB1cCBhIGRpYWxvZ3VlIGJveCkuCisKK0lmIGEgcHJvZ3JhbSBpcyB0byBiZSB1c2VkIGluIGFuIGVudmlyb25tZW50IGluIHdoaWNoIHNpbXBseSBwcmludGluZworbWVzc2FnZXMgdG8gdGhlIEBjb2Rle3N0ZGVycn0gc3RyZWFtIHdvdWxkIGJlIGluYXBwcm9wcmlhdGUgKHN1Y2ggYXMgaW4gYQorZGFlbW9uIHByb2dyYW0gd2hpY2ggcnVucyB3aXRob3V0IGEgdGVybWluYWwgYXR0YWNoZWQpLAorQGNvZGV7c2V0X2NvbV9lcnJfaG9va30gbWF5IGJlIHVzZWQgdG8gcmVkaXJlY3Qgb3V0cHV0IGZyb20gQGNvZGV7Y29tX2Vycn0uCitUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXJyb3IgaGFuZGxlciB3aGljaCB1c2VzIEBjaXRle3N5c2xvZygzKX0KK2FzIHN1cHBsaWVkIGluIEJTRCA0LjM6CisKK0BleGFtcGxlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworLyogZXh0ZXJuIG9wZW5sb2cgKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbG9nb3B0LCBpbnQgZmFjaWxpdHkpOyAqLworLyogZXh0ZXJuIHN5c2xvZyAoaW50IHByaW9yaXR5LCBjaGFyICogbWVzc2FnZSwgLi4uKTsgKi8KKwordm9pZCBob29rIChjb25zdCBjaGFyICogd2hvYW1pLCBsb25nIGNvZGUsCisgICAgICAgICAgIGNvbnN0IGNoYXIgKiBmb3JtYXQsIHZhX2xpc3QgYXJncykKK0B7CisgICAgY2hhciBidWZmZXJbQlVGU0laXTsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkKSBAeworICAgICAgICBvcGVubG9nICh3aG9hbWksCisgICAgICAgICAgICAgICAgIExPR19OT1dBSVR8TE9HX0NPTlN8TE9HX1BJRHxMT0dfTkRFTEFZLAorICAgICAgICAgICAgICAgICBMT0dfREFFTU9OKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIEB9CisgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKKyAgICBzeXNsb2cgKExPR19FUlIsICIlcyAlcyIsIGVycm9yX21lc3NhZ2UgKGNvZGUpLCBidWZmZXIpOworQH0KK0BlbmQgZXhhbXBsZQorCitBZnRlciBtYWtpbmcgdGhlIGNhbGwKK0Bjb2Rle3NldF9jb21fZXJyX2hvb2sgKGhvb2spO30sCithbnkgY2FsbHMgdG8gQGNvZGV7Y29tX2Vycn0gd2lsbCByZXN1bHQgaW4gbWVzc2FnZXMgYmVpbmcgc2VudCB0byB0aGUKK0B2YXJ7c3lzbG9nZH0gZGFlbW9uIGZvciBsb2dnaW5nLgorVGhlIG5hbWUgb2YgdGhlIHByb2dyYW0sIEBzYW1we3dob2FtaX0sIGlzIHN1cHBsaWVkIHRvIHRoZQorQHNhbXB7b3BlbmxvZygpfSBjYWxsLCBhbmQgdGhlIG1lc3NhZ2UgaXMgZm9ybWF0dGVkIGludG8gYSBidWZmZXIgYW5kCitwYXNzZWQgdG8gQGNvZGV7c3lzbG9nfS4KKworTm90ZSB0aGF0IHNpbmNlIHRoZSBleHRyYSBhcmd1bWVudHMgdG8gQGNvZGV7Y29tX2Vycn0gYXJlIHBhc3NlZCBieQorcmVmZXJlbmNlIHZpYSB0aGUgQGNvZGV7dmFfbGlzdH0gdmFsdWUgQGNvZGV7YXJnc30sIHRoZSBob29rIHJvdXRpbmUgbWF5CitwbGFjZSBhbnkgZm9ybSBvZiBpbnRlcnByZXRhdGlvbiBvbiB0aGVtLCBpbmNsdWRpbmcgaWdub3JpbmcgdGhlbS4gIEZvcgorY29uc2lzdGVuY3ksIEBjb2Rle3ByaW50Zn0tc3R5bGUgaW50ZXJwcmV0YXRpb24gaXMgc3VnZ2VzdGVkLCB2aWEKK0Bjb2Rle3ZzcHJpbnRmfSAob3IgQGNvZGV7X2RvcHJudH0gb24gQlNEIHN5c3RlbXMgd2l0aG91dCBmdWxsIHN1cHBvcnQgZm9yCit0aGUgQU5TSSBDIGxpYnJhcnkpLgorCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgQ29kaW5nIENvbnZlbnRpb25zLCBCdWlsZGluZyBhbmQgSW5zdGFsbGF0aW9uLCBSdW4tdGltZSBzdXBwb3J0IHJvdXRpbmVzLCBUb3AKK0BzZWN0aW9uIENvZGluZyBDb252ZW50aW9ucworCitUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFyZSBqdXN0IHNvbWUgZ2VuZXJhbCBzdHlsaXN0aWMgY29udmVudGlvbnMKK3RvIGZvbGxvdyB3aGVuIHdyaXRpbmcgcm9idXN0IGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMuICBDb252ZW50aW9ucworc2ltaWxhciB0byB0aGlzIGFyZSBnZW5lcmFsbHkgZm9sbG93ZWQgaW5zaWRlIHRoZSBVTklYIGtlcm5lbCBhbmQgbW9zdAorcm91dGluZXMgaW4gdGhlIE11bHRpY3Mgb3BlcmF0aW5nIHN5c3RlbS4gIEluIGdlbmVyYWwsIGEgcm91dGluZQorZWl0aGVyIHN1Y2NlZWRzIChyZXR1cm5pbmcgYSB6ZXJvIGVycm9yIGNvZGUsIGFuZCBkb2luZyBzb21lIHNpZGUKK2VmZmVjdHMgaW4gdGhlIHByb2Nlc3MpLCBvciBpdCBmYWlscywgZG9pbmcgbWluaW1hbCBzaWRlIGVmZmVjdHM7IGluCithbnkgZXZlbnQsIGFueSBpbnZhcmlhbnQgd2hpY2ggdGhlIGxpYnJhcnkgYXNzdW1lcyBtdXN0IGJlIG1haW50YWluZWQuCisKK0luIGdlbmVyYWwsIGl0IGlzIG5vdCBpbiB0aGUgZG9tYWluIG9mIG5vbiB1c2VyLWludGVyZmFjZSBsaWJyYXJ5Cityb3V0aW5lcyB0byB3cml0ZSBlcnJvciBtZXNzYWdlcyB0byB0aGUgdXNlcidzIHRlcm1pbmFsLCBvciBoYWx0IHRoZQorcHJvY2Vzcy4gIFN1Y2ggZm9ybXMgb2YgYGBlcnJvciBoYW5kbGluZycnIHNob3VsZCBiZSByZXNlcnZlZCBmb3IKK2ZhaWx1cmVzIG9mIGludGVybmFsIGludmFyaWFudHMgYW5kIGNvbnNpc3RhbmN5IGNoZWNrcyBvbmx5LCBhcyBpdAorcHJvdmlkZXMgdGhlIHVzZXIgb2YgdGhlIGxpYnJhcnkgbm8gd2F5IHRvIGNsZWFuIHVwIGZvciBoaW1zZWxmIGluIHRoZQorZXZlbnQgb2YgdG90YWwgZmFpbHVyZS4KKworTGlicmFyeSByb3V0aW5lcyB3aGljaCBjYW4gZmFpbCBzaG91bGQgYmUgc2V0IHVwIHRvIHJldHVybiBhbiBlcnJvcgorY29kZS4gIFRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgZG9uZSBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQorZnVuY3Rpb247IGlmIHRoaXMgaXMgbm90IGFjY2VwdGFibGUsIHRoZSByb3V0aW5lIHNob3VsZCByZXR1cm4gYQorYGBudWxsJycgdmFsdWUsIGFuZCBwdXQgdGhlIGVycm9yIGNvZGUgaW50byBhIHBhcmFtZXRlciBwYXNzZWQgYnkKK3JlZmVyZW5jZS4KKworUm91dGluZXMgd2hpY2ggdXNlIHRoZSBmaXJzdCBzdHlsZSBvZiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgZnJvbQordXNlci1pbnRlcmZhY2UgbGV2ZWxzIG9mIGEgcHJvZ3JhbSBhcyBmb2xsb3dzOgorCitAZXhhbXBsZQorQHsKKyAgICBpZiAoKGNvZGUgPSBpbml0aWFsaXplX3dvcmxkKGdldHVpZCgpLCByYW5kb20oKSkpICE9IDApIEB7CisgICAgICAgIGNvbV9lcnIoImRlbW8iLCBjb2RlLAorICAgICAgICAgICAgICAgICJ3aGVuIHRyeWluZyB0byBpbml0aWFsaXplIHdvcmxkIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgQH0KKyAgICBpZiAoKGRhdGFiYXNlID0gb3Blbl9kYXRhYmFzZSgibXlfc2VjcmV0cyIsICZjb2RlKSk9PU5VTEwpIEB7CisgICAgICAgIGNvbV9lcnIoImRlbW8iLCBjb2RlLAorICAgICAgICAgICAgICAgICJ3aGlsZSBvcGVuaW5nIG15X3NlY3JldHMiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICBAfQorQH0KK0BlbmQgZXhhbXBsZQorCitBIGNhbGxlciB3aGljaCBmYWlscyB0byBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cyBpcyBpbiBlcnJvci4gIEl0IGlzCitwb3NzaWJsZSB0byBsb29rIGZvciBjb2RlIHdoaWNoIGlnbm9yZXMgZXJyb3IgcmV0dXJucyBieSB1c2luZyBsaW50OworbG9vayBmb3IgZXJyb3IgbWVzc2FnZXMgb2YgdGhlIGZvcm0gYGBmb29iYXIgcmV0dXJucyB2YWx1ZSB3aGljaCBpcworc29tZXRpbWVzIGlnbm9yZWQnJyBvciBgYGZvb2JhciByZXR1cm5zIHZhbHVlIHdoaWNoIGlzIGFsd2F5cworaWdub3JlZC4nJworCitTaW5jZSBsaWJyYXJpZXMgbWF5IGJlIGJ1aWx0IG91dCBvZiBvdGhlciBsaWJyYXJpZXMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeQorZm9yIHRoZSBzdWNjZXNzIG9mIG9uZSByb3V0aW5lIHRvIGRlcGVuZCBvbiBhbm90aGVyLiAgV2hlbiBhIGxvd2VyIGxldmVsCityb3V0aW5lIHJldHVybnMgYW4gZXJyb3IgY29kZSwgdGhlIG1pZGRsZSBsZXZlbCByb3V0aW5lIGhhcyBhIGZldyBwb3NzaWJsZQorb3B0aW9ucy4gIEl0IGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBlcnJvciBjb2RlIHRvIGl0cyBjYWxsZXIgYWZ0ZXIgZG9pbmcKK3NvbWUgZm9ybSBvZiBjbGVhbnVwLCBpdCBjYW4gc3Vic3RpdHV0ZSBvbmUgb2YgaXRzIG93biwgb3IgaXQgY2FuIHRha2UKK2NvcnJlY3RpdmUgYWN0aW9uIG9mIGl0cyBvd24gYW5kIGNvbnRpbnVlIG5vcm1hbGx5LiAgRm9yIGluc3RhbmNlLCBhCitsaWJyYXJ5IHJvdXRpbmUgd2hpY2ggbWFrZXMgYSBgYGNvbm5lY3QnJyBzeXN0ZW0gY2FsbCB0byBtYWtlIGEgbmV0d29yaworY29ubmVjdGlvbiBtYXkgcmVmbGVjdCB0aGUgc3lzdGVtIGVycm9yIGNvZGUgQGNvZGV7RUNPTk5SRUZVU0VEfQorKENvbm5lY3Rpb24gcmVmdXNlZCkgdG8gaXRzIGNhbGxlciwgb3IgaXQgbWF5IHJldHVybiBhIGBgc2VydmVyIG5vdAorYXZhaWxhYmxlLCB0cnkgYWdhaW4gbGF0ZXIsJycgb3IgaXQgbWF5IHRyeSBhIGRpZmZlcmVudCBzZXJ2ZXIuCisKK0NsZWFudXAgd2hpY2ggaXMgdHlwaWNhbGx5IG5lY2Vzc2FyeSBtYXkgaW5jbHVkZSwgYnV0IG5vdCBiZSBsaW1pdGVkCit0bywgZnJlZWluZyBhbGxvY2F0ZWQgbWVtb3J5IHdoaWNoIHdpbGwgbm90IGJlIG5lZWRlZCBhbnkgbW9yZSwKK3VubG9ja2luZyBjb25jdXJyYW5jeSBsb2NrcywgZHJvcHBpbmcgcmVmZXJlbmNlIGNvdW50cywgY2xvc2luZyBmaWxlCitkZXNjcmlwdG9ycywgb3Igb3RoZXJ3aXNlIHVuZG9pbmcgYW55dGhpbmcgd2hpY2ggdGhlIHByb2NlZHVyZSBkaWQgdXAKK3RvIHRoaXMgcG9pbnQuICBXaGVuIHRoZXJlIGFyZSBhIGxvdCBvZiB0aGluZ3Mgd2hpY2ggY2FuIGdvIHdyb25nLCBpdAoraXMgZ2VuZXJhbGx5IGdvb2QgdG8gd3JpdGUgb25lIGJsb2NrIG9mIGVycm9yLWhhbmRsaW5nIGNvZGUgd2hpY2ggaXMKK2JyYW5jaGVkIHRvLCB1c2luZyBhIGdvdG8sIGluIHRoZSBldmVudCBvZiBmYWlsdXJlLiAgQSBjb21tb24gc291cmNlCitvZiBlcnJvcnMgaW4gVU5JWCBwcm9ncmFtcyBpcyBmYWlsaW5nIHRvIGNsb3NlIGZpbGUgZGVzY3JpcHRvcnMgb24KK2Vycm9yIHJldHVybnM7IHRoaXMgbGVhdmVzIGEgbnVtYmVyIG9mIGBgem9tYmllZCcnIGZpbGUgZGVzY3JpcHRvcnMKK29wZW4sIHdoaWNoIGV2ZW50dWFsbHkgY2F1c2VzIHRoZSBwcm9jZXNzIHRvIHJ1biBvdXQgb2YgZmlsZQorZGVzY3JpcHRvcnMgYW5kIGZhbGwgb3Zlci4KKworQGV4YW1wbGUKK0B7CisgICAgRklMRSAqZjE9TlVMTCwgKmYyPU5VTEwsICpmMz1OVUxMOworICAgIGludCBzdGF0dXMgPSAwOworCisgICAgaWYgKCAoZjEgPSBmb3BlbihGSUxFMSwgInIiKSkgPT0gTlVMTCkgQHsKKyAgICAgICAgc3RhdHVzID0gZXJybm87CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgQH0KKworICAgIC8qCisgICAgICogQ3J1bmNoIGZvciBhIHdoaWxlCisgICAgICovCisKKyAgICBpZiAoIChmMiA9IGZvcGVuKEZJTEUyLCAidyIpKSA9PSBOVUxMKSBAeworICAgICAgICBzdGF0dXMgPSBlcnJubzsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBAfQorCisgICAgaWYgKCAoZjMgPSBmb3BlbihGSUxFMywgImErIikpID09IE5VTEwpIEB7CisgICAgICAgIHN0YXR1cyA9IGVycm5vOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICBAfQorCisgICAgLyoKKyAgICAgKiBEbyBtb3JlIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgZmNsb3NlKGYxKTsKKyAgICBmY2xvc2UoZjIpOworICAgIGZjbG9zZShmMyk7CisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmIChmMSkgZmNsb3NlKGYxKTsKKyAgICBpZiAoZjIpIGZjbG9zZShmMik7CisgICAgaWYgKGYzKSBmY2xvc2UoZjMpOworICAgIHJldHVybiBzdGF0dXM7CitAfQorQGVuZCBleGFtcGxlCisKK0Bub2RlIEJ1aWxkaW5nIGFuZCBJbnN0YWxsYXRpb24sIEJ1ZyBSZXBvcnRzLCBDb2RpbmcgQ29udmVudGlvbnMsIFRvcAorQHNlY3Rpb24gQnVpbGRpbmcgYW5kIEluc3RhbGxhdGlvbgorCitUaGUgZGlzdHJpYnV0aW9uIG9mIHRoaXMgcGFja2FnZSB3aWxsIHByb2JhYmx5IGJlIGRvbmUgYXMgYSBjb21wcmVzc2VkCitgYHRhcicnLWZvcm1hdCBmaWxlIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIEZUUCBmcm9tIFNJUEIuTUlULkVEVS4KK1JldHJpZXZlIEBzYW1we3B1Yi9jb21fZXJyLnRhci5afSBhbmQgZXh0cmFjdCB0aGUgY29udGVudHMuICBBIHN1YmRpcmVjdG9yeQorQHR7cHJvZmlsZWR9IHNob3VsZCBiZSBjcmVhdGVkIHRvIGhvbGQgb2JqZWN0cyBjb21waWxlZCBmb3IgcHJvZmlsaW5nLgorUnVubmluZyBgYG1ha2UgYWxsJycgc2hvdWxkIHRoZW4gYmUgc3VmZmljaWVudCB0byBidWlsZCB0aGUgbGlicmFyeSBhbmQKK2Vycm9yLXRhYmxlIGNvbXBpbGVyLiAgVGhlIGZpbGVzIEBzYW1we2xpYmNvbV9lcnIuYX0sCitAc2FtcHtsaWJjb21fZXJyX3AuYX0sIEBzYW1we2NvbV9lcnIuaH0sIGFuZCBAc2FtcHtjb21waWxlX2V0fSBzaG91bGQgYmUKK2luc3RhbGxlZCBmb3IgdXNlOyBAc2FtcHtjb21fZXJyLjN9IGFuZCBAc2FtcHtjb21waWxlX2V0LjF9IGNhbiBhbHNvIGJlCitpbnN0YWxsZWQgYXMgbWFudWFsIHBhZ2VzLgorCitAbm9kZSBCdWcgUmVwb3J0cywgQWNrbm93bGVkZ2VtZW50cywgQnVpbGRpbmcgYW5kIEluc3RhbGxhdGlvbiwgVG9wCitAc2VjdGlvbiBCdWcgUmVwb3J0cworCitUaGUgcHJpbmNpcGFsIGF1dGhvciBvZiB0aGlzIGxpYnJhcnkgaXM6IEtlbgorUmFlYnVybiwgQHR7cmFlYnVybkBATUlULkVEVX0uICAKKworVGhpcyB2ZXJzaW9uIG9mIHRoZSBjb21fZXJyIGxpYnJhcnkgaXMgYmVpbmcgbWFpbnRhaW5lZCBieSBUaGVvZG9yZQorVHMnbywgYW5kIHNvIGJ1Z3MgYW5kIGNvbW1lbnRzIHNob3VsZCBiZSBzZW50IHRvIEB0e3R5dHNvQEB0aHVuay5vcmd9LgorCisKK0Bub2RlIEFja25vd2xlZGdlbWVudHMsICAsIEJ1ZyBSZXBvcnRzLCBUb3AKK0BzZWN0aW9uIEFja25vd2xlZGdlbWVudHMKKworSSB3b3VsZCBsaWtlIHRvIHRoYW5rOiBCaWxsIFNvbW1lcmZlbGQsIGZvciBoaXMgaGVscCB3aXRoIHNvbWUgb2YgdGhpcworZG9jdW1lbnRhdGlvbiwgYW5kIGNhdGNoaW5nIHNvbWUgb2YgdGhlIGJ1Z3MgdGhlIGZpcnN0IHRpbWUgYXJvdW5kOworSG9uZXl3ZWxsIEluZm9ybWF0aW9uIFN5c3RlbXMsIGZvciBub3Qga2lsbGluZyBvZmYgdGhlIEBlbXBoe011bHRpY3N9CitvcGVyYXRpbmcgc3lzdGVtIGJlZm9yZSBJIGhhZCBhbiBvcHBvcnR1bml0eSB0byB1c2UgaXQ7IEhvbmV5d2VsbCdzCitjdXN0b21lcnMsIHdobyBwZXJzdWFkZWQgdGhlbSBub3QgdG8gZG8gc28sIGZvciBhIHdoaWxlOyBUZWQgQW5kZXJzb24gb2YKK0NNVSwgZm9yIGNhdGNoaW5nIHNvbWUgcHJvYmxlbXMgYmVmb3JlIHZlcnNpb24gMS4yIGxlZnQgdGhlIG5lc3Q7IFN0YW4KK1phbmFyb3R0aSBhbmQgc2V2ZXJhbCBvdGhlcnMgb2YgTUlUJ3MgU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIEJvYXJkLAorZm9yIGdldHRpbmcgdXMgc3RhcnRlZCB3aXRoIGBgZGlzY3VzcywnJyBmb3Igd2hpY2ggdGhpcyBwYWNrYWdlIHdhcworb3JpZ2luYWxseSB3cml0dGVuOyBhbmQgZXZlcnlvbmUgSSd2ZSB0YWxrZWQgaW50byAtLS0gSSBtZWFuLCBhc2tlZCB0byByZWFkCit0aGlzIGRvY3VtZW50IGFuZCB0aGUgYGBtYW4nJyBwYWdlcy4KKworQGNvbnRlbnRzCitAYnllCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fcmlnaHQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbV9yaWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMGU5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21fcmlnaHQuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIGNvbV9yaWdodC5jIC0tIHByb3ZpZGUgSGVpbWRhbGwgLyBLZXJiZXJvczRrdGggY29tX2VyciBpbnRlcmZhY2VzCisgKiAJZm9yIGJhY2t3YXJkcyBjb21wYXRiaWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgVGhlb2RvcmUgVHMnbworICoKKyAqIFRha2VuIGZyb20gbGliL2NvbV9lcnIvZXJyb3IuYyBmcm9tIEtlcmJlcm9zNGt0aCBkaXN0cmlidXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAyMDAxIEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgorICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjb21fZXJyLmgiCisjaW5jbHVkZSAiZXJyb3JfdGFibGUuaCIKKworY29uc3QgY2hhciAqCitjb21fcmlnaHQoc3RydWN0IGV0X2xpc3QgKmxpc3QsIGxvbmcgY29kZSkKK3sKKyAgICBzdHJ1Y3QgZXRfbGlzdCAqcDsKKyAgICBmb3IgKHAgPSBsaXN0OyBwOyBwID0gcC0+bmV4dCkgeworCWlmIChjb2RlID49IHAtPnRhYmxlLT5iYXNlICYmIGNvZGUgPCBwLT50YWJsZS0+YmFzZSArIHAtPnRhYmxlLT5uX21zZ3MpCisJICAgIHJldHVybiBwLT50YWJsZS0+bXNnc1tjb2RlIC0gcC0+dGFibGUtPmJhc2VdOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqCitjb21fcmlnaHRfcihzdHJ1Y3QgZXRfbGlzdCAqbGlzdCwgbG9uZyBjb2RlLCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCit7CisgICAgc3RydWN0IGV0X2xpc3QgKnA7CisgICAgZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwlpZiAoKGNvZGUgPj0gcC0+dGFibGUtPmJhc2UpICYmCisJICAgIChjb2RlIDwgcC0+dGFibGUtPmJhc2UgKyBwLT50YWJsZS0+bl9tc2dzKSkgeworICAgICAgICAgICAgc3RybmNweShzdHIsIHAtPnRhYmxlLT5tc2dzW2NvZGUgLSBwLT50YWJsZS0+YmFzZV0sIGxlbik7CisgICAgICAgICAgICBzdHJbbGVuLTFdID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBmb29iYXIgeworICAgIHN0cnVjdCBldF9saXN0IGV0bDsKKyAgICBzdHJ1Y3QgZXJyb3JfdGFibGUgdGFiOworfTsKKworLyoKKyAqIFdlIHByb3ZpZGUgdGhpcyByb3V0aW5lIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSGVpbWRhbGwgZ2VuZXJhdGVkCisgKiBmb29fZXJyLmMgZmlsZXMsIGJ1dCB3ZSBkb24ndCB1c2UgdGhpcyBvdXJzZWx2ZXMgZm9yIGZvb19lcnIuYworICogZmlsZXMgZ2VuZXJhdGVkIGJ5IG91ciBjb21waWxlX2V0LiAgVGhpcyBpcyBzbyBvdXIgZm9vX2Vyci5jCisgKiBmaWxlcyBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIGNvbV9lcnIgbGlicmFyaWVzIHdpdGhvdXQgcnVubmluZworICogYWZvdWwgb2YgZGVwZW5kZW5jaWVzLgorICovCit2b2lkCitpbml0aWFsaXplX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0LAorCQkJIGNvbnN0IGNoYXIgKiptZXNzYWdlcywKKwkJCSBpbnQgbnVtX2Vycm9ycywKKwkJCSBsb25nIGJhc2UpCit7CisgICAgc3RydWN0IGV0X2xpc3QgKmV0LCAqKmVuZDsKKyAgICBzdHJ1Y3QgZXJyb3JfdGFibGUgKnRhYjsKKyAgICBzdHJ1Y3QgZm9vYmFyICpmOworCisgICAgZm9yIChlbmQgPSBsaXN0LCBldCA9ICpsaXN0OyBldDsgZW5kID0gJmV0LT5uZXh0LCBldCA9IGV0LT5uZXh0KQorICAgICAgICBpZiAoZXQtPnRhYmxlLT5tc2dzID09IG1lc3NhZ2VzKQorICAgICAgICAgICAgcmV0dXJuOworICAgIGYgPSBtYWxsb2Moc2l6ZW9mKCpmKSk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGV0ID0gJmYtPmV0bDsKKyAgICBldC0+dGFibGUgPSB0YWIgPSAmZi0+dGFiOworICAgIHRhYi0+bXNncyA9IG1lc3NhZ2VzOworICAgIHRhYi0+bl9tc2dzID0gbnVtX2Vycm9yczsKKyAgICB0YWItPmJhc2UgPSBiYXNlOworICAgIGV0LT5uZXh0ID0gTlVMTDsKKyAgICAqZW5kID0gZXQ7Cit9CisKKwordm9pZAorZnJlZV9lcnJvcl90YWJsZShzdHJ1Y3QgZXRfbGlzdCAqZXQpCit7CisgICAgd2hpbGUoZXQpeworCXN0cnVjdCBldF9saXN0ICpwID0gZXQ7CisJZXQgPSBldC0+bmV4dDsKKwlmcmVlKHApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbXBpbGVfZXQuMSBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbXBpbGVfZXQuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjE5NDQxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvY29tcGlsZV9ldC4xCkBAIC0wLDAgKzEsODIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODggTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKy5cIiBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgJEhlYWRlciQKKy5cIgorLlRIIENPTVBJTEVfRVQgMSAiMzAgTWFyIDE5OTgiIFNJUEIKKy5TSCBOQU1FCitjb21waWxlX2V0IFwtIGVycm9yIHRhYmxlIGNvbXBpbGVyCisuU0ggU1lOT1BTSVMKKy5CIGNvbXBpbGVfZXQKK2ZpbGUKKy5TSCBERVNDUklQVElPTgorLkIgQ29tcGlsZV9ldAorY29udmVydHMgYSB0YWJsZSBsaXN0aW5nIGVycm9yLWNvZGUgbmFtZXMgYW5kIGFzc29jaWF0ZWQgbWVzc2FnZXMgaW50bworYSBDIHNvdXJjZSBmaWxlIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCB0aGUKKy5JUiBjb21fZXJyICgzKQorbGlicmFyeS4KKworVGhlIHNvdXJjZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aCBhIHN1ZmZpeCBvZiBgYC5ldCcnOyB0aGUgZmlsZQorY29uc2lzdHMgb2YgYSBkZWNsYXJhdGlvbiBzdXBwbHlpbmcgdGhlIG5hbWUgKHVwIHRvIGZvdXIgY2hhcmFjdGVycworbG9uZykgb2YgdGhlIGVycm9yLWNvZGUgdGFibGU6CisKKy5CIGVycm9yX3RhYmxlCisuSSBuYW1lCisKK2ZvbGxvd2VkIGJ5IHVwIHRvIDI1NiBlbnRyaWVzIG9mIHRoZSBmb3JtOgorCisuQiBlcnJvcl9jb2RlCisuSSBuYW1lLAorIgorLkkgc3RyaW5nCisiCisKK2FuZCBhIGZpbmFsCisKKy5CIGVuZAorCit0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSB0YWJsZS4KKworVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBuYW1lIG9mIGEgc3Vicm91dGluZQorLkkgaW5pdGlhbGl6ZV9YWFhYX2Vycm9yX3RhYmxlCit3aGljaCBtdXN0IGJlIGNhbGxlZCBpbiBvcmRlciBmb3IgdGhlCisuSSBjb21fZXJyCitsaWJyYXJ5IHRvIHJlY29nbml6ZSB0aGUgZXJyb3IgdGFibGUuCisKK1RoZSB2YXJpb3VzIGVycm9yIGNvZGVzIGRlZmluZWQgYXJlIGFzc2lnbmVkIHNlcXVlbnRpYWxseSBpbmNyZWFzaW5nCitudW1iZXJzIChzdGFydGluZyB3aXRoIGEgbGFyZ2UgbnVtYmVyIGNvbXB1dGVkIGFzIGEgaGFzaCBmdW5jdGlvbiBvZgordGhlIG5hbWUgb2YgdGhlIHRhYmxlKTsgdGh1cyBmb3IgY29tcGF0aWJpbGl0eSBpdCBpcyBzdWdnZXN0ZWQgdGhhdAorbmV3IGNvZGVzIGJlIGFkZGVkIG9ubHkgdG8gdGhlIGVuZCBvZiBhbiBleGlzdGluZyB0YWJsZSwgYW5kIHRoYXQgbm8KK2NvZGVzIGJlIHJlbW92ZWQgZnJvbSB0YWJsZXMuCisKK1RoZSBuYW1lcyBkZWZpbmVkIGluIHRoZSB0YWJsZSBhcmUgcGxhY2VkIGludG8gYSBDIGhlYWRlciBmaWxlIHdpdGgKK3ByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGRlZmluaW5nIHRoZW0gYXMgaW50ZWdlciBjb25zdGFudHMgb2YgdXAgdG8KKzMyIGJpdHMgaW4gbWFnbml0dWRlLgorCitBIEMgc291cmNlIGZpbGUgaXMgYWxzbyBnZW5lcmF0ZWQgd2hpY2ggc2hvdWxkIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQKK3dpdGggdGhlIG9iamVjdCBmaWxlcyB3aGljaCByZWZlcmVuY2UgdGhlc2UgZXJyb3IgY29kZXM7IGl0IGNvbnRhaW5zCit0aGUgdGV4dCBvZiB0aGUgbWVzc2FnZXMgYW5kIHRoZSBpbml0aWFsaXphdGlvbiBzdWJyb3V0aW5lLiAgQm90aCBDCitmaWxlcyBoYXZlIG5hbWVzIGRlcml2ZWQgZnJvbSB0aGF0IG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgd2l0aAordGhlIGBgLmV0Jycgc3VmZml4IHJlcGxhY2VkIGJ5IGBgLmMnJyBhbmQgYGAuaCcnLgorCitBIGBgIycnIGluIHRoZSBzb3VyY2UgZmlsZSBpcyB0cmVhdGVkIGFzIGEgY29tbWVudCBjaGFyYWN0ZXIsIGFuZCBhbGwKK3JlbWFpbmluZyB0ZXh0IHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBsaW5lIHdpbGwgYmUgaWdub3JlZC4KKworLlNIIEJVR1MKKworU2luY2UgdGhlIG9yaWdpbmFsCisuQiBjb21waWxlX2V0Cit1c2VzIGEgdmVyeSBzaW1wbGUgcGFyc2VyIGJhc2VkIG9uCisuSVIgeWFjYyAoMSksIAorYW5kIHRoaXMgY3VycmVudCB2ZXJzaW9uIG9mIAorLkIgY29tcGlsZV9ldAordXNlcyBhbiBhd2svc2VkIGNvbWJpbmF0aW9uIG9mIHNjcmlwdHMsIAoraXRzIGVycm9yIHJlY292ZXJ5IGxlYXZlcyBtdWNoIHRvIGJlIGRlc2lyZWQuCisKKy5cIiAuSVIgZm9yIG1hbnVhbCBlbnRyaWVzCisuXCIgLlBQIGZvciBwYXJhZ3JhcGggYnJlYWtzCisKKy5TSCAiU0VFIEFMU08iCitjb21fZXJyICgzKS4KKworS2VuIFJhZWJ1cm4sICJBIENvbW1vbiBFcnJvciBEZXNjcmlwdGlvbiBMaWJyYXJ5IGZvciBVTklYIi4KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2NvbXBpbGVfZXQuc2guaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21waWxlX2V0LnNoLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzcyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9jb21waWxlX2V0LnNoLmluCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9zaAorIworIworCitkYXRhcm9vdGRpcj1AZGF0YXJvb3RkaXJACitBV0s9QEFXS0AKK0RJUj0iJHtESVItQGRhdGFkaXJAL2V0fSIKK0VUX0RJUj0iQEVUX0RJUkAiCisKK2lmIHRlc3QgIiQxIiA9ICItLWJ1aWxkLXRyZWUiIDsgdGhlbgorICAgIHNoaWZ0OworICAgIERJUj0iJEVUX0RJUiIKK2ZpCisKK2lmIHRlc3QgIngkMSIgPSB4IDsgdGhlbgorICAgIGVjaG8gIlVzYWdlOiBjb21waWxlX2V0IGZpbGUiCisgICAgZXhpdCAxCitmaQorCitmb3IgYXNfdmFyIGluIFwKKyAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKKyAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKKyAgTENfVEVMRVBIT05FIExDX1RJTUUKK2RvCisgIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCisgICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgJGFzX3ZhcgorICBmaQorZG9uZQorCitpZiB0ZXN0ICEgLWYgIiRESVIvZXRfaC5hd2siIHx8IHRlc3QgISAtZiAiJERJUi9ldF9jLmF3ayIgOyB0aGVuCisgICAgRElSPSIkRVRfRElSIgorIyAgICBlY2hvICJGYWxsaW5nIGJhY2sgdG8gJERJUi4uLiIKKyAgICBpZiB0ZXN0ICEgLWYgIiRESVIvZXRfaC5hd2siIHx8IHRlc3QgISAtZiAiJERJUi9ldF9jLmF3ayIgOyB0aGVuCisJZWNobyAiY29tcGlsZV9ldDogQ291bGRuJ3QgZmluZCBjb21waWxlX2V0J3MgdGVtcGxhdGUgZmlsZXMuIgorCWV4aXQgMQorICAgIGZpCitmaQorCitST09UPWBlY2hvICQxIHwgc2VkIC1lIHMvLmV0JC8vYAorQkFTRT1gYmFzZW5hbWUgJFJPT1RgCisKK2lmIHRlc3QgISAtZiAiJFJPT1QuZXQiIDsgdGhlbgorICAgIGVjaG8gImNvbXBpbGVfZXQ6ICRST09ULmV0OiBGaWxlIG5vdCBmb3VuZCIKKyAgICBleGl0IDE7CitmaQorCiskQVdLIC1mICIke0RJUn0vZXRfaC5hd2siICJvdXRmaWxlPSR7QkFTRX0uaC4kJCIgIm91dGZuPSR7QkFTRX0uaCIgIiRST09ULmV0IgoraWYgdGVzdCAtZiAke0JBU0V9LmggJiYgY21wIC1zICR7QkFTRX0uaC4kJCAke0JBU0V9LmggOyB0aGVuCisgICAgcm0gLWYgJHtCQVNFfS5oLiQkCitlbHNlCisgICAgbXYgLWYgJHtCQVNFfS5oLiQkICR7QkFTRX0uaAorICAgIGNobW9kIC13ICR7QkFTRX0uaAorZmkKKyRBV0sgLWYgIiR7RElSfS9ldF9jLmF3ayIgIm91dGZpbGU9JHtCQVNFfS5jLiQkIiAib3V0Zm49JHtCQVNFfS5jIiAiJFJPT1QuZXQiCitpZiB0ZXN0IC1mICR7QkFTRX0uYyAmJiBjbXAgLXMgJHtCQVNFfS5jLiQkICR7QkFTRX0uYyA7IHRoZW4KKyAgICBybSAtZiAke0JBU0V9LmMuJCQKK2Vsc2UKKyAgICBtdiAtZiAke0JBU0V9LmMuJCQgJHtCQVNFfS5jCisgICAgY2htb2QgLXcgJHtCQVNFfS5jCitmaQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvZXJyb3JfbWVzc2FnZS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvZXJyb3JfbWVzc2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDhjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9lcnJvcl9tZXNzYWdlLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiAkSGVhZGVyJAorICogJFNvdXJjZSQKKyAqICRMb2NrZXIkCisgKgorICogQ29weXJpZ2h0IDE5ODcgYnkgdGhlIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBCb2FyZAorICogb2YgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmZGVmIEhBVkVfU1lTX1BSQ1RMX0gKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNlbHNlCisjZGVmaW5lIFBSX0dFVF9EVU1QQUJMRSAzCisjZW5kaWYKKyNpZiAoIWRlZmluZWQoSEFWRV9QUkNUTCkgJiYgZGVmaW5lZChsaW51eCkpCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU0VNQVBIT1JFX0gKKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSAiY29tX2Vyci5oIgorI2luY2x1ZGUgImVycm9yX3RhYmxlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2lmZGVmIFRMUworI2RlZmluZSBUSFJFQURfTE9DQUwgc3RhdGljIFRMUworI2Vsc2UKKyNkZWZpbmUgVEhSRUFEX0xPQ0FMIHN0YXRpYworI2VuZGlmCisKK1RIUkVBRF9MT0NBTCBjaGFyIGJ1ZmZlclsyNV07CisKK3N0cnVjdCBldF9saXN0ICogX2V0X2xpc3QgPSAoc3RydWN0IGV0X2xpc3QgKikgTlVMTDsKK3N0cnVjdCBldF9saXN0ICogX2V0X2R5bmFtaWNfbGlzdCA9IChzdHJ1Y3QgZXRfbGlzdCAqKSBOVUxMOworCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgQ09NRVJSX0FUVFIoeCkgX19hdHRyaWJ1dGVfXyh4KQorI2Vsc2UKKyNkZWZpbmUgQ09NRVJSX0FUVFIoeCkKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TRU1fSU5JVAorc3RhdGljIHNlbV90IF9ldF9sb2NrOworc3RhdGljIGludCBfZXRfbG9ja19pbml0aWFsaXplZDsKKworc3RhdGljIHZvaWQgQ09NRVJSX0FUVFIoKGNvbnN0cnVjdG9yKSkgc2V0dXBfZXRfbG9jayh2b2lkKQoreworCXNlbV9pbml0KCZfZXRfbG9jaywgMCwgMSk7CisJX2V0X2xvY2tfaW5pdGlhbGl6ZWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBDT01FUlJfQVRUUigoZGVzdHJ1Y3RvcikpIGZpbmlfZXRfbG9jayh2b2lkKQoreworCXNlbV9kZXN0cm95KCZfZXRfbG9jayk7CisJX2V0X2xvY2tfaW5pdGlhbGl6ZWQgPSAwOworfQorI2VuZGlmCisKKworaW50IGV0X2xpc3RfbG9jayh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VNX0lOSVQKKwlpZiAoIV9ldF9sb2NrX2luaXRpYWxpemVkKQorCQlzZXR1cF9ldF9sb2NrKCk7CisJcmV0dXJuIHNlbV93YWl0KCZfZXRfbG9jayk7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK2ludCBldF9saXN0X3VubG9jayh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VNX0lOSVQKKwlpZiAoX2V0X2xvY2tfaW5pdGlhbGl6ZWQpCisJCXJldHVybiBzZW1fcG9zdCgmX2V0X2xvY2spOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKiBlcnJvcl9tZXNzYWdlIChlcnJjb2RlX3QgY29kZSkKK3sKKyAgICBpbnQgb2Zmc2V0OworICAgIHN0cnVjdCBldF9saXN0ICpldDsKKyAgICBlcnJjb2RlX3QgdGFibGVfbnVtOworICAgIGludCBzdGFydGVkID0gMDsKKyAgICBjaGFyICpjcDsKKworICAgIG9mZnNldCA9IChpbnQpIChjb2RlICYgKCgxPDxFUlJDT0RFX1JBTkdFKS0xKSk7CisgICAgdGFibGVfbnVtID0gY29kZSAtIG9mZnNldDsKKyAgICBpZiAoIXRhYmxlX251bSkgeworI2lmZGVmIEhBU19TWVNfRVJSTElTVAorCWlmIChvZmZzZXQgPCBzeXNfbmVycikKKwkgICAgcmV0dXJuKHN5c19lcnJsaXN0W29mZnNldF0pOworCWVsc2UKKwkgICAgZ290byBvb3BzOworI2Vsc2UKKwljcCA9IHN0cmVycm9yKG9mZnNldCk7CisJaWYgKGNwKQorCSAgICByZXR1cm4oY3ApOworCWVsc2UKKwkgICAgZ290byBvb3BzOworI2VuZGlmCisgICAgfQorICAgIGV0X2xpc3RfbG9jaygpOworICAgIGZvciAoZXQgPSBfZXRfbGlzdDsgZXQ7IGV0ID0gZXQtPm5leHQpIHsKKwlpZiAoKGV0LT50YWJsZS0+YmFzZSAmIDB4ZmZmZmZmTCkgPT0gKHRhYmxlX251bSAmIDB4ZmZmZmZmTCkpIHsKKwkgICAgLyogVGhpcyBpcyB0aGUgcmlnaHQgdGFibGUgKi8KKwkgICAgaWYgKGV0LT50YWJsZS0+bl9tc2dzIDw9IG9mZnNldCkgeworCQlicmVhazsKKwkgICAgfSBlbHNlIHsKKwkJY29uc3QgY2hhciAqbXNnID0gZXQtPnRhYmxlLT5tc2dzW29mZnNldF07CisJCWV0X2xpc3RfdW5sb2NrKCk7CisJCXJldHVybiBtc2c7CisJICAgIH0KKwl9CisgICAgfQorICAgIGZvciAoZXQgPSBfZXRfZHluYW1pY19saXN0OyBldDsgZXQgPSBldC0+bmV4dCkgeworCWlmICgoZXQtPnRhYmxlLT5iYXNlICYgMHhmZmZmZmZMKSA9PSAodGFibGVfbnVtICYgMHhmZmZmZmZMKSkgeworCSAgICAvKiBUaGlzIGlzIHRoZSByaWdodCB0YWJsZSAqLworCSAgICBpZiAoZXQtPnRhYmxlLT5uX21zZ3MgPD0gb2Zmc2V0KSB7CisJCWJyZWFrOworCSAgICB9IGVsc2UgeworCQljb25zdCBjaGFyICptc2cgPSBldC0+dGFibGUtPm1zZ3Nbb2Zmc2V0XTsKKwkJZXRfbGlzdF91bmxvY2soKTsKKwkJcmV0dXJuIG1zZzsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZXRfbGlzdF91bmxvY2soKTsKK29vcHM6CisgICAgc3RyY3B5IChidWZmZXIsICJVbmtub3duIGNvZGUgIik7CisgICAgaWYgKHRhYmxlX251bSkgeworCXN0cmNhdCAoYnVmZmVyLCBlcnJvcl90YWJsZV9uYW1lICh0YWJsZV9udW0pKTsKKwlzdHJjYXQgKGJ1ZmZlciwgIiAiKTsKKyAgICB9CisgICAgZm9yIChjcCA9IGJ1ZmZlcjsgKmNwOyBjcCsrKQorCTsKKyAgICBpZiAob2Zmc2V0ID49IDEwMCkgeworCSpjcCsrID0gJzAnICsgb2Zmc2V0IC8gMTAwOworCW9mZnNldCAlPSAxMDA7CisJc3RhcnRlZCsrOworICAgIH0KKyAgICBpZiAoc3RhcnRlZCB8fCBvZmZzZXQgPj0gMTApIHsKKwkqY3ArKyA9ICcwJyArIG9mZnNldCAvIDEwOworCW9mZnNldCAlPSAxMDsKKyAgICB9CisgICAgKmNwKysgPSAnMCcgKyBvZmZzZXQ7CisgICAgKmNwID0gJ1wwJzsKKyAgICByZXR1cm4oYnVmZmVyKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIG9ubHkgcmV0dXJuIGEgdmFsdWUgaWYgdGhlIHdlIGFyZSBub3QgcnVubmluZyBhcworICogYSBwcml2aWxlZ2VkIHByb2Nlc3MuCisgKi8KK3N0YXRpYyBjaGFyICpzYWZlX2dldGVudihjb25zdCBjaGFyICphcmcpCit7CisJaWYgKChnZXR1aWQoKSAhPSBnZXRldWlkKCkpIHx8IChnZXRnaWQoKSAhPSBnZXRlZ2lkKCkpKQorCQlyZXR1cm4gTlVMTDsKKyNpZiBIQVZFX1BSQ1RMCisJaWYgKHByY3RsKFBSX0dFVF9EVU1QQUJMRSwgMCwgMCwgMCwgMCkgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisjZWxzZQorI2lmIChkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKFNZU19wcmN0bCkpCisJaWYgKHN5c2NhbGwoU1lTX3ByY3RsLCBQUl9HRVRfRFVNUEFCTEUsIDAsIDAsIDAsIDApID09IDApCisJCXJldHVybiBOVUxMOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfX19TRUNVUkVfR0VURU5WCisJcmV0dXJuIF9fc2VjdXJlX2dldGVudihhcmcpOworI2Vsc2UKKwlyZXR1cm4gZ2V0ZW52KGFyZyk7CisjZW5kaWYKK30KKworI2RlZmluZSBERUJVR19JTklUCTB4ODAwMAorI2RlZmluZSBERUJVR19BRERSRU1PVkUgMHgwMDAxCisKK3N0YXRpYyBpbnQgZGVidWdfbWFzayA9IDA7CitzdGF0aWMgRklMRSAqZGVidWdfZiA9IDA7CisKK3N0YXRpYyB2b2lkIGluaXRfZGVidWcodm9pZCkKK3sKKwljaGFyCSpkc3RyLCAqZm4sICp0bXA7CisJaW50CWZkLCBmbGFnczsKKworCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfSU5JVCkKKwkJcmV0dXJuOworCisJZHN0ciA9IGdldGVudigiQ09NRVJSX0RFQlVHIik7CisJaWYgKGRzdHIpIHsKKwkJZGVidWdfbWFzayA9IHN0cnRvdWwoZHN0ciwgJnRtcCwgMCk7CisJCWlmICgqdG1wIHx8IGVycm5vKQorCQkJZGVidWdfbWFzayA9IDA7CisJfQorCisJZGVidWdfbWFzayB8PSBERUJVR19JTklUOworCWlmIChkZWJ1Z19tYXNrID09IERFQlVHX0lOSVQpCisJCXJldHVybjsKKworCWZuID0gc2FmZV9nZXRlbnYoIkNPTUVSUl9ERUJVR19GSUxFIik7CisJaWYgKGZuKQorCQlkZWJ1Z19mID0gZm9wZW4oZm4sICJhIik7CisJaWYgKCFkZWJ1Z19mKQorCQlkZWJ1Z19mID0gZm9wZW4oIi9kZXYvdHR5IiwgImEiKTsKKwlpZiAoZGVidWdfZikgeworCQlmZCA9IGZpbGVubyhkZWJ1Z19mKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWZsYWdzID0gZmNudGwoZmQsIEZfR0VURkQpOworCQkJaWYgKGZsYWdzID49IDApCisJCQkJZmNudGwoZmQsIEZfU0VURkQsIGZsYWdzIHwgRkRfQ0xPRVhFQyk7CisJCX0KKwl9IGVsc2UKKwkJZGVidWdfbWFzayA9IERFQlVHX0lOSVQ7CisKK30KKworLyoKKyAqIE5ldyBpbnRlcmZhY2UgcHJvdmlkZWQgYnkga3JiNSdzIGNvbV9lcnIgbGlicmFyeQorICovCitlcnJjb2RlX3QgYWRkX2Vycm9yX3RhYmxlKGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSAqIGV0KQoreworCXN0cnVjdCBldF9saXN0ICplbDsKKworCWlmICghKGVsID0gKHN0cnVjdCBldF9saXN0ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGV0X2xpc3QpKSkpCisJCXJldHVybiBFTk9NRU07CisKKwlpZiAoZXRfbGlzdF9sb2NrKCkgIT0gMCkgeworCQlmcmVlKGVsKTsKKwkJcmV0dXJuIGVycm5vOworCX0KKworCWVsLT50YWJsZSA9IGV0OworCWVsLT5uZXh0ID0gX2V0X2R5bmFtaWNfbGlzdDsKKwlfZXRfZHluYW1pY19saXN0ID0gZWw7CisKKwlpbml0X2RlYnVnKCk7CisJaWYgKGRlYnVnX21hc2sgJiBERUJVR19BRERSRU1PVkUpCisJCWZwcmludGYoZGVidWdfZiwgImFkZF9lcnJvcl90YWJsZTogJXMgKDB4JXApXG4iLAorCQkJZXJyb3JfdGFibGVfbmFtZShldC0+YmFzZSksCisJCQkoY29uc3Qgdm9pZCAqKSBldCk7CisKKwlldF9saXN0X3VubG9jaygpOworCXJldHVybiAwOworfQorCisvKgorICogTmV3IGludGVyZmFjZSBwcm92aWRlZCBieSBrcmI1J3MgY29tX2VyciBsaWJyYXJ5CisgKi8KK2VycmNvZGVfdCByZW1vdmVfZXJyb3JfdGFibGUoY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlICogZXQpCit7CisJc3RydWN0IGV0X2xpc3QgKmVsOworCXN0cnVjdCBldF9saXN0ICplbDIgPSAwOworCisJaWYgKGV0X2xpc3RfbG9jaygpICE9IDApCisJCXJldHVybiBFTk9FTlQ7CisKKwllbCA9IF9ldF9keW5hbWljX2xpc3Q7CisJaW5pdF9kZWJ1ZygpOworCXdoaWxlIChlbCkgeworCQlpZiAoZWwtPnRhYmxlLT5iYXNlID09IGV0LT5iYXNlKSB7CisJCQlpZiAoZWwyKQkvKiBOb3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAqLworCQkJCWVsMi0+bmV4dCA9IGVsLT5uZXh0OworCQkJZWxzZQorCQkJCV9ldF9keW5hbWljX2xpc3QgPSBlbC0+bmV4dDsKKwkJCSh2b2lkKSBmcmVlKGVsKTsKKwkJCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfQUREUkVNT1ZFKQorCQkJCWZwcmludGYoZGVidWdfZiwKKwkJCQkJInJlbW92ZV9lcnJvcl90YWJsZTogJXMgKDB4JXApXG4iLAorCQkJCQllcnJvcl90YWJsZV9uYW1lKGV0LT5iYXNlKSwKKwkJCQkJKGNvbnN0IHZvaWQgKikgZXQpOworCQkJZXRfbGlzdF91bmxvY2soKTsKKwkJCXJldHVybiAwOworCQl9CisJCWVsMiA9IGVsOworCQllbCA9IGVsLT5uZXh0OworCX0KKwlpZiAoZGVidWdfbWFzayAmIERFQlVHX0FERFJFTU9WRSkKKwkJZnByaW50ZihkZWJ1Z19mLCAicmVtb3ZlX2Vycm9yX3RhYmxlIEZBSUxFRDogJXMgKDB4JXApXG4iLAorCQkJZXJyb3JfdGFibGVfbmFtZShldC0+YmFzZSksCisJCQkoY29uc3Qgdm9pZCAqKSBldCk7CisJZXRfbGlzdF91bmxvY2soKTsKKwlyZXR1cm4gRU5PRU5UOworfQorCisvKgorICogVmFyaWFudCBvZiB0aGUgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IEhlaW1kYWwncyBjb21fZXJyIGxpYnJhcnkKKyAqLwordm9pZAorYWRkX3RvX2Vycm9yX3RhYmxlKHN0cnVjdCBldF9saXN0ICpuZXdfdGFibGUpCit7CisJYWRkX2Vycm9yX3RhYmxlKG5ld190YWJsZS0+dGFibGUpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvZXJyb3JfdGFibGUuaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2Vycm9yX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxMDk5MQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2Vycm9yX3RhYmxlLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTg4IGJ5IHRoZSBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQgb2YgdGhlCisgKiBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBhbmQgdGhlCisgKiBNLkkuVC4gUy5JLlAuQi4gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpZm5kZWYgX0VUX0gKKworc3RydWN0IGV0X2xpc3QgeworICAgIHN0cnVjdCBldF9saXN0ICpuZXh0OworICAgIGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSAqdGFibGU7Cit9OworZXh0ZXJuIHN0cnVjdCBldF9saXN0ICogX2V0X2xpc3Q7CisKKyNkZWZpbmUJRVJSQ09ERV9SQU5HRQk4CS8qICMgb2YgYml0cyB0byBzaGlmdCB0YWJsZSBudW1iZXIgKi8KKyNkZWZpbmUJQklUU19QRVJfQ0hBUgk2CS8qICMgYml0cyB0byBzaGlmdCBwZXIgY2hhcmFjdGVyIGluIG5hbWUgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKmVycm9yX3RhYmxlX25hbWUoZXJyY29kZV90IG51bSk7CisKKyNkZWZpbmUgX0VUX0gKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvZXRfYy5hd2sgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9ldF9jLmF3awpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTJlNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvZXRfYy5hd2sKQEAgLTAsMCArMSwyNjcgQEAKK0JFR0lOIHsgCitpZiAoIGxlbmd0aChvdXRmbikgPT0gMCkgeworCW91dGZuID0gb3V0ZmlsZQorfQorY2hhcl9zaGlmdD02NAorIyMgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XyI7CitjMm5bIkEiXT0xCitjMm5bIkIiXT0yCitjMm5bIkMiXT0zCitjMm5bIkQiXT00CitjMm5bIkUiXT01CitjMm5bIkYiXT02CitjMm5bIkciXT03CitjMm5bIkgiXT04CitjMm5bIkkiXT05CitjMm5bIkoiXT0xMAorYzJuWyJLIl09MTEKK2MyblsiTCJdPTEyCitjMm5bIk0iXT0xMworYzJuWyJOIl09MTQKK2MyblsiTyJdPTE1CitjMm5bIlAiXT0xNgorYzJuWyJRIl09MTcKK2MyblsiUiJdPTE4CitjMm5bIlMiXT0xOQorYzJuWyJUIl09MjAKK2MyblsiVSJdPTIxCitjMm5bIlYiXT0yMgorYzJuWyJXIl09MjMKK2MyblsiWCJdPTI0CitjMm5bIlkiXT0yNQorYzJuWyJaIl09MjYKK2MyblsiYSJdPTI3CitjMm5bImIiXT0yOAorYzJuWyJjIl09MjkKK2MyblsiZCJdPTMwCitjMm5bImUiXT0zMQorYzJuWyJmIl09MzIKK2MyblsiZyJdPTMzCitjMm5bImgiXT0zNAorYzJuWyJpIl09MzUKK2MyblsiaiJdPTM2CitjMm5bImsiXT0zNworYzJuWyJsIl09MzgKK2MyblsibSJdPTM5CitjMm5bIm4iXT00MAorYzJuWyJvIl09NDEKK2MyblsicCJdPTQyCitjMm5bInEiXT00MworYzJuWyJyIl09NDQKK2MyblsicyJdPTQ1CitjMm5bInQiXT00NgorYzJuWyJ1Il09NDcKK2MyblsidiJdPTQ4CitjMm5bInciXT00OQorYzJuWyJ4Il09NTAKK2MyblsieSJdPTUxCitjMm5bInoiXT01MgorYzJuWyIwIl09NTMKK2MyblsiMSJdPTU0CitjMm5bIjIiXT01NQorYzJuWyIzIl09NTYKK2MyblsiNCJdPTU3CitjMm5bIjUiXT01OAorYzJuWyI2Il09NTkKK2MyblsiNyJdPTYwCitjMm5bIjgiXT02MQorYzJuWyI5Il09NjIKK2MyblsiXyJdPTYzCit9CisvXiMvIHsgbmV4dCB9CisvXlsgXHRdKihlcnJvcl90YWJsZXxldClbIFx0XStbYS16QS1aXVthLXpBLVowLTlfXSsvIHsKKwl0YWJsZV9udW1iZXIgPSAwCisJbW9kX2Jhc2UgPSAxMDAwMDAwCisJaWYgKE5GID4gMikgeworCSAgICB0YWJsZV9uYW1lID0gJDMKKwkgICAgYmFzZV9uYW1lID0gJDIKKwl9IGVsc2UgeworCSAgICB0YWJsZV9uYW1lID0gJDIKKwkgICAgYmFzZV9uYW1lID0gdGFibGVfbmFtZQorCX0KKwlmb3IoaT0xOyBpPD1sZW5ndGgoYmFzZV9uYW1lKTsgaSsrKSB7CisJICAgIHRhYmxlX251bWJlcj0odGFibGVfbnVtYmVyKmNoYXJfc2hpZnQpK2MybltzdWJzdHIoYmFzZV9uYW1lLGksMSldCisJfQorCisJIyBXZSBzdGFydCBwbGF5aW5nICpfaGlnaCwgKmxvdyBnYW1lcyBoZXJlIGJlY2F1c2UgdGhlIHNvbWUKKwkjIGF3ayBwcm9ncmFtcyBkbyBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IHByZWNpc2lvbiAoc2lnaCkKKwl0YWJfYmFzZV9sb3cgPSB0YWJsZV9udW1iZXIgJSBtb2RfYmFzZQorCWlmICh0YWJfYmFzZV9sb3cgPCAwKSB7CisJCSMgV29yayBhcm91bmQgc3R1cGlkIGJ1ZyBpbiB0aGUgQVJNIGxpYm0KKwkJdGFiX2Jhc2VfbG93ID0gdGFiX2Jhc2VfbG93ICsgbW9kX2Jhc2UKKwl9CisJdGFiX2Jhc2VfaGlnaCA9IGludCh0YWJsZV9udW1iZXIgLyBtb2RfYmFzZSkKKwl0YWJfYmFzZV9zaWduID0gMTsKKworCSMgZmlndXJlIG91dDogdGFibGVfbnVtYmVyX2Jhc2U9dGFibGVfbnVtYmVyKjI1NgorCXRhYl9iYXNlX2xvdyA9IHRhYl9iYXNlX2xvdyAqIDI1NgorCXRhYl9iYXNlX2hpZ2ggPSAodGFiX2Jhc2VfaGlnaCAqIDI1NikgKyBcCisJCQlpbnQodGFiX2Jhc2VfbG93IC8gbW9kX2Jhc2UpCisJdGFiX2Jhc2VfbG93ID0gdGFiX2Jhc2VfbG93ICUgbW9kX2Jhc2UKKwlpZiAodGFiX2Jhc2VfbG93IDwgMCkgeworCQkjIFdvcmsgYXJvdW5kIHN0dXBpZCBidWcgaW4gdGhlIEFSTSBsaWJtCisJCXRhYl9iYXNlX2xvdyA9IHRhYl9iYXNlX2xvdyArIG1vZF9iYXNlCisJfQorCisJaWYgKHRhYmxlX251bWJlciA+IDEyOCoyNTYqMjU2KSB7CisJCSMgZmlndXJlIG91dDogIHRhYmxlX251bWJlcl9iYXNlIC09IDI1NioyNTYqMjU2KjI1NgorCQkjIHN1Yl9oaWdoLCBzdWJfbG93IGlzIDI1NioyNTYqMjU2KjI1NgorCQlzdWJfbG93ID0gMjU2KjI1NioyNTYgJSBtb2RfYmFzZQorCQlzdWJfaGlnaCA9IGludCgyNTYqMjU2KjI1NiAvIG1vZF9iYXNlKQorCisJCXN1Yl9sb3cgPSBzdWJfbG93ICogMjU2CisJCXN1Yl9oaWdoID0gKHN1Yl9oaWdoICogMjU2KSArIGludChzdWJfbG93IC8gbW9kX2Jhc2UpCisJCXN1Yl9sb3cgPSBzdWJfbG93ICUgbW9kX2Jhc2UKKworCQl0YWJfYmFzZV9sb3cgPSBzdWJfbG93IC0gdGFiX2Jhc2VfbG93OworCQl0YWJfYmFzZV9oaWdoID0gc3ViX2hpZ2ggLSB0YWJfYmFzZV9oaWdoOworCQl0YWJfYmFzZV9zaWduID0gLTE7CisJCWlmICh0YWJfYmFzZV9sb3cgPCAwKSB7CisJCQl0YWJfYmFzZV9sb3cgPSB0YWJfYmFzZV9sb3cgKyBtb2RfYmFzZQorCQkJdGFiX2Jhc2VfaGlnaC0tCisJCX0KKwl9CisJcHJpbnQgIi8qIiA+IG91dGZpbGUKKwlwcmludCAiICogIiBvdXRmbiAiOiIgPiBvdXRmaWxlCisJcHJpbnQgIiAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LiIgPiBvdXRmaWxlCisJcHJpbnQgIiAqLyIgPiBvdXRmaWxlCisKKwlwcmludCAiIiA+IG91dGZpbGUKKwlwcmludCAiI2luY2x1ZGUgPHN0ZGxpYi5oPiIgPiBvdXRmaWxlCisJcHJpbnQgIiIgPiBvdXRmaWxlCisJcHJpbnQgInN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dFtdID0geyIgPiBvdXRmaWxlCisJdGFibGVfaXRlbV9jb3VudCA9IDAKK30KKworKGNvbnRpbnVhdGlvbiA9PSAxKSAmJiAoJDAgfiAvXFxbIFx0XSokLykgeworCXRleHQ9c3Vic3RyKCQwLDEsbGVuZ3RoKCQwKS0xKTsKKyMJcHJpbnRmICJcdFx0XCIlc1wiXG4iLCB0ZXh0ID4gb3V0ZmlsZQorCWNvbnRfYnVmPWNvbnRfYnVmIHRleHQ7Cit9CisKKyhjb250aW51YXRpb24gPT0gMSkgJiYgKCQwIH4gLyJbIFx0XSokLykgeworIwlwcmludGYgIlx0XHRcIiVzLFxuIiwgJDAgPiBvdXRmaWxlCisJcHJpbnRmICJcdCVzLFxuIiwgY29udF9idWYgJDAgPiBvdXRmaWxlCisJY29udGludWF0aW9uID0gMDsKK30KKworL15bIFx0XSooZXJyb3JfY29kZXxlYylbIFx0XStbQS1aXzAtOV0rLFteIFx0XS8geworCSMgQmUgdG9sZXJhbnQgdG8gbWlzc2luZyB3aGl0ZXNwYWNlIGFmdGVyIGAsJyAuLi4KKwlzdWIoLywvLCAiLCAiKQorfQorCisvXlsgXHRdKihlcnJvcl9jb2RlfGVjKVsgXHRdK1tBLVpfMC05XSssWyBcdF0qJC8geworCXRhYmxlX2l0ZW1fY291bnQrKworCXNraXBvbmU9MQorCW5leHQKK30KKworL15bIFx0XSooZXJyb3JfY29kZXxlYylbIFx0XStbQS1aXzAtOV0rLFsgXHRdKiIuKiJbIFx0XSokLyB7CisJdGV4dD0iIgorCWZvciAoaT0zOyBpPD1ORjsgaSsrKSB7IAorCSAgICB0ZXh0ID0gdGV4dCBGUyAkaQorCX0KKwl0ZXh0PXN1YnN0cih0ZXh0LDIsbGVuZ3RoKHRleHQpLTEpOworCXByaW50ZiAiXHQlcyxcbiIsIHRleHQgPiBvdXRmaWxlCisJdGFibGVfaXRlbV9jb3VudCsrCit9CisKKy9eWyBcdF0qKGVycm9yX2NvZGV8ZWMpWyBcdF0rW0EtWl8wLTldKyxbIFx0XSoiLipcXFsgXHRdKiQvIHsKKwl0ZXh0PSIiCisJZm9yIChpPTM7IGk8PU5GOyBpKyspIHsgCisJICAgIHRleHQgPSB0ZXh0IEZTICRpCisJfQorCXRleHQ9c3Vic3RyKHRleHQsMixsZW5ndGgodGV4dCktMik7CisjCXByaW50ZiAiXHQlc1wiXG4iLCB0ZXh0ID4gb3V0ZmlsZQorCWNvbnRfYnVmPXRleHQKKwl0YWJsZV9pdGVtX2NvdW50KysKKwljb250aW51YXRpb24rKzsKK30KKworL15bIFx0XSoiLipcXFsgXHRdKiQvIHsKKwlpZiAoc2tpcG9uZSkgeworCSAgICB0ZXh0PXN1YnN0cigkMCwxLGxlbmd0aCgkMCktMSk7CisjCSAgICBwcmludGYgIlx0JXNcIlxuIiwgdGV4dCA+IG91dGZpbGUKKwkgICAgY29udF9idWY9dGV4dAorCSAgICBjb250aW51YXRpb24rKzsKKwl9CisJc2tpcG9uZT0wCit9CisKK3sgCisJaWYgKHNraXBvbmUpIHsKKwkgICAgcHJpbnRmICJcdCVzLFxuIiwgJDAgPiBvdXRmaWxlCisJfQorCXNraXBvbmU9MAorfQorCisvXlsgXHRdKihwcmVmaXgpJC8geworCXByZWZpeF9zdHIgPSAiIgorfQorCisvXlsgXHRdKihwcmVmaXgpWyBcdF0rW0EtWl8wLTldKy8geworCXByZWZpeF9zdHIgPSAkMiAiXyIKK30KKworL15bIFx0XSooaW5kZXgpWyBcdF0rW0EtWl8wLTldKy8geworCW5ld19pZHggPSAkMgorCWZvciAoaSA9IHRhYmxlX2l0ZW1fY291bnQgOyBpIDwgbmV3X2lkeDsgaSsrKSB7CisJCXByaW50ZiAiXHRcIlJlc2VydmVkICVzIGVycm9yICglZClcIixcbiIsIFwKKwkJCXRhYmxlX25hbWUsIHRhYmxlX2l0ZW1fY291bnQrKyA+IG91dGZpbGUKKwl9Cit9CisKK0VORCB7CisJcHJpbnQgIiAgICAwIiA+IG91dGZpbGUKKwlwcmludCAifTsiID4gb3V0ZmlsZQorCXByaW50ICIiID4gb3V0ZmlsZQorCXByaW50ICJzdHJ1Y3QgZXJyb3JfdGFibGUgeyIgPiBvdXRmaWxlCisJcHJpbnQgIiAgICBjaGFyIGNvbnN0ICogY29uc3QgKiBtc2dzOyIgPiBvdXRmaWxlCisJcHJpbnQgIiAgICBsb25nIGJhc2U7IiA+IG91dGZpbGUKKwlwcmludCAiICAgIGludCBuX21zZ3M7IiA+IG91dGZpbGUKKwlwcmludCAifTsiID4gb3V0ZmlsZQorCXByaW50ICJzdHJ1Y3QgZXRfbGlzdCB7IiA+IG91dGZpbGUKKwlwcmludCAiICAgIHN0cnVjdCBldF9saXN0ICpuZXh0OyIgPiBvdXRmaWxlCisJcHJpbnQgIiAgICBjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgKiB0YWJsZTsiID4gb3V0ZmlsZQorCXByaW50ICJ9OyIgPiBvdXRmaWxlCisJcHJpbnQgImV4dGVybiBzdHJ1Y3QgZXRfbGlzdCAqX2V0X2xpc3Q7IiA+IG91dGZpbGUKKwlwcmludCAiIiA+IG91dGZpbGUKKwlpZiAodGFiX2Jhc2VfaGlnaCA9PSAwKSB7CisJCXByaW50ICJjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfIiB0YWJsZV9uYW1lICJfZXJyb3JfdGFibGUgPSB7IHRleHQsICIgXAorCQlzcHJpbnRmKCIlZEwsICVkIH07IiwgdGFiX2Jhc2Vfc2lnbip0YWJfYmFzZV9sb3csIFwKKwkJdGFibGVfaXRlbV9jb3VudCkgPiBvdXRmaWxlCisJfSBlbHNlIHsKKwkJcHJpbnQgImNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSBldF8iIHRhYmxlX25hbWUgIl9lcnJvcl90YWJsZSA9IHsgdGV4dCwgIiBcCisJCXNwcmludGYoIiVkJTA2ZEwsICVkIH07IiwgdGFiX2Jhc2Vfc2lnbip0YWJfYmFzZV9oaWdoLCBcCisJCXRhYl9iYXNlX2xvdywgdGFibGVfaXRlbV9jb3VudCkgPiBvdXRmaWxlCisJfQorCXByaW50ICIiID4gb3V0ZmlsZQorCXByaW50ICJzdGF0aWMgc3RydWN0IGV0X2xpc3QgbGluayA9IHsgMCwgMCB9OyIgPiBvdXRmaWxlCisJcHJpbnQgIiIgPiBvdXRmaWxlCisJcHJpbnQgInZvaWQgaW5pdGlhbGl6ZV8iIHRhYmxlX25hbWUgIl9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCk7IiA+IG91dGZpbGUKKwlwcmludCAidm9pZCBpbml0aWFsaXplXyIgdGFibGVfbmFtZSAiX2Vycm9yX3RhYmxlKHZvaWQpOyIgPiBvdXRmaWxlCisJcHJpbnQgIiIgPiBvdXRmaWxlCisJcHJpbnQgInZvaWQgaW5pdGlhbGl6ZV8iIHRhYmxlX25hbWUgIl9lcnJvcl90YWJsZSh2b2lkKSB7IiA+IG91dGZpbGUKKwlwcmludCAiICAgIGluaXRpYWxpemVfIiB0YWJsZV9uYW1lICJfZXJyb3JfdGFibGVfcigmX2V0X2xpc3QpOyIgPiBvdXRmaWxlCisJcHJpbnQgIn0iID4gb3V0ZmlsZQorCXByaW50ICIiID4gb3V0ZmlsZQorCXByaW50ICIvKiBGb3IgSGVpbWRhbCBjb21wYXRpYmlsaXR5ICovIiA+IG91dGZpbGUKKwlwcmludCAidm9pZCBpbml0aWFsaXplXyIgdGFibGVfbmFtZSAiX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KSIgPiBvdXRmaWxlCisJcHJpbnQgInsiID4gb3V0ZmlsZQorCXByaW50ICIgICAgc3RydWN0IGV0X2xpc3QgKmV0LCAqKmVuZDsiID4gb3V0ZmlsZQorCXByaW50ICIiID4gb3V0ZmlsZQorCXByaW50ICIgICAgZm9yIChlbmQgPSBsaXN0LCBldCA9ICpsaXN0OyBldDsgZW5kID0gJmV0LT5uZXh0LCBldCA9IGV0LT5uZXh0KSIgPiBvdXRmaWxlCisJcHJpbnQgIiAgICAgICAgaWYgKGV0LT50YWJsZS0+bXNncyA9PSB0ZXh0KSIgPiBvdXRmaWxlCisJcHJpbnQgIiAgICAgICAgICAgIHJldHVybjsiID4gb3V0ZmlsZQorCXByaW50ICIgICAgZXQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBldF9saXN0KSk7IiA+IG91dGZpbGUKKwlwcmludCAiICAgIGlmIChldCA9PSAwKSB7IiA+IG91dGZpbGUKKwlwcmludCAiICAgICAgICBpZiAoIWxpbmsudGFibGUpIiA+IG91dGZpbGUKKwlwcmludCAiICAgICAgICAgICAgZXQgPSAmbGluazsiID4gb3V0ZmlsZQorCXByaW50ICIgICAgICAgIGVsc2UiID4gb3V0ZmlsZQorCXByaW50ICIgICAgICAgICAgICByZXR1cm47IiA+IG91dGZpbGUKKwlwcmludCAiICAgIH0iID4gb3V0ZmlsZQorCXByaW50ICIgICAgZXQtPnRhYmxlID0gJmV0XyIgdGFibGVfbmFtZSAiX2Vycm9yX3RhYmxlOyIgPiBvdXRmaWxlCisJcHJpbnQgIiAgICBldC0+bmV4dCA9IDA7IiA+IG91dGZpbGUKKwlwcmludCAiICAgICplbmQgPSBldDsiID4gb3V0ZmlsZQorCXByaW50ICJ9IiA+IG91dGZpbGUKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2V0X2guYXdrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvZXRfaC5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNzEyMQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2V0X2guYXdrCkBAIC0wLDAgKzEsMjA0IEBACitCRUdJTiB7IAoraWYgKCBsZW5ndGgob3V0Zm4pID09IDApIHsKKwlvdXRmbiA9IG91dGZpbGUKK30KK2NoYXJfc2hpZnQ9NjQKKyMjICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OV8iOworYzJuWyJBIl09MQorYzJuWyJCIl09MgorYzJuWyJDIl09MworYzJuWyJEIl09NAorYzJuWyJFIl09NQorYzJuWyJGIl09NgorYzJuWyJHIl09NworYzJuWyJIIl09OAorYzJuWyJJIl09OQorYzJuWyJKIl09MTAKK2MyblsiSyJdPTExCitjMm5bIkwiXT0xMgorYzJuWyJNIl09MTMKK2MyblsiTiJdPTE0CitjMm5bIk8iXT0xNQorYzJuWyJQIl09MTYKK2MyblsiUSJdPTE3CitjMm5bIlIiXT0xOAorYzJuWyJTIl09MTkKK2MyblsiVCJdPTIwCitjMm5bIlUiXT0yMQorYzJuWyJWIl09MjIKK2MyblsiVyJdPTIzCitjMm5bIlgiXT0yNAorYzJuWyJZIl09MjUKK2MyblsiWiJdPTI2CitjMm5bImEiXT0yNworYzJuWyJiIl09MjgKK2MyblsiYyJdPTI5CitjMm5bImQiXT0zMAorYzJuWyJlIl09MzEKK2MyblsiZiJdPTMyCitjMm5bImciXT0zMworYzJuWyJoIl09MzQKK2MyblsiaSJdPTM1CitjMm5bImoiXT0zNgorYzJuWyJrIl09MzcKK2MyblsibCJdPTM4CitjMm5bIm0iXT0zOQorYzJuWyJuIl09NDAKK2MyblsibyJdPTQxCitjMm5bInAiXT00MgorYzJuWyJxIl09NDMKK2MyblsiciJdPTQ0CitjMm5bInMiXT00NQorYzJuWyJ0Il09NDYKK2MyblsidSJdPTQ3CitjMm5bInYiXT00OAorYzJuWyJ3Il09NDkKK2MyblsieCJdPTUwCitjMm5bInkiXT01MQorYzJuWyJ6Il09NTIKK2MyblsiMCJdPTUzCitjMm5bIjEiXT01NAorYzJuWyIyIl09NTUKK2MyblsiMyJdPTU2CitjMm5bIjQiXT01NworYzJuWyI1Il09NTgKK2MyblsiNiJdPTU5CitjMm5bIjciXT02MAorYzJuWyI4Il09NjEKK2MyblsiOSJdPTYyCitjMm5bIl8iXT02MworfQorL14jLyB7IG5leHQgfQorL15bIFx0XSooZXJyb3JfdGFibGV8ZXQpWyBcdF0rW2EtekEtWl1bYS16QS1aMC05X10rLyB7CisJdGFibGVfbnVtYmVyID0gMAorCW1vZF9iYXNlID0gMTAwMDAwMAorCWlmIChORiA+IDIpIHsKKwkgICAgdGFibGVfbmFtZSA9ICQzCisJICAgIGJhc2VfbmFtZSA9ICQyCisJfSBlbHNlIHsKKwkgICAgdGFibGVfbmFtZSA9ICQyCisJICAgIGJhc2VfbmFtZSA9IHRhYmxlX25hbWUKKwl9CisJZm9yKGk9MTsgaTw9bGVuZ3RoKGJhc2VfbmFtZSk7IGkrKykgeworCSAgICB0YWJsZV9udW1iZXI9KHRhYmxlX251bWJlcipjaGFyX3NoaWZ0KStjMm5bc3Vic3RyKGJhc2VfbmFtZSxpLDEpXQorCX0KKwkjIFdlIHN0YXJ0IHBsYXlpbmcgKl9oaWdoLCAqbG93IGdhbWVzIGhlcmUgYmVjYXVzZSB0aGUgc29tZQorCSMgYXdrIHByb2dyYW1zIGRvIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgcHJlY2lzaW9uIChzaWdoKQorCXRhYl9iYXNlX2xvdyA9IHRhYmxlX251bWJlciAlIG1vZF9iYXNlCisJaWYgKHRhYl9iYXNlX2xvdyA8IDApIHsKKwkJIyBXb3JrIGFyb3VuZCBzdHVwaWQgYnVnIGluIHRoZSBBUk0gbGlibQorCQl0YWJfYmFzZV9sb3cgPSB0YWJfYmFzZV9sb3cgKyBtb2RfYmFzZQorCX0KKwl0YWJfYmFzZV9oaWdoID0gaW50KHRhYmxlX251bWJlciAvIG1vZF9iYXNlKQorCXRhYl9iYXNlX3NpZ24gPSAxOworCisJIyBmaWd1cmUgb3V0OiB0YWJsZV9udW1iZXJfYmFzZT10YWJsZV9udW1iZXIqMjU2CisJdGFiX2Jhc2VfbG93ID0gdGFiX2Jhc2VfbG93ICogMjU2CisJdGFiX2Jhc2VfaGlnaCA9ICh0YWJfYmFzZV9oaWdoICogMjU2KSArIFwKKwkJCWludCh0YWJfYmFzZV9sb3cgLyBtb2RfYmFzZSkKKwl0YWJfYmFzZV9sb3cgPSB0YWJfYmFzZV9sb3cgJSBtb2RfYmFzZQorCWlmICh0YWJfYmFzZV9sb3cgPCAwKSB7CisJCSMgV29yayBhcm91bmQgc3R1cGlkIGJ1ZyBpbiB0aGUgQVJNIGxpYm0KKwkJdGFiX2Jhc2VfbG93ID0gdGFiX2Jhc2VfbG93ICsgbW9kX2Jhc2UKKwl9CisKKwlpZiAodGFibGVfbnVtYmVyID4gMTI4KjI1NioyNTYpIHsKKwkJIyBmaWd1cmUgb3V0OiAgdGFibGVfbnVtYmVyX2Jhc2UgLT0gMjU2KjI1NioyNTYqMjU2CisJCSMgc3ViX2hpZ2gsIHN1Yl9sb3cgaXMgMjU2KjI1NioyNTYqMjU2CisJCXN1Yl9sb3cgPSAyNTYqMjU2KjI1NiAlIG1vZF9iYXNlCisJCXN1Yl9oaWdoID0gaW50KDI1NioyNTYqMjU2IC8gbW9kX2Jhc2UpCisKKwkJc3ViX2xvdyA9IHN1Yl9sb3cgKiAyNTYKKwkJc3ViX2hpZ2ggPSAoc3ViX2hpZ2ggKiAyNTYpICsgaW50KHN1Yl9sb3cgLyBtb2RfYmFzZSkKKwkJc3ViX2xvdyA9IHN1Yl9sb3cgJSBtb2RfYmFzZQorCisJCXRhYl9iYXNlX2xvdyA9IHN1Yl9sb3cgLSB0YWJfYmFzZV9sb3c7CisJCXRhYl9iYXNlX2hpZ2ggPSBzdWJfaGlnaCAtIHRhYl9iYXNlX2hpZ2g7CisJCXRhYl9iYXNlX3NpZ24gPSAtMTsKKwkJaWYgKHRhYl9iYXNlX2xvdyA8IDApIHsKKwkJCXRhYl9iYXNlX2xvdyA9IHRhYl9iYXNlX2xvdyArIG1vZF9iYXNlCisJCQl0YWJfYmFzZV9oaWdoLS0KKwkJfQorCX0KKwlwcmVmaXhfc3RyID0gIiIKKwljdXJyX2lkeCA9IDAKKwljdXJyX2xvdyA9IHRhYl9iYXNlX2xvdworCWN1cnJfaGlnaCA9IHRhYl9iYXNlX2hpZ2gKKwljdXJyX3NpZ24gPSB0YWJfYmFzZV9zaWduCisJcHJpbnQgIi8qIiA+IG91dGZpbGUKKwlwcmludCAiICogIiBvdXRmbiAiOiIgPiBvdXRmaWxlCisJcHJpbnQgIiAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LiIgPiBvdXRmaWxlCisJcHJpbnQgIiAqLyIgPiBvdXRmaWxlCisJcHJpbnQgIiIgPiBvdXRmaWxlCisJcHJpbnQgIiNpbmNsdWRlIDxldC9jb21fZXJyLmg+IiA+IG91dGZpbGUKKwlwcmludCAiIiA+IG91dGZpbGUKK30KKworL15bIFx0XSooZXJyb3JfY29kZXxlYylbIFx0XStbQS1aXzAtOV0rLC8geworCSMgQmUgdG9sZXJhbnQgdG8gbWlzc2luZyB3aGl0ZXNwYWNlIGFmdGVyIGAsJyAuLi4KKwlzdWIoLywvLCAiLCAiKQorCisJdGFnPXByZWZpeF9zdHIgc3Vic3RyKCQyLDEsbGVuZ3RoKCQyKS0xKQorCWlmIChjdXJyX2hpZ2ggPT0gMCkgeworCQlwcmludGYgIiNkZWZpbmUgJS00MHMgKCVkTClcbiIsIHRhZywgXAorCQkJY3Vycl9zaWduKmN1cnJfbG93ID4gb3V0ZmlsZQorCX0gZWxzZSB7CisJCXByaW50ZiAiI2RlZmluZSAlLTQwcyAoJWQlMDZkTClcbiIsIHRhZywgY3Vycl9oaWdoKmN1cnJfc2lnbiwgXAorCQkJY3Vycl9sb3cgPiBvdXRmaWxlCisJfQorCWN1cnJfbG93ICs9IGN1cnJfc2lnbjsKKwljdXJyX2lkeCsrOworCWlmIChjdXJyX2xvdyA+PSBtb2RfYmFzZSkgeworCQljdXJyX2xvdyAtPSBtb2RfYmFzZTsKKwkJY3Vycl9oaWdoKysKKwl9CisJaWYgKGN1cnJfbG93IDwgMCkgeworCQljdXJfbG93ICs9IG1vZF9iYXNlCisJCWN1cl9oaWdoLS0KKwl9Cit9CisKKy9eWyBcdF0qKHByZWZpeCkkLyB7CisJcHJlZml4X3N0ciA9ICIiCit9CisKKy9eWyBcdF0qKHByZWZpeClbIFx0XStbQS1aXzAtOV0rLyB7CisJcHJlZml4X3N0ciA9ICQyICJfIgorfQorCisvXlsgXHRdKihpbmRleClbIFx0XStbQS1aXzAtOV0rLyB7CisJbmV3X2lkeCA9ICQyCisJY3Vycl9sb3cgKz0gY3Vycl9zaWduICogKG5ld19pZHggLSBjdXJyX2lkeCkKKwljdXJyX2lkeCA9IG5ld19pZHgKKwlpZiAoY3Vycl9sb3cgPj0gbW9kX2Jhc2UpIHsKKwkJY3Vycl9sb3cgLT0gbW9kX2Jhc2U7CisJCWN1cnJfaGlnaCsrCisJfQorCWlmIChjdXJyX2xvdyA8IDApIHsKKwkJY3VyX2xvdyArPSBtb2RfYmFzZQorCQljdXJfaGlnaC0tCisJfQorfQorCisKK0VORCB7CisJcHJpbnQgImV4dGVybiBjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfIiB0YWJsZV9uYW1lICJfZXJyb3JfdGFibGU7IiA+IG91dGZpbGUKKwlwcmludCAiZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV8iIHRhYmxlX25hbWUgIl9lcnJvcl90YWJsZSh2b2lkKTsiID4gb3V0ZmlsZQorCXByaW50ICIiID4gb3V0ZmlsZQorCXByaW50ICIvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEhlaW1kYWwgKi8iID4gb3V0ZmlsZQorCXByaW50ICJleHRlcm4gdm9pZCBpbml0aWFsaXplXyIgdGFibGVfbmFtZSAiX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KTsiID4gb3V0ZmlsZQorCXByaW50ICIiID4gb3V0ZmlsZQorCWlmICh0YWJfYmFzZV9oaWdoID09IDApIHsKKwkJcHJpbnQgIiNkZWZpbmUgRVJST1JfVEFCTEVfQkFTRV8iIHRhYmxlX25hbWUgIiAoIiBcCisJCQlzcHJpbnRmKCIlZCIsIHRhYl9iYXNlX3NpZ24qdGFiX2Jhc2VfbG93KSBcCisJCQkiTCkiID4gb3V0ZmlsZQorCX0gZWxzZSB7CisJCXByaW50ICIjZGVmaW5lIEVSUk9SX1RBQkxFX0JBU0VfIiB0YWJsZV9uYW1lICIgKCIgXAorCQkJc3ByaW50ZigiJWQlMDZkIiwgdGFiX2Jhc2Vfc2lnbip0YWJfYmFzZV9oaWdoLCBcCisJCQl0YWJfYmFzZV9sb3cpICJMKSIgPiBvdXRmaWxlCisJfQorCXByaW50ICIiID4gb3V0ZmlsZQorCXByaW50ICIvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zLi4uICovIiA+IG91dGZpbGUKKwlwcmludCAiI2RlZmluZSBpbml0XyIgdGFibGVfbmFtZSAiX2Vycl90YmwgaW5pdGlhbGl6ZV8iIHRhYmxlX25hbWUgIl9lcnJvcl90YWJsZSIgPiBvdXRmaWxlCisJcHJpbnQgIiNkZWZpbmUgIiB0YWJsZV9uYW1lICJfZXJyX2Jhc2UgRVJST1JfVEFCTEVfQkFTRV8iIHRhYmxlX25hbWUgPiBvdXRmaWxlCit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9ldF9uYW1lLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9ldF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4ODMyNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2V0X25hbWUuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5ODcgYnkgTUlUIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBCb2FyZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBhbmQgdGhlCisgKiBNLkkuVC4gUy5JLlAuQi4gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpbmNsdWRlICJjb21fZXJyLmgiCisjaW5jbHVkZSAiZXJyb3JfdGFibGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgY2hhciBjaGFyX3NldFtdID0KKwkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfIjsKKworc3RhdGljIGNoYXIgYnVmWzZdOworCitjb25zdCBjaGFyICogZXJyb3JfdGFibGVfbmFtZShudW0pCisgICAgZXJyY29kZV90IG51bTsKK3sKKyAgICBpbnQgY2g7CisgICAgaW50IGk7CisgICAgY2hhciAqcDsKKworICAgIC8qIG51bSA9IGFhIGFhYSBhYmIgYmJiIGJjYyBjY2MgY2RkIGRkZCBkPz8gPz8/ID8/PyAqLworICAgIHAgPSBidWY7CisgICAgbnVtID4+PSBFUlJDT0RFX1JBTkdFOworICAgIC8qIG51bSA9ID8/ID8/PyA/Pz8gYWFhIGFhYSBiYmIgYmJiIGNjYyBjY2MgZGRkIGRkZCAqLworICAgIG51bSAmPSAwNzc3Nzc3NzdMOworICAgIC8qIG51bSA9IDAwIDAwMCAwMDAgYWFhIGFhYSBiYmIgYmJiIGNjYyBjY2MgZGRkIGRkZCAqLworICAgIGZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKSB7CisJY2ggPSAoaW50KSgobnVtID4+IEJJVFNfUEVSX0NIQVIgKiBpKSAmICgoMSA8PCBCSVRTX1BFUl9DSEFSKSAtIDEpKTsKKwlpZiAoY2ggIT0gMCkKKwkgICAgKnArKyA9IGNoYXJfc2V0W2NoLTFdOworICAgIH0KKyAgICAqcCA9ICdcMCc7CisgICAgcmV0dXJuKGJ1Zik7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9pbml0X2V0LmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9pbml0X2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyN2RhMQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2luaXRfZXQuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogJEhlYWRlciQKKyAqICRTb3VyY2UkCisgKiAkTG9ja2VyJAorICoKKyAqIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4IGJ5IE1JVCBJbmZvcm1hdGlvbiBTeXN0ZW1zIGFuZAorICoJdGhlIE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdAorICogdGhlIG5hbWVzIG9mIE0uSS5ULiBhbmQgdGhlIE0uSS5ULiBTLkkuUC5CLiBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIGFuZCB0aGUKKyAqIE0uSS5ULiBTLkkuUC5CLiBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0CisgKiBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJjb21fZXJyLmgiCisjaW5jbHVkZSAiZXJyb3JfdGFibGUuaCIKKworc3RydWN0IGZvb2JhciB7CisgICAgc3RydWN0IGV0X2xpc3QgZXRsOworICAgIHN0cnVjdCBlcnJvcl90YWJsZSBldDsKK307CisKK2V4dGVybiBzdHJ1Y3QgZXRfbGlzdCAqIF9ldF9keW5hbWljX2xpc3Q7CisKK2ludCBpbml0X2Vycm9yX3RhYmxlKGNvbnN0IGNoYXIgKiBjb25zdCAqbXNncywgbG9uZyBiYXNlLCBpbnQgY291bnQpCit7CisgICAgc3RydWN0IGZvb2JhciAqIG5ld19ldDsKKworICAgIGlmICghYmFzZSB8fCAhY291bnQgfHwgIW1zZ3MpCisJcmV0dXJuIDA7CisKKyAgICBuZXdfZXQgPSAoc3RydWN0IGZvb2JhciAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmb29iYXIpKTsKKyAgICBpZiAoIW5ld19ldCkKKwlyZXR1cm4gRU5PTUVNOwkvKiBvb3BzICovCisgICAgbmV3X2V0LT5ldGwudGFibGUgPSAmbmV3X2V0LT5ldDsKKyAgICBuZXdfZXQtPmV0Lm1zZ3MgPSBtc2dzOworICAgIG5ld19ldC0+ZXQuYmFzZSA9IGJhc2U7CisgICAgbmV3X2V0LT5ldC5uX21zZ3M9IGNvdW50OworCisgICAgbmV3X2V0LT5ldGwubmV4dCA9IF9ldF9keW5hbWljX2xpc3Q7CisgICAgX2V0X2R5bmFtaWNfbGlzdCA9ICZuZXdfZXQtPmV0bDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L2ludGVybmFsLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNmYzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBpbnRlcm5hbCBpbmNsdWRlIGZpbGUgZm9yIGNvbV9lcnIgcGFja2FnZQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBhbmQgdGhlCisgKiBNLkkuVC4gUy5JLlAuQi4gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgTkVFRF9TWVNfRVJSTElTVAorZXh0ZXJuIGNoYXIgY29uc3QgKiBjb25zdCBzeXNfZXJybGlzdFtdOworZXh0ZXJuIGNvbnN0IGludCBzeXNfbmVycjsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9jb250aW51YXRpb24uYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvY29udGludWF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyOWRkMAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvY29udGludWF0aW9uLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIGNvbnRpbnVhdGlvbi5jOgorICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG8gbm90IGVkaXQgaXQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRbXSA9IHsKKwkiTmV3IHBhc3N3b3JkIHdhcyBmb3VuZCBpbiBhIGRpY3Rpb25hcnkgb2YgcG9zc2libGUgcGFzc3dvcmRzIGFuZFxudGhlcmVmb3JlIG1heSBiZSBlYXNpbHkgZ3Vlc3NlZC4gUGxlYXNlIGNob29zZSBhbm90aGVyIHBhc3N3b3JkLlxuU2VlIHRoZSBvdnBhc3N3ZCBtYW4gcGFnZSBmb3IgaGVscCBpbiBjaG9vc2luZyBhIGdvb2QgcGFzc3dvcmQuIiwKKyAgICAwCit9OworCitzdHJ1Y3QgZXJyb3JfdGFibGUgeworICAgIGNoYXIgY29uc3QgKiBjb25zdCAqIG1zZ3M7CisgICAgbG9uZyBiYXNlOworICAgIGludCBuX21zZ3M7Cit9Oworc3RydWN0IGV0X2xpc3QgeworICAgIHN0cnVjdCBldF9saXN0ICpuZXh0OworICAgIGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSAqIHRhYmxlOworfTsKK2V4dGVybiBzdHJ1Y3QgZXRfbGlzdCAqX2V0X2xpc3Q7CisKK2NvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSBldF9vdmtfZXJyb3JfdGFibGUgPSB7IHRleHQsIDQzNzg3NTIwTCwgMSB9OworCitzdGF0aWMgc3RydWN0IGV0X2xpc3QgbGluayA9IHsgMCwgMCB9OworCit2b2lkIGluaXRpYWxpemVfb3ZrX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KTsKK3ZvaWQgaW5pdGlhbGl6ZV9vdmtfZXJyb3JfdGFibGUodm9pZCk7CisKK3ZvaWQgaW5pdGlhbGl6ZV9vdmtfZXJyb3JfdGFibGUodm9pZCkgeworICAgIGluaXRpYWxpemVfb3ZrX2Vycm9yX3RhYmxlX3IoJl9ldF9saXN0KTsKK30KKworLyogRm9yIEhlaW1kYWwgY29tcGF0aWJpbGl0eSAqLwordm9pZCBpbml0aWFsaXplX292a19lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCkKK3sKKyAgICBzdHJ1Y3QgZXRfbGlzdCAqZXQsICoqZW5kOworCisgICAgZm9yIChlbmQgPSBsaXN0LCBldCA9ICpsaXN0OyBldDsgZW5kID0gJmV0LT5uZXh0LCBldCA9IGV0LT5uZXh0KQorICAgICAgICBpZiAoZXQtPnRhYmxlLT5tc2dzID09IHRleHQpCisgICAgICAgICAgICByZXR1cm47CisgICAgZXQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBldF9saXN0KSk7CisgICAgaWYgKGV0ID09IDApIHsKKyAgICAgICAgaWYgKCFsaW5rLnRhYmxlKQorICAgICAgICAgICAgZXQgPSAmbGluazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBldC0+dGFibGUgPSAmZXRfb3ZrX2Vycm9yX3RhYmxlOworICAgIGV0LT5uZXh0ID0gMDsKKyAgICAqZW5kID0gZXQ7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2NvbnRpbnVhdGlvbi5ldCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvY29udGludWF0aW9uLmV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZDE2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2NvbnRpbnVhdGlvbi5ldApAQCAtMCwwICsxLDggQEAKKwllcnJvcl90YWJsZQlvdmsKKworZXJyb3JfY29kZSBDSFBBU1NfVVRJTF9QQVNTV09SRF9JTl9ESUNUSU9OQVJZLAorIk5ldyBwYXNzd29yZCB3YXMgZm91bmQgaW4gYSBkaWN0aW9uYXJ5IG9mIHBvc3NpYmxlIHBhc3N3b3JkcyBhbmRcblwKK3RoZXJlZm9yZSBtYXkgYmUgZWFzaWx5IGd1ZXNzZWQuIFBsZWFzZSBjaG9vc2UgYW5vdGhlciBwYXNzd29yZC5cblwKK1NlZSB0aGUgb3ZwYXNzd2QgbWFuIHBhZ2UgZm9yIGhlbHAgaW4gY2hvb3NpbmcgYSBnb29kIHBhc3N3b3JkLiIKKworCWVuZApkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9jb250aW51YXRpb24uaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvY29udGludWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmZTYwMgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvY29udGludWF0aW9uLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIGNvbnRpbnVhdGlvbi5oOgorICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG8gbm90IGVkaXQgaXQuCisgKi8KKworI2luY2x1ZGUgPGV0L2NvbV9lcnIuaD4KKworI2RlZmluZSBDSFBBU1NfVVRJTF9QQVNTV09SRF9JTl9ESUNUSU9OQVJZICAgICAgICg0Mzc4NzUyMEwpCitleHRlcm4gY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlIGV0X292a19lcnJvcl90YWJsZTsKK2V4dGVybiB2b2lkIGluaXRpYWxpemVfb3ZrX2Vycm9yX3RhYmxlKHZvaWQpOworCisvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEhlaW1kYWwgKi8KK2V4dGVybiB2b2lkIGluaXRpYWxpemVfb3ZrX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KTsKKworI2RlZmluZSBFUlJPUl9UQUJMRV9CQVNFX292ayAoNDM3ODc1MjBMKQorCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zLi4uICovCisjZGVmaW5lIGluaXRfb3ZrX2Vycl90YmwgaW5pdGlhbGl6ZV9vdmtfZXJyb3JfdGFibGUKKyNkZWZpbmUgb3ZrX2Vycl9iYXNlIEVSUk9SX1RBQkxFX0JBU0Vfb3ZrCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzc1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIGhlaW1kYWwuYzoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0W10gPSB7CisJIktlcmJlcm9zIHN1Y2Nlc3NmdWwiLAorCSJLZXJiZXJvcyBwcmluY2lwYWwgZXhwaXJlZCIsCisJIktlcmJlcm9zIHNlcnZpY2UgZXhwaXJlZCIsCisJIktlcmJlcm9zIGF1dGggZXhwaXJlZCIsCisJIkluY29ycmVjdCBrZXJiZXJvcyBtYXN0ZXIga2V5IHZlcnNpb24iLAorCSJJbmNvcnJlY3Qga2VyYmVyb3MgbWFzdGVyIGtleSB2ZXJzaW9uIiwKKwkiSW5jb3JyZWN0IGtlcmJlcm9zIG1hc3RlciBrZXkgdmVyc2lvbiIsCisJIktlcmJlcm9zIGVycm9yOiBieXRlIG9yZGVyIHVua25vd24iLAorCSJLZXJiZXJvcyBwcmluY2lwYWwgdW5rbm93biIsCisJIktlcmJlcm9zIHByaW5jaXBhbCBub3QgdW5pcXVlIiwKKwkiS2VyYmVyb3MgcHJpbmNpcGFsIGhhcyBudWxsIGtleSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoMTEpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICgxMikiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDEzKSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoMTQpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICgxNSkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDE2KSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoMTcpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICgxOCkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDE5KSIsCisJIkdlbmVyaWMgZXJyb3IgZnJvbSBLZXJiZXJvcyBLREMiLAorCSJDYW4ndCByZWFkIEtlcmJlcm9zIHRpY2tldCBmaWxlIiwKKwkiQ2FuJ3QgZmluZCBLZXJiZXJvcyB0aWNrZXQgb3IgVEdUIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICgyMykiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDI0KSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoMjUpIiwKKwkiS2VyYmVyb3MgVEdUIEV4cGlyZWQiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDI3KSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoMjgpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICgyOSkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDMwKSIsCisJIktlcmJlcm9zIGVycm9yOiBDYW4ndCBkZWNvZGUgYXV0aGVudGljYXRvciIsCisJIktlcmJlcm9zIHRpY2tldCBleHBpcmVkIiwKKwkiS2VyYmVyb3MgdGlja2V0IG5vdCB5ZXQgdmFsaWQiLAorCSJLZXJiZXJvcyBlcnJvcjogUmVwZWF0ZWQgcmVxdWVzdCIsCisJIlRoZSBrZXJiZXJvcyB0aWNrZXQgaXNuJ3QgZm9yIHVzIiwKKwkiS2VyYmVyb3MgcmVxdWVzdCBpbmNvbnNpc3RlbnQiLAorCSJLZXJiZXJvcyBlcnJvcjogZGVsdGFfdCB0b28gYmlnIiwKKwkiS2VyYmVyb3MgZXJyb3I6IGluY29ycmVjdCBuZXQgYWRkcmVzcyIsCisJIktlcmJlcm9zIHByb3RvY29sIHZlcnNpb24gbWlzbWF0Y2giLAorCSJLZXJiZXJvcyBlcnJvcjogaW52YWxpZCBtc2cgdHlwZSIsCisJIktlcmJlcm9zIGVycm9yOiBtZXNzYWdlIHN0cmVhbSBtb2RpZmllZCIsCisJIktlcmJlcm9zIGVycm9yOiBtZXNzYWdlIG91dCBvZiBvcmRlciIsCisJIktlcmJlcm9zIGVycm9yOiB1bmF1dGhvcml6ZWQgcmVxdWVzdCIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoNDQpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICg0NSkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDQ2KSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoNDcpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICg0OCkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDQ5KSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoNTApIiwKKwkiS2VyYmVyb3MgZXJyb3I6IGN1cnJlbnQgUFcgaXMgbnVsbCIsCisJIktlcmJlcm9zIGVycm9yOiBJbmNvcnJlY3QgY3VycmVudCBwYXNzd29yZCIsCisJIktlcmJlcm9zIHByb3RvY29sIGVycm9yIiwKKwkiRXJyb3IgcmV0dXJuZWQgYnkgS2VyYmVyb3MgS0RDIiwKKwkiTnVsbCBLZXJiZXJvcyB0aWNrZXQgcmV0dXJuZWQgYnkgS0RDIiwKKwkiS2VyYmVyb3MgZXJyb3I6IFJldHJ5IGNvdW50IGV4Y2VlZGVkIiwKKwkiS2VyYmVyb3MgZXJyb3I6IENhbid0IHNlbmQgcmVxdWVzdCIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoNTgpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICg1OSkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDYwKSIsCisJIktlcmJlcm9zIGVycm9yOiBub3QgYWxsIHRpY2tldHMgcmV0dXJuZWQiLAorCSJLZXJiZXJvcyBlcnJvcjogaW5jb3JyZWN0IHBhc3N3b3JkIiwKKwkiS2VyYmVyb3MgZXJyb3I6IFByb3RvY29sIEVycm9yIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICg2NCkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDY1KSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoNjYpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICg2NykiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDY4KSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoNjkpIiwKKwkiT3RoZXIgZXJyb3IiLAorCSJEb24ndCBoYXZlIEtlcmJlcm9zIHRpY2tldC1ncmFudGluZyB0aWNrZXQiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDcyKSIsCisJIlJlc2VydmVkIGtyYiBlcnJvciAoNzMpIiwKKwkiUmVzZXJ2ZWQga3JiIGVycm9yICg3NCkiLAorCSJSZXNlcnZlZCBrcmIgZXJyb3IgKDc1KSIsCisJIk5vIHRpY2tldCBmaWxlIGZvdW5kIiwKKwkiQ291bGRuJ3QgYWNjZXNzIHRpY2tldCBmaWxlIiwKKwkiQ291bGRuJ3QgbG9jayB0aWNrZXQgZmlsZSIsCisJIkJhZCB0aWNrZXQgZmlsZSBmb3JtYXQiLAorCSJ0Zl9pbml0IG5vdCBjYWxsZWQgZmlyc3QiLAorCSJCYWQgS2VyYmVyb3MgbmFtZSBmb3JtYXQiLAorICAgIDAKK307CisKK3N0cnVjdCBlcnJvcl90YWJsZSB7CisgICAgY2hhciBjb25zdCAqIGNvbnN0ICogbXNnczsKKyAgICBsb25nIGJhc2U7CisgICAgaW50IG5fbXNnczsKK307CitzdHJ1Y3QgZXRfbGlzdCB7CisgICAgc3RydWN0IGV0X2xpc3QgKm5leHQ7CisgICAgY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlICogdGFibGU7Cit9OworZXh0ZXJuIHN0cnVjdCBldF9saXN0ICpfZXRfbGlzdDsKKworY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlIGV0X2tyYl9lcnJvcl90YWJsZSA9IHsgdGV4dCwgMzk1MjUzNzZMLCA4MiB9OworCitzdGF0aWMgc3RydWN0IGV0X2xpc3QgbGluayA9IHsgMCwgMCB9OworCit2b2lkIGluaXRpYWxpemVfa3JiX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KTsKK3ZvaWQgaW5pdGlhbGl6ZV9rcmJfZXJyb3JfdGFibGUodm9pZCk7CisKK3ZvaWQgaW5pdGlhbGl6ZV9rcmJfZXJyb3JfdGFibGUodm9pZCkgeworICAgIGluaXRpYWxpemVfa3JiX2Vycm9yX3RhYmxlX3IoJl9ldF9saXN0KTsKK30KKworLyogRm9yIEhlaW1kYWwgY29tcGF0aWJpbGl0eSAqLwordm9pZCBpbml0aWFsaXplX2tyYl9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCkKK3sKKyAgICBzdHJ1Y3QgZXRfbGlzdCAqZXQsICoqZW5kOworCisgICAgZm9yIChlbmQgPSBsaXN0LCBldCA9ICpsaXN0OyBldDsgZW5kID0gJmV0LT5uZXh0LCBldCA9IGV0LT5uZXh0KQorICAgICAgICBpZiAoZXQtPnRhYmxlLT5tc2dzID09IHRleHQpCisgICAgICAgICAgICByZXR1cm47CisgICAgZXQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBldF9saXN0KSk7CisgICAgaWYgKGV0ID09IDApIHsKKyAgICAgICAgaWYgKCFsaW5rLnRhYmxlKQorICAgICAgICAgICAgZXQgPSAmbGluazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBldC0+dGFibGUgPSAmZXRfa3JiX2Vycm9yX3RhYmxlOworICAgIGV0LT5uZXh0ID0gMDsKKyAgICAqZW5kID0gZXQ7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwuZXQgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwuZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjZTE5MgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbC5ldApAQCAtMCwwICsxLDY1IEBACisjCUNvcHlyaWdodCAxOTg3LDE5ODggTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorIworIwlGb3IgY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUKKyMJIm1pdC1jb3B5cmlnaHQuaCIuCisjIAorIyBUaGlzIG1pZ2h0IGxvb2sgbGlrZSBhIGNvbV9lcnIgZmlsZSwgYnV0IGlzIG5vdAorIworaWQgIiRJZDoga3JiX2Vyci5ldCx2IDEuNyAxOTk4LzAzLzI5IDE0OjE5OjUyIGJnIEV4cCAkIgorCitlcnJvcl90YWJsZSBrcmIKKworcHJlZml4IEtSQkVUCitlYyBLU1VDQ0VTUywJCSJLZXJiZXJvcyBzdWNjZXNzZnVsIgorZWMgS0RDX05BTUVfRVhQLAkiS2VyYmVyb3MgcHJpbmNpcGFsIGV4cGlyZWQiCitlYyBLRENfU0VSVklDRV9FWFAsCSJLZXJiZXJvcyBzZXJ2aWNlIGV4cGlyZWQiCitlYyBLRENfQVVUSF9FWFAsCSJLZXJiZXJvcyBhdXRoIGV4cGlyZWQiCitlYyBLRENfUEtUX1ZFUiwJCSJJbmNvcnJlY3Qga2VyYmVyb3MgbWFzdGVyIGtleSB2ZXJzaW9uIgorZWMgS0RDX1BfTUtFWV9WRVIsCSJJbmNvcnJlY3Qga2VyYmVyb3MgbWFzdGVyIGtleSB2ZXJzaW9uIgorZWMgS0RDX1NfTUtFWV9WRVIsCSJJbmNvcnJlY3Qga2VyYmVyb3MgbWFzdGVyIGtleSB2ZXJzaW9uIgorZWMgS0RDX0JZVEVfT1JERVIsCSJLZXJiZXJvcyBlcnJvcjogYnl0ZSBvcmRlciB1bmtub3duIgorZWMgS0RDX1BSX1VOS05PV04sCSJLZXJiZXJvcyBwcmluY2lwYWwgdW5rbm93biIKK2VjIEtEQ19QUl9OX1VOSVFVRSwJIktlcmJlcm9zIHByaW5jaXBhbCBub3QgdW5pcXVlIgorZWMgS0RDX05VTExfS0VZLAkiS2VyYmVyb3MgcHJpbmNpcGFsIGhhcyBudWxsIGtleSIKK2luZGV4IDIwCitlYyBLRENfR0VOX0VSUiwJCSJHZW5lcmljIGVycm9yIGZyb20gS2VyYmVyb3MgS0RDIgorZWMgR0NfVEtGSUwsCQkiQ2FuJ3QgcmVhZCBLZXJiZXJvcyB0aWNrZXQgZmlsZSIKK2VjIEdDX05PVEtULAkJIkNhbid0IGZpbmQgS2VyYmVyb3MgdGlja2V0IG9yIFRHVCIKK2luZGV4IDI2CitlYyBNS19BUF9UR1RFWFAsCSJLZXJiZXJvcyBUR1QgRXhwaXJlZCIKK2luZGV4IDMxCitlYyBSRF9BUF9VTkRFQywJCSJLZXJiZXJvcyBlcnJvcjogQ2FuJ3QgZGVjb2RlIGF1dGhlbnRpY2F0b3IiCitlYyBSRF9BUF9FWFAsCQkiS2VyYmVyb3MgdGlja2V0IGV4cGlyZWQiCitlYyBSRF9BUF9OWVYsCQkiS2VyYmVyb3MgdGlja2V0IG5vdCB5ZXQgdmFsaWQiCitlYyBSRF9BUF9SRVBFQVQsCSJLZXJiZXJvcyBlcnJvcjogUmVwZWF0ZWQgcmVxdWVzdCIKK2VjIFJEX0FQX05PVF9VUywJIlRoZSBrZXJiZXJvcyB0aWNrZXQgaXNuJ3QgZm9yIHVzIgorZWMgUkRfQVBfSU5DT04sCQkiS2VyYmVyb3MgcmVxdWVzdCBpbmNvbnNpc3RlbnQiCitlYyBSRF9BUF9USU1FLAkJIktlcmJlcm9zIGVycm9yOiBkZWx0YV90IHRvbyBiaWciCitlYyBSRF9BUF9CQURELAkJIktlcmJlcm9zIGVycm9yOiBpbmNvcnJlY3QgbmV0IGFkZHJlc3MiCitlYyBSRF9BUF9WRVJTSU9OLAkiS2VyYmVyb3MgcHJvdG9jb2wgdmVyc2lvbiBtaXNtYXRjaCIKK2VjIFJEX0FQX01TR19UWVBFLAkiS2VyYmVyb3MgZXJyb3I6IGludmFsaWQgbXNnIHR5cGUiCitlYyBSRF9BUF9NT0RJRklFRCwJIktlcmJlcm9zIGVycm9yOiBtZXNzYWdlIHN0cmVhbSBtb2RpZmllZCIKK2VjIFJEX0FQX09SREVSLAkJIktlcmJlcm9zIGVycm9yOiBtZXNzYWdlIG91dCBvZiBvcmRlciIKK2VjIFJEX0FQX1VOQVVUSE9SLAkiS2VyYmVyb3MgZXJyb3I6IHVuYXV0aG9yaXplZCByZXF1ZXN0IgoraW5kZXggNTEKK2VjIEdUX1BXX05VTEwsCQkiS2VyYmVyb3MgZXJyb3I6IGN1cnJlbnQgUFcgaXMgbnVsbCIKK2VjIEdUX1BXX0JBRFBXLAkJIktlcmJlcm9zIGVycm9yOiBJbmNvcnJlY3QgY3VycmVudCBwYXNzd29yZCIKK2VjIEdUX1BXX1BST1QsCQkiS2VyYmVyb3MgcHJvdG9jb2wgZXJyb3IiCitlYyBHVF9QV19LRENFUlIsCSJFcnJvciByZXR1cm5lZCBieSBLZXJiZXJvcyBLREMiCitlYyBHVF9QV19OVUxMVEtULAkiTnVsbCBLZXJiZXJvcyB0aWNrZXQgcmV0dXJuZWQgYnkgS0RDIgorZWMgU0tEQ19SRVRSWSwJCSJLZXJiZXJvcyBlcnJvcjogUmV0cnkgY291bnQgZXhjZWVkZWQiCitlYyBTS0RDX0NBTlQsCQkiS2VyYmVyb3MgZXJyb3I6IENhbid0IHNlbmQgcmVxdWVzdCIKK2luZGV4IDYxCitlYyBJTlRLX1dfTk9UQUxMLAkiS2VyYmVyb3MgZXJyb3I6IG5vdCBhbGwgdGlja2V0cyByZXR1cm5lZCIKK2VjIElOVEtfQkFEUFcsCQkiS2VyYmVyb3MgZXJyb3I6IGluY29ycmVjdCBwYXNzd29yZCIKK2VjIElOVEtfUFJPVCwJCSJLZXJiZXJvcyBlcnJvcjogUHJvdG9jb2wgRXJyb3IiCitpbmRleCA3MAorZWMgSU5US19FUlIsCQkiT3RoZXIgZXJyb3IiCitlYyBBRF9OT1RHVCwJCSJEb24ndCBoYXZlIEtlcmJlcm9zIHRpY2tldC1ncmFudGluZyB0aWNrZXQiCitpbmRleCA3NgorZWMgTk9fVEtUX0ZJTCwJCSJObyB0aWNrZXQgZmlsZSBmb3VuZCIKK2VjIFRLVF9GSUxfQUNDLAkJIkNvdWxkbid0IGFjY2VzcyB0aWNrZXQgZmlsZSIKK2VjIFRLVF9GSUxfTENLLAkJIkNvdWxkbid0IGxvY2sgdGlja2V0IGZpbGUiCitlYyBUS1RfRklMX0ZNVCwJCSJCYWQgdGlja2V0IGZpbGUgZm9ybWF0IgorZWMgVEtUX0ZJTF9JTkksCQkidGZfaW5pdCBub3QgY2FsbGVkIGZpcnN0IgorZWMgS05BTUVfRk1ULAkJIkJhZCBLZXJiZXJvcyBuYW1lIGZvcm1hdCIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbC5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9oZWltZGFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5NDM1NAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBoZWltZGFsLmg6CisgKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQ7IHBsZWFzZSBkbyBub3QgZWRpdCBpdC4KKyAqLworCisjaW5jbHVkZSA8ZXQvY29tX2Vyci5oPgorCisjZGVmaW5lIEtSQkVUX0tTVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzc2TCkKKyNkZWZpbmUgS1JCRVRfS0RDX05BTUVfRVhQICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzNzdMKQorI2RlZmluZSBLUkJFVF9LRENfU0VSVklDRV9FWFAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM3OEwpCisjZGVmaW5lIEtSQkVUX0tEQ19BVVRIX0VYUCAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzc5TCkKKyNkZWZpbmUgS1JCRVRfS0RDX1BLVF9WRVIgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzODBMKQorI2RlZmluZSBLUkJFVF9LRENfUF9NS0VZX1ZFUiAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM4MUwpCisjZGVmaW5lIEtSQkVUX0tEQ19TX01LRVlfVkVSICAgICAgICAgICAgICAgICAgICAgKDM5NTI1MzgyTCkKKyNkZWZpbmUgS1JCRVRfS0RDX0JZVEVfT1JERVIgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzODNMKQorI2RlZmluZSBLUkJFVF9LRENfUFJfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM4NEwpCisjZGVmaW5lIEtSQkVUX0tEQ19QUl9OX1VOSVFVRSAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzg1TCkKKyNkZWZpbmUgS1JCRVRfS0RDX05VTExfS0VZICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzODZMKQorI2RlZmluZSBLUkJFVF9LRENfR0VOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM5NkwpCisjZGVmaW5lIEtSQkVUX0dDX1RLRklMICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzk3TCkKKyNkZWZpbmUgS1JCRVRfR0NfTk9US1QgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzOThMKQorI2RlZmluZSBLUkJFVF9NS19BUF9UR1RFWFAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQwMkwpCisjZGVmaW5lIEtSQkVUX1JEX0FQX1VOREVDICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDA3TCkKKyNkZWZpbmUgS1JCRVRfUkRfQVBfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MDhMKQorI2RlZmluZSBLUkJFVF9SRF9BUF9OWVYgICAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQwOUwpCisjZGVmaW5lIEtSQkVUX1JEX0FQX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDEwTCkKKyNkZWZpbmUgS1JCRVRfUkRfQVBfTk9UX1VTICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MTFMKQorI2RlZmluZSBLUkJFVF9SRF9BUF9JTkNPTiAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQxMkwpCisjZGVmaW5lIEtSQkVUX1JEX0FQX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDEzTCkKKyNkZWZpbmUgS1JCRVRfUkRfQVBfQkFERCAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MTRMKQorI2RlZmluZSBLUkJFVF9SRF9BUF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQxNUwpCisjZGVmaW5lIEtSQkVUX1JEX0FQX01TR19UWVBFICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDE2TCkKKyNkZWZpbmUgS1JCRVRfUkRfQVBfTU9ESUZJRUQgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MTdMKQorI2RlZmluZSBLUkJFVF9SRF9BUF9PUkRFUiAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQxOEwpCisjZGVmaW5lIEtSQkVUX1JEX0FQX1VOQVVUSE9SICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDE5TCkKKyNkZWZpbmUgS1JCRVRfR1RfUFdfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MjdMKQorI2RlZmluZSBLUkJFVF9HVF9QV19CQURQVyAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQyOEwpCisjZGVmaW5lIEtSQkVUX0dUX1BXX1BST1QgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDI5TCkKKyNkZWZpbmUgS1JCRVRfR1RfUFdfS0RDRVJSICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MzBMKQorI2RlZmluZSBLUkJFVF9HVF9QV19OVUxMVEtUICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQzMUwpCisjZGVmaW5lIEtSQkVUX1NLRENfUkVUUlkgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDMyTCkKKyNkZWZpbmUgS1JCRVRfU0tEQ19DQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MzNMKQorI2RlZmluZSBLUkJFVF9JTlRLX1dfTk9UQUxMICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQzN0wpCisjZGVmaW5lIEtSQkVUX0lOVEtfQkFEUFcgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDM4TCkKKyNkZWZpbmUgS1JCRVRfSU5US19QUk9UICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0MzlMKQorI2RlZmluZSBLUkJFVF9JTlRLX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQ0NkwpCisjZGVmaW5lIEtSQkVUX0FEX05PVEdUICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDQ3TCkKKyNkZWZpbmUgS1JCRVRfTk9fVEtUX0ZJTCAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0NTJMKQorI2RlZmluZSBLUkJFVF9US1RfRklMX0FDQyAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQ1M0wpCisjZGVmaW5lIEtSQkVUX1RLVF9GSUxfTENLICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDU0TCkKKyNkZWZpbmUgS1JCRVRfVEtUX0ZJTF9GTVQgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjU0NTVMKQorI2RlZmluZSBLUkJFVF9US1RfRklMX0lOSSAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTQ1NkwpCisjZGVmaW5lIEtSQkVUX0tOQU1FX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1NDU3TCkKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfa3JiX2Vycm9yX3RhYmxlOworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9rcmJfZXJyb3JfdGFibGUodm9pZCk7CisKKy8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggSGVpbWRhbCAqLworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9rcmJfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QpOworCisjZGVmaW5lIEVSUk9SX1RBQkxFX0JBU0Vfa3JiICgzOTUyNTM3NkwpCisKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMuLi4gKi8KKyNkZWZpbmUgaW5pdF9rcmJfZXJyX3RibCBpbml0aWFsaXplX2tyYl9lcnJvcl90YWJsZQorI2RlZmluZSBrcmJfZXJyX2Jhc2UgRVJST1JfVEFCTEVfQkFTRV9rcmIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbDIuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmEzZDYyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9oZWltZGFsMi5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogaGVpbWRhbDIuYzoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0W10gPSB7CisJIiRJZDoga2FkbV9lcnIuZXQsdiAxLjUgMTk5OC8wMS8xNiAyMzoxMToyNyBqb2RhIEV4cCAkIiwKKwkiQ2Fubm90IGZldGNoIGxvY2FsIHJlYWxtIiwKKwkiVW5hYmxlIHRvIGZldGNoIGNyZWRlbnRpYWxzIiwKKwkiQmFkIGtleSBzdXBwbGllZCIsCisJIkNhbid0IGVuY3J5cHQgZGF0YSIsCisJIkNhbm5vdCBlbmNvZGUvZGVjb2RlIGF1dGhlbnRpY2F0aW9uIGluZm8iLAorCSJQcmluY2lwYWwgYXR0ZW1waW5nIGNoYW5nZSBpcyBpbiB3cm9uZyByZWFsbSIsCisJIlBhY2tldCBpcyB0b28gbGFyZ2UiLAorCSJWZXJzaW9uIG51bWJlciBpcyBpbmNvcnJlY3QiLAorCSJDaGVja3N1bSBkb2VzIG5vdCBtYXRjaCIsCisJIlVuc2VhbGluZyBwcml2YXRlIGRhdGEgZmFpbGVkIiwKKwkiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIiwKKwkiQ291bGQgbm90IGZpbmQgYWRtaW5pc3RyYXRpbmcgaG9zdCIsCisJIkFkbWluaXN0cmF0aW5nIGhvc3QgbmFtZSBpcyB1bmtub3duIiwKKwkiQ291bGQgbm90IGZpbmQgc2VydmljZSBuYW1lIGluIHNlcnZpY2VzIGRhdGFiYXNlIiwKKwkiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQiLAorCSJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiLAorCSJDb3VsZCBub3QgZmV0Y2ggbG9jYWwgc29ja2V0IGFkZHJlc3MiLAorCSJDb3VsZCBub3QgZmV0Y2ggbWFzdGVyIGtleSIsCisJIkNvdWxkIG5vdCB2ZXJpZnkgbWFzdGVyIGtleSIsCisJIkVudHJ5IGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlIiwKKwkiRGF0YWJhc2Ugc3RvcmUgZXJyb3IiLAorCSJEYXRhYmFzZSByZWFkIGVycm9yIiwKKwkiSW5zdWZmaWNpZW50IGFjY2VzcyB0byBwZXJmb3JtIHJlcXVlc3RlZCBvcGVyYXRpb24iLAorCSJEYXRhIGlzIGF2YWlsYWJsZSBmb3IgcmV0dXJuIHRvIGNsaWVudCIsCisJIk5vIHN1Y2ggZW50cnkgaW4gdGhlIGRhdGFiYXNlIiwKKwkiTWVtb3J5IGV4aGF1c3RlZCIsCisJIkNvdWxkIG5vdCBmZXRjaCBzeXN0ZW0gaG9zdG5hbWUiLAorCSJDb3VsZCBub3QgYmluZCBwb3J0IiwKKwkiTGVuZ3RoIG1pc21hdGNoIHByb2JsZW0iLAorCSJJbGxlZ2FsIHVzZSBvZiB3aWxkY2FyZCIsCisJIkRhdGFiYXNlIGlzIGxvY2tlZCBvciBpbiB1c2UtLXRyeSBhZ2FpbiBsYXRlciIsCisJIkluc2VjdXJlIHBhc3N3b3JkIHJlamVjdGVkIiwKKwkiQ2xlYXJ0ZXh0IHBhc3N3b3JkIGFuZCBERVMga2V5IGRpZCBub3QgbWF0Y2giLAorCSJJbnZhbGlkIHByaW5jaXBhbCBmb3IgY2hhbmdlIHNydnRhYiByZXF1ZXN0IiwKKwkiQXR0ZW1wdCBkbyBkZWxldGUgaW1tdXRhYmxlIHByaW5jaXBhbCIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDM2KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDM3KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDM4KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDM5KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQwKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQxKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQyKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQzKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQ0KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQ1KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQ2KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQ3KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQ4KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDQ5KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDUwKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDUxKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDUyKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDUzKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDU0KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDU1KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDU2KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDU3KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDU4KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDU5KSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDYwKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDYxKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDYyKSIsCisJIlJlc2VydmVkIGthZG0gZXJyb3IgKDYzKSIsCisJIk51bGwgcGFzc3dvcmRzIGFyZSBub3QgYWxsb3dlZCIsCisJIlBhc3N3b3JkIGlzIHRvbyBzaG9ydCIsCisJIlRvbyBmZXcgY2hhcmFjdGVyIGNsYXNzZXMgaW4gcGFzc3dvcmQiLAorCSJQYXNzd29yZCBpcyBpbiB0aGUgcGFzc3dvcmQgZGljdGlvbmFyeSIsCisgICAgMAorfTsKKworc3RydWN0IGVycm9yX3RhYmxlIHsKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgKiBtc2dzOworICAgIGxvbmcgYmFzZTsKKyAgICBpbnQgbl9tc2dzOworfTsKK3N0cnVjdCBldF9saXN0IHsKKyAgICBzdHJ1Y3QgZXRfbGlzdCAqbmV4dDsKKyAgICBjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgKiB0YWJsZTsKK307CitleHRlcm4gc3RydWN0IGV0X2xpc3QgKl9ldF9saXN0OworCitjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfa2FkbV9lcnJvcl90YWJsZSA9IHsgdGV4dCwgLTE3ODMxMjYyNzJMLCA2OCB9OworCitzdGF0aWMgc3RydWN0IGV0X2xpc3QgbGluayA9IHsgMCwgMCB9OworCit2b2lkIGluaXRpYWxpemVfa2FkbV9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCk7Cit2b2lkIGluaXRpYWxpemVfa2FkbV9lcnJvcl90YWJsZSh2b2lkKTsKKwordm9pZCBpbml0aWFsaXplX2thZG1fZXJyb3JfdGFibGUodm9pZCkgeworICAgIGluaXRpYWxpemVfa2FkbV9lcnJvcl90YWJsZV9yKCZfZXRfbGlzdCk7Cit9CisKKy8qIEZvciBIZWltZGFsIGNvbXBhdGliaWxpdHkgKi8KK3ZvaWQgaW5pdGlhbGl6ZV9rYWRtX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KQoreworICAgIHN0cnVjdCBldF9saXN0ICpldCwgKiplbmQ7CisKKyAgICBmb3IgKGVuZCA9IGxpc3QsIGV0ID0gKmxpc3Q7IGV0OyBlbmQgPSAmZXQtPm5leHQsIGV0ID0gZXQtPm5leHQpCisgICAgICAgIGlmIChldC0+dGFibGUtPm1zZ3MgPT0gdGV4dCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICBldCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGV0X2xpc3QpKTsKKyAgICBpZiAoZXQgPT0gMCkgeworICAgICAgICBpZiAoIWxpbmsudGFibGUpCisgICAgICAgICAgICBldCA9ICZsaW5rOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGV0LT50YWJsZSA9ICZldF9rYWRtX2Vycm9yX3RhYmxlOworICAgIGV0LT5uZXh0ID0gMDsKKyAgICAqZW5kID0gZXQ7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwyLmV0IGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9oZWltZGFsMi5ldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTI0N2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9oZWltZGFsMi5ldApAQCAtMCwwICsxLDY1IEBACisjICRJZDoga2FkbV9lcnIuZXQsdiAxLjUgMTk5OC8wMS8xNiAyMzoxMToyNyBqb2RhIEV4cCAkCisjCisjIENvcHlyaWdodCAxOTg4IGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LgorIworIyBGb3IgY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBmaWxlCisjIDxtaXQtY29weXJpZ2h0Lmg+LgorIworIyBLZXJiZXJvcyBhZG1pbmlzdHJhdGlvbiBzZXJ2ZXIgZXJyb3IgdGFibGUKKyMKKwlldAlrYWRtCisKKyMgS0FETV9TVUNDRVNTLCBhcyBhbGwgc3VjY2VzcyBjb2RlcyBzaG91bGQgYmUsIGlzIHplcm8KKworZWMgS0FETV9SQ1NJRCwJCSIkSWQ6IGthZG1fZXJyLmV0LHYgMS41IDE5OTgvMDEvMTYgMjM6MTE6Mjcgam9kYSBFeHAgJCIKKyMgLyogQnVpbGRpbmcgYW5kIHVuYnVpbGRpbmcgdGhlIHBhY2tldCBlcnJvcnMgKi8KK2VjIEtBRE1fTk9fUkVBTE0sCSJDYW5ub3QgZmV0Y2ggbG9jYWwgcmVhbG0iCitlYyBLQURNX05PX0NSRUQsCSJVbmFibGUgdG8gZmV0Y2ggY3JlZGVudGlhbHMiCitlYyBLQURNX0JBRF9LRVksCSJCYWQga2V5IHN1cHBsaWVkIgorZWMgS0FETV9OT19FTkNSWVBULAkiQ2FuJ3QgZW5jcnlwdCBkYXRhIgorZWMgS0FETV9OT19BVVRILAkiQ2Fubm90IGVuY29kZS9kZWNvZGUgYXV0aGVudGljYXRpb24gaW5mbyIKK2VjIEtBRE1fV1JPTkdfUkVBTE0sCSJQcmluY2lwYWwgYXR0ZW1waW5nIGNoYW5nZSBpcyBpbiB3cm9uZyByZWFsbSIKK2VjIEtBRE1fTk9fUk9PTSwJIlBhY2tldCBpcyB0b28gbGFyZ2UiCitlYyBLQURNX0JBRF9WRVIsCSJWZXJzaW9uIG51bWJlciBpcyBpbmNvcnJlY3QiCitlYyBLQURNX0JBRF9DSEssCSJDaGVja3N1bSBkb2VzIG5vdCBtYXRjaCIKK2VjIEtBRE1fTk9fUkVBRCwJIlVuc2VhbGluZyBwcml2YXRlIGRhdGEgZmFpbGVkIgorZWMgS0FETV9OT19PUENPREUsCSJVbnN1cHBvcnRlZCBvcGVyYXRpb24iCitlYyBLQURNX05PX0hPU1QsCSJDb3VsZCBub3QgZmluZCBhZG1pbmlzdHJhdGluZyBob3N0IgorZWMgS0FETV9VTktfSE9TVCwJIkFkbWluaXN0cmF0aW5nIGhvc3QgbmFtZSBpcyB1bmtub3duIgorZWMgS0FETV9OT19TRVJWLAkiQ291bGQgbm90IGZpbmQgc2VydmljZSBuYW1lIGluIHNlcnZpY2VzIGRhdGFiYXNlIgorZWMgS0FETV9OT19TT0NLLAkiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQiCitlYyBLQURNX05PX0NPTk4sCSJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCitlYyBLQURNX05PX0hFUkUsCSJDb3VsZCBub3QgZmV0Y2ggbG9jYWwgc29ja2V0IGFkZHJlc3MiCitlYyBLQURNX05PX01BU1QsCSJDb3VsZCBub3QgZmV0Y2ggbWFzdGVyIGtleSIKK2VjIEtBRE1fTk9fVkVSSSwJIkNvdWxkIG5vdCB2ZXJpZnkgbWFzdGVyIGtleSIKKworIyAvKiBGcm9tIHRoZSBzZXJ2ZXIgc2lkZSByb3V0aW5lcyAqLworZWMgS0FETV9JTlVTRSwJCSJFbnRyeSBhbHJlYWR5IGV4aXN0cyBpbiBkYXRhYmFzZSIKK2VjIEtBRE1fVUtfU0VSUk9SLAkiRGF0YWJhc2Ugc3RvcmUgZXJyb3IiCitlYyBLQURNX1VLX1JFUlJPUiwJIkRhdGFiYXNlIHJlYWQgZXJyb3IiCitlYyBLQURNX1VOQVVUSCwJCSJJbnN1ZmZpY2llbnQgYWNjZXNzIHRvIHBlcmZvcm0gcmVxdWVzdGVkIG9wZXJhdGlvbiIKKyMgS0FETV9EQVRBIGlzbid0IHJlYWxseSBhbiBlcnJvciwgYnV0Li4uCitlYyBLQURNX0RBVEEsCQkiRGF0YSBpcyBhdmFpbGFibGUgZm9yIHJldHVybiB0byBjbGllbnQiCitlYyBLQURNX05PRU5UUlksCSJObyBzdWNoIGVudHJ5IGluIHRoZSBkYXRhYmFzZSIKKworZWMgS0FETV9OT01FTSwJCSJNZW1vcnkgZXhoYXVzdGVkIgorZWMgS0FETV9OT19IT1NUTkFNRSwJIkNvdWxkIG5vdCBmZXRjaCBzeXN0ZW0gaG9zdG5hbWUiCitlYyBLQURNX05PX0JJTkQsCSJDb3VsZCBub3QgYmluZCBwb3J0IgorZWMgS0FETV9MRU5HVEhfRVJST1IsCSJMZW5ndGggbWlzbWF0Y2ggcHJvYmxlbSIKK2VjIEtBRE1fSUxMX1dJTERDQVJELAkiSWxsZWdhbCB1c2Ugb2Ygd2lsZGNhcmQiCisKK2VjIEtBRE1fREJfSU5VU0UsCSJEYXRhYmFzZSBpcyBsb2NrZWQgb3IgaW4gdXNlLS10cnkgYWdhaW4gbGF0ZXIiCisKK2VjIEtBRE1fSU5TRUNVUkVfUFcsICAgICJJbnNlY3VyZSBwYXNzd29yZCByZWplY3RlZCIKK2VjIEtBRE1fUFdfTUlTTUFUQ0gsICAgICJDbGVhcnRleHQgcGFzc3dvcmQgYW5kIERFUyBrZXkgZGlkIG5vdCBtYXRjaCIKKworZWMgS0FETV9OT1RfU0VSVl9QUklOQywgIkludmFsaWQgcHJpbmNpcGFsIGZvciBjaGFuZ2Ugc3J2dGFiIHJlcXVlc3QiCitlYyBLQURNX0lNTVVUQUJMRSwJIkF0dGVtcHQgZG8gZGVsZXRlIGltbXV0YWJsZSBwcmluY2lwYWwiCisjIHBhc3N3b3JkIHF1YWxpdHkgYmFzaWNhbGx5IHN0b2xlbiBmcm9tIE9WIGxpYmthZG01CitpbmRleCA2NAorcHJlZml4IEtBRE1fUEFTU19RCitlYyBOVUxMLAkJIk51bGwgcGFzc3dvcmRzIGFyZSBub3QgYWxsb3dlZCIKK2VjIFRPT1NIT1JULAkJIlBhc3N3b3JkIGlzIHRvbyBzaG9ydCIKK2VjIENMQVNTLAkJIlRvbyBmZXcgY2hhcmFjdGVyIGNsYXNzZXMgaW4gcGFzc3dvcmQiCitlYyBESUNULAkJIlBhc3N3b3JkIGlzIGluIHRoZSBwYXNzd29yZCBkaWN0aW9uYXJ5IgorZW5kCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwyLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyY2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbDIuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogaGVpbWRhbDIuaDoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LgorICovCisKKyNpbmNsdWRlIDxldC9jb21fZXJyLmg+CisKKyNkZWZpbmUgS0FETV9SQ1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNzJMKQorI2RlZmluZSBLQURNX05PX1JFQUxNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI3MUwpCisjZGVmaW5lIEtBRE1fTk9fQ1JFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjcwTCkKKyNkZWZpbmUgS0FETV9CQURfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNjlMKQorI2RlZmluZSBLQURNX05PX0VOQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI2OEwpCisjZGVmaW5lIEtBRE1fTk9fQVVUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjY3TCkKKyNkZWZpbmUgS0FETV9XUk9OR19SRUFMTSAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNjZMKQorI2RlZmluZSBLQURNX05PX1JPT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI2NUwpCisjZGVmaW5lIEtBRE1fQkFEX1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjY0TCkKKyNkZWZpbmUgS0FETV9CQURfQ0hLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNjNMKQorI2RlZmluZSBLQURNX05PX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI2MkwpCisjZGVmaW5lIEtBRE1fTk9fT1BDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjYxTCkKKyNkZWZpbmUgS0FETV9OT19IT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNjBMKQorI2RlZmluZSBLQURNX1VOS19IT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI1OUwpCisjZGVmaW5lIEtBRE1fTk9fU0VSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjU4TCkKKyNkZWZpbmUgS0FETV9OT19TT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNTdMKQorI2RlZmluZSBLQURNX05PX0NPTk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI1NkwpCisjZGVmaW5lIEtBRE1fTk9fSEVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjU1TCkKKyNkZWZpbmUgS0FETV9OT19NQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNTRMKQorI2RlZmluZSBLQURNX05PX1ZFUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI1M0wpCisjZGVmaW5lIEtBRE1fSU5VU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjUyTCkKKyNkZWZpbmUgS0FETV9VS19TRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNTFMKQorI2RlZmluZSBLQURNX1VLX1JFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI1MEwpCisjZGVmaW5lIEtBRE1fVU5BVVRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjQ5TCkKKyNkZWZpbmUgS0FETV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNDhMKQorI2RlZmluZSBLQURNX05PRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI0N0wpCisjZGVmaW5lIEtBRE1fTk9NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjQ2TCkKKyNkZWZpbmUgS0FETV9OT19IT1NUTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNDVMKQorI2RlZmluZSBLQURNX05PX0JJTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI0NEwpCisjZGVmaW5lIEtBRE1fTEVOR1RIX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjQzTCkKKyNkZWZpbmUgS0FETV9JTExfV0lMRENBUkQgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyNDJMKQorI2RlZmluZSBLQURNX0RCX0lOVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjI0MUwpCisjZGVmaW5lIEtBRE1fSU5TRUNVUkVfUFcgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjQwTCkKKyNkZWZpbmUgS0FETV9QV19NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyMzlMKQorI2RlZmluZSBLQURNX05PVF9TRVJWX1BSSU5DICAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjIzOEwpCisjZGVmaW5lIEtBRE1fSU1NVVRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjM3TCkKKyNkZWZpbmUgS0FETV9QQVNTX1FfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyMDhMKQorI2RlZmluZSBLQURNX1BBU1NfUV9UT09TSE9SVCAgICAgICAgICAgICAgICAgICAgICgtMTc4MzEyNjIwN0wpCisjZGVmaW5lIEtBRE1fUEFTU19RX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzgzMTI2MjA2TCkKKyNkZWZpbmUgS0FETV9QQVNTX1FfRElDVCAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3ODMxMjYyMDVMKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSBldF9rYWRtX2Vycm9yX3RhYmxlOworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9rYWRtX2Vycm9yX3RhYmxlKHZvaWQpOworCisvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEhlaW1kYWwgKi8KK2V4dGVybiB2b2lkIGluaXRpYWxpemVfa2FkbV9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCk7CisKKyNkZWZpbmUgRVJST1JfVEFCTEVfQkFTRV9rYWRtICgtMTc4MzEyNjI3MkwpCisKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMuLi4gKi8KKyNkZWZpbmUgaW5pdF9rYWRtX2Vycl90YmwgaW5pdGlhbGl6ZV9rYWRtX2Vycm9yX3RhYmxlCisjZGVmaW5lIGthZG1fZXJyX2Jhc2UgRVJST1JfVEFCTEVfQkFTRV9rYWRtCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwzLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhOWNjYwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbDMuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogaGVpbWRhbDMuYzoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0W10gPSB7CisJIlRlc3QgbWVzc2FnZSAxIiwKKwkiVGVzdCBtZXNzYWdlIDIiLAorICAgIDAKK307CisKK3N0cnVjdCBlcnJvcl90YWJsZSB7CisgICAgY2hhciBjb25zdCAqIGNvbnN0ICogbXNnczsKKyAgICBsb25nIGJhc2U7CisgICAgaW50IG5fbXNnczsKK307CitzdHJ1Y3QgZXRfbGlzdCB7CisgICAgc3RydWN0IGV0X2xpc3QgKm5leHQ7CisgICAgY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlICogdGFibGU7Cit9OworZXh0ZXJuIHN0cnVjdCBldF9saXN0ICpfZXRfbGlzdDsKKworY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlIGV0X2gzdGVzdF9lcnJvcl90YWJsZSA9IHsgdGV4dCwgNDM3ODc1MjBMLCAyIH07CisKK3N0YXRpYyBzdHJ1Y3QgZXRfbGlzdCBsaW5rID0geyAwLCAwIH07CisKK3ZvaWQgaW5pdGlhbGl6ZV9oM3Rlc3RfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QpOwordm9pZCBpbml0aWFsaXplX2gzdGVzdF9lcnJvcl90YWJsZSh2b2lkKTsKKwordm9pZCBpbml0aWFsaXplX2gzdGVzdF9lcnJvcl90YWJsZSh2b2lkKSB7CisgICAgaW5pdGlhbGl6ZV9oM3Rlc3RfZXJyb3JfdGFibGVfcigmX2V0X2xpc3QpOworfQorCisvKiBGb3IgSGVpbWRhbCBjb21wYXRpYmlsaXR5ICovCit2b2lkIGluaXRpYWxpemVfaDN0ZXN0X2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KQoreworICAgIHN0cnVjdCBldF9saXN0ICpldCwgKiplbmQ7CisKKyAgICBmb3IgKGVuZCA9IGxpc3QsIGV0ID0gKmxpc3Q7IGV0OyBlbmQgPSAmZXQtPm5leHQsIGV0ID0gZXQtPm5leHQpCisgICAgICAgIGlmIChldC0+dGFibGUtPm1zZ3MgPT0gdGV4dCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICBldCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGV0X2xpc3QpKTsKKyAgICBpZiAoZXQgPT0gMCkgeworICAgICAgICBpZiAoIWxpbmsudGFibGUpCisgICAgICAgICAgICBldCA9ICZsaW5rOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGV0LT50YWJsZSA9ICZldF9oM3Rlc3RfZXJyb3JfdGFibGU7CisgICAgZXQtPm5leHQgPSAwOworICAgICplbmQgPSBldDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbDMuZXQgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwzLmV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmQ1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2hlaW1kYWwzLmV0CkBAIC0wLDAgKzEsNSBAQAorZXJyb3JfdGFibGUgb3ZrIGgzdGVzdAorcHJlZml4IEgzVEVTVAorZWMgVEVTVDEsCSJUZXN0IG1lc3NhZ2UgMSIKK2VjIFRFU1QyLAkiVGVzdCBtZXNzYWdlIDIiCitlbmQKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbDMuaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaGVpbWRhbDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQyY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9oZWltZGFsMy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBoZWltZGFsMy5oOgorICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG8gbm90IGVkaXQgaXQuCisgKi8KKworI2luY2x1ZGUgPGV0L2NvbV9lcnIuaD4KKworI2RlZmluZSBIM1RFU1RfVEVTVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0Mzc4NzUyMEwpCisjZGVmaW5lIEgzVEVTVF9URVNUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQzNzg3NTIxTCkKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfaDN0ZXN0X2Vycm9yX3RhYmxlOworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9oM3Rlc3RfZXJyb3JfdGFibGUodm9pZCk7CisKKy8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggSGVpbWRhbCAqLworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9oM3Rlc3RfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QpOworCisjZGVmaW5lIEVSUk9SX1RBQkxFX0JBU0VfaDN0ZXN0ICg0Mzc4NzUyMEwpCisKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMuLi4gKi8KKyNkZWZpbmUgaW5pdF9oM3Rlc3RfZXJyX3RibCBpbml0aWFsaXplX2gzdGVzdF9lcnJvcl90YWJsZQorI2RlZmluZSBoM3Rlc3RfZXJyX2Jhc2UgRVJST1JfVEFCTEVfQkFTRV9oM3Rlc3QKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaW1hcF9lcnIuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaW1hcF9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE2YWQwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9pbWFwX2Vyci5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBpbWFwX2Vyci5jOgorICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG8gbm90IGVkaXQgaXQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRbXSA9IHsKKwkgICAiU3lzdGVtIEkvTyBlcnJvciIsCisJICAgIlBlcm1pc3Npb24gZGVuaWVkIiwKKwkgICAiT3ZlciBxdW90YSIsCisJICAgIlRvbyBtYW55IHVzZXIgZmxhZ3MgaW4gbWFpbGJveCIsCisJICAgIk1haWxib3ggaGFzIGFuIGludmFsaWQgZm9ybWF0IiwKKwkgICAiT3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gbWFpbGJveCIsCisJICAgIk1haWxib3ggZG9lcyBub3QgZXhpc3QiLAorCSAgICJNYWlsYm94IGFscmVhZHkgZXhpc3RzIiwKKwkgICAiSW52YWxpZCBtYWlsYm94IG5hbWUiLAorCSAgICJNYWlsYm94IGlzIGxvY2tlZCBieSBQT1Agc2VydmVyIiwKKwkgICAiVW5rbm93bi9pbnZhbGlkIHBhcnRpdGlvbiIsCisJICAgIkludmFsaWQgaWRlbnRpZmllciIsCisJICAgIk1lc3NhZ2UgY29udGFpbnMgTlVMIGNoYXJhY3RlcnMiLAorCSAgICJNZXNzYWdlIGNvbnRhaW5zIGJhcmUgbmV3bGluZXMiLAorCSAgICJNZXNzYWdlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGhlYWRlcnMiLAorCSAgICJNZXNzYWdlIGNvbnRhaW5zIGludmFsaWQgaGVhZGVyIiwKKwkgICAiTWVzc2FnZSBoYXMgbm8gaGVhZGVyL2JvZHkgc2VwYXJhdG9yIiwKKwkgICAiUXVvdGEgcm9vdCBkb2VzIG5vdCBleGlzdCIsCisJICAgIlVucmVjb2duaXplZCBjaGFyYWN0ZXIgc2V0IiwKKwkgICAiSW52YWxpZCB1c2VyIiwKKwkgICAiTG9naW4gaW5jb3JyZWN0IiwKKwkgICAiQW5vbnltb3VzIGxvZ2luIGlzIG5vdCBwZXJtaXR0ZWQiLAorCSAgICJVbnN1cHBvcnRlZCBxdW90YSByZXNvdXJjZSIsCisJICAgIk1haWxib3ggaXMgb3ZlciBxdW90YSIsCisJICAgIk1haWxib3ggaXMgYXQgJWQlJSBvZiBxdW90YSIsCisJICAgIk1lc3NhZ2UgJWQgbm8gbG9uZ2VyIGV4aXN0cyIsCisJICAgIlVuYWJsZSB0byBjaGVja3BvaW50IFxcU2VlbiBzdGF0ZSIsCisJICAgIlVuYWJsZSB0byBwcmVzZXJ2ZSBcXFNlZW4gc3RhdGUiLAorCSAgICJMT0dPVVQgcmVjZWl2ZWQiLAorCSAgICJDb21wbGV0ZWQiLAorICAgIDAKK307CisKK3N0cnVjdCBlcnJvcl90YWJsZSB7CisgICAgY2hhciBjb25zdCAqIGNvbnN0ICogbXNnczsKKyAgICBsb25nIGJhc2U7CisgICAgaW50IG5fbXNnczsKK307CitzdHJ1Y3QgZXRfbGlzdCB7CisgICAgc3RydWN0IGV0X2xpc3QgKm5leHQ7CisgICAgY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlICogdGFibGU7Cit9OworZXh0ZXJuIHN0cnVjdCBldF9saXN0ICpfZXRfbGlzdDsKKworY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlIGV0X2ltYXBfZXJyb3JfdGFibGUgPSB7IHRleHQsIC0xOTA0ODA5NDcyTCwgMzAgfTsKKworc3RhdGljIHN0cnVjdCBldF9saXN0IGxpbmsgPSB7IDAsIDAgfTsKKwordm9pZCBpbml0aWFsaXplX2ltYXBfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QpOwordm9pZCBpbml0aWFsaXplX2ltYXBfZXJyb3JfdGFibGUodm9pZCk7CisKK3ZvaWQgaW5pdGlhbGl6ZV9pbWFwX2Vycm9yX3RhYmxlKHZvaWQpIHsKKyAgICBpbml0aWFsaXplX2ltYXBfZXJyb3JfdGFibGVfcigmX2V0X2xpc3QpOworfQorCisvKiBGb3IgSGVpbWRhbCBjb21wYXRpYmlsaXR5ICovCit2b2lkIGluaXRpYWxpemVfaW1hcF9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCkKK3sKKyAgICBzdHJ1Y3QgZXRfbGlzdCAqZXQsICoqZW5kOworCisgICAgZm9yIChlbmQgPSBsaXN0LCBldCA9ICpsaXN0OyBldDsgZW5kID0gJmV0LT5uZXh0LCBldCA9IGV0LT5uZXh0KQorICAgICAgICBpZiAoZXQtPnRhYmxlLT5tc2dzID09IHRleHQpCisgICAgICAgICAgICByZXR1cm47CisgICAgZXQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBldF9saXN0KSk7CisgICAgaWYgKGV0ID09IDApIHsKKyAgICAgICAgaWYgKCFsaW5rLnRhYmxlKQorICAgICAgICAgICAgZXQgPSAmbGluazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBldC0+dGFibGUgPSAmZXRfaW1hcF9lcnJvcl90YWJsZTsKKyAgICBldC0+bmV4dCA9IDA7CisgICAgKmVuZCA9IGV0OworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9pbWFwX2Vyci5ldCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaW1hcF9lcnIuZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmNWJiYwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaW1hcF9lcnIuZXQKQEAgLTAsMCArMSwxMjcgQEAKKyMgaW1hcF9lcnIuZXQgLS0gRXJyb3IgY29kZXMgZm9yIEN5cnVzIElNQVAgc2VydmVyIHByb2dyYW1zCisjCisjIENvcHlyaWdodCAxOTk4IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisjIAorIyBObyB3YXJyYW50aWVzLCBlaXRoZXIgZXhwcmVzc2VkIG9yIGltcGxpZWQsIGFyZSBtYWRlIHJlZ2FyZGluZyB0aGUKKyMgb3BlcmF0aW9uLCB1c2UsIG9yIHJlc3VsdHMgb2YgdGhlIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkIGZvciBub24tY29tbWVyY2lhbCBwdXJwb3NlcyBvbmx5CisjIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQgaW4KKyMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorIworIyBQZXJtaXNzaW9uIGlzIGFsc28gZ3JhbnRlZCB0byBJbnRlcm5ldCBTZXJ2aWNlIFByb3ZpZGVycyBhbmQgb3RoZXJzCisjIGVudGl0aWVzIHRvIHVzZSB0aGUgc29mdHdhcmUgZm9yIGludGVybmFsIHB1cnBvc2VzLgorIworIyBUaGUgZGlzdHJpYnV0aW9uLCBtb2RpZmljYXRpb24gb3Igc2FsZSBvZiBhIHByb2R1Y3Qgd2hpY2ggdXNlcyBvciBpcworIyBiYXNlZCBvbiB0aGUgc29mdHdhcmUsIGluIHdob2xlIG9yIGluIHBhcnQsIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzIG9yCisjIGJlbmVmaXRzIHJlcXVpcmVzIHNwZWNpZmljLCBhZGRpdGlvbmFsIHBlcm1pc3Npb24gZnJvbToKKyMKKyMgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCisjICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorIyAgNTAwMCBGb3JiZXMgQXZlbnVlCisjICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAorIyAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKKyMgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKKyMgCitlcnJvcl90YWJsZSBpbWFwCisKK2VjIElNQVBfSU9FUlJPUiwKKyAgICJTeXN0ZW0gSS9PIGVycm9yIgorCitlYyBJTUFQX1BFUk1JU1NJT05fREVOSUVELAorICAgIlBlcm1pc3Npb24gZGVuaWVkIgorCitlYyBJTUFQX1FVT1RBX0VYQ0VFREVELAorICAgIk92ZXIgcXVvdGEiCisKK2VjIElNQVBfVVNFUkZMQUdfRVhIQVVTVEVELAorICAgIlRvbyBtYW55IHVzZXIgZmxhZ3MgaW4gbWFpbGJveCIKKworZWMgSU1BUF9NQUlMQk9YX0JBREZPUk1BVCwKKyAgICJNYWlsYm94IGhhcyBhbiBpbnZhbGlkIGZvcm1hdCIKKworZWMgSU1BUF9NQUlMQk9YX05PVFNVUFBPUlRFRCwKKyAgICJPcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBtYWlsYm94IgorCitlYyBJTUFQX01BSUxCT1hfTk9ORVhJU1RFTlQsCisgICAiTWFpbGJveCBkb2VzIG5vdCBleGlzdCIKKworZWMgSU1BUF9NQUlMQk9YX0VYSVNUUywKKyAgICJNYWlsYm94IGFscmVhZHkgZXhpc3RzIgorCitlYyBJTUFQX01BSUxCT1hfQkFETkFNRSwKKyAgICJJbnZhbGlkIG1haWxib3ggbmFtZSIKKworZWMgSU1BUF9NQUlMQk9YX1BPUExPQ0tFRCwKKyAgICJNYWlsYm94IGlzIGxvY2tlZCBieSBQT1Agc2VydmVyIgorCitlYyBJTUFQX1BBUlRJVElPTl9VTktOT1dOLAorICAgIlVua25vd24vaW52YWxpZCBwYXJ0aXRpb24iCisKK2VjIElNQVBfSU5WQUxJRF9JREVOVElGSUVSLAorICAgIkludmFsaWQgaWRlbnRpZmllciIKKworZWMgSU1BUF9NRVNTQUdFX0NPTlRBSU5TTlVMTCwKKyAgICJNZXNzYWdlIGNvbnRhaW5zIE5VTCBjaGFyYWN0ZXJzIgorCitlYyBJTUFQX01FU1NBR0VfQ09OVEFJTlNOTCwKKyAgICJNZXNzYWdlIGNvbnRhaW5zIGJhcmUgbmV3bGluZXMiCisKK2VjIElNQVBfTUVTU0FHRV9DT05UQUlOUzhCSVQsCisgICAiTWVzc2FnZSBjb250YWlucyBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBoZWFkZXJzIgorCitlYyBJTUFQX01FU1NBR0VfQkFESEVBREVSLAorICAgIk1lc3NhZ2UgY29udGFpbnMgaW52YWxpZCBoZWFkZXIiCisKK2VjIElNQVBfTUVTU0FHRV9OT0JMQU5LTElORSwKKyAgICJNZXNzYWdlIGhhcyBubyBoZWFkZXIvYm9keSBzZXBhcmF0b3IiCisKK2VjIElNQVBfUVVPVEFST09UX05PTkVYSVNURU5ULAorICAgIlF1b3RhIHJvb3QgZG9lcyBub3QgZXhpc3QiCisKKyMgRm9sbG93aW5nIG9ubHkgdXNlZCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgZXJyb3IgbWVzc2FnZXMKKworZWMgSU1BUF9VTlJFQ09HTklaRURfQ0hBUlNFVCwKKyAgICJVbnJlY29nbml6ZWQgY2hhcmFjdGVyIHNldCIKKworZWMgSU1BUF9JTlZBTElEX1VTRVIsCisgICAiSW52YWxpZCB1c2VyIgorCitlYyBJTUFQX0lOVkFMSURfTE9HSU4sCisgICAiTG9naW4gaW5jb3JyZWN0IgorCitlYyBJTUFQX0FOT05ZTU9VU19OT1RfUEVSTUlUVEVELAorICAgIkFub255bW91cyBsb2dpbiBpcyBub3QgcGVybWl0dGVkIgorCitlYyBJTUFQX1VOU1VQUE9SVEVEX1FVT1RBLAorICAgIlVuc3VwcG9ydGVkIHF1b3RhIHJlc291cmNlIgorCisjIEZvbGxvd2luZyB1c2VkIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiBvZiB1bnRhZ2dlZCBPSy9OTyByZXNwb25zZXMKKworZWMgSU1BUF9OT19PVkVSUVVPVEEsCisgICAiTWFpbGJveCBpcyBvdmVyIHF1b3RhIgorCitlYyBJTUFQX05PX0NMT1NFUVVPVEEsCisgICAiTWFpbGJveCBpcyBhdCAlZCUlIG9mIHF1b3RhIgorCitlYyBJTUFQX05PX01TR0dPTkUsCisgICAiTWVzc2FnZSAlZCBubyBsb25nZXIgZXhpc3RzIgorCitlYyBJTUFQX05PX0NIRUNLU0VFTiwKKyAgICJVbmFibGUgdG8gY2hlY2twb2ludCBcXFNlZW4gc3RhdGUiCisKK2VjIElNQVBfTk9fQ0hFQ0tQUkVTRVJWRSwKKyAgICJVbmFibGUgdG8gcHJlc2VydmUgXFxTZWVuIHN0YXRlIgorCisjIEZvbGxvd2luZyB1c2VkIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiBvZiB1bnRhZ2dlZCBCWUUgcmVzcG9uc2UKKworZWMgSU1BUF9CWUVfTE9HT1VULAorICAgIkxPR09VVCByZWNlaXZlZCIKKworIyBGb2xsb3dpbmcgdXNlZCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgdGFnZ2VkIE9LIHJlc3BvbnNlCisKK2VjIElNQVBfT0tfQ09NUExFVEVELAorICAgIkNvbXBsZXRlZCIKKworZW5kCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2ltYXBfZXJyLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL2ltYXBfZXJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NjRjNAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvaW1hcF9lcnIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogaW1hcF9lcnIuaDoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LgorICovCisKKyNpbmNsdWRlIDxldC9jb21fZXJyLmg+CisKKyNkZWZpbmUgSU1BUF9JT0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NzJMKQorI2RlZmluZSBJTUFQX1BFUk1JU1NJT05fREVOSUVEICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ3MUwpCisjZGVmaW5lIElNQVBfUVVPVEFfRVhDRUVERUQgICAgICAgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDcwTCkKKyNkZWZpbmUgSU1BUF9VU0VSRkxBR19FWEhBVVNURUQgICAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NjlMKQorI2RlZmluZSBJTUFQX01BSUxCT1hfQkFERk9STUFUICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ2OEwpCisjZGVmaW5lIElNQVBfTUFJTEJPWF9OT1RTVVBQT1JURUQgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDY3TCkKKyNkZWZpbmUgSU1BUF9NQUlMQk9YX05PTkVYSVNURU5UICAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NjZMKQorI2RlZmluZSBJTUFQX01BSUxCT1hfRVhJU1RTICAgICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ2NUwpCisjZGVmaW5lIElNQVBfTUFJTEJPWF9CQUROQU1FICAgICAgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDY0TCkKKyNkZWZpbmUgSU1BUF9NQUlMQk9YX1BPUExPQ0tFRCAgICAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NjNMKQorI2RlZmluZSBJTUFQX1BBUlRJVElPTl9VTktOT1dOICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ2MkwpCisjZGVmaW5lIElNQVBfSU5WQUxJRF9JREVOVElGSUVSICAgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDYxTCkKKyNkZWZpbmUgSU1BUF9NRVNTQUdFX0NPTlRBSU5TTlVMTCAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NjBMKQorI2RlZmluZSBJTUFQX01FU1NBR0VfQ09OVEFJTlNOTCAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ1OUwpCisjZGVmaW5lIElNQVBfTUVTU0FHRV9DT05UQUlOUzhCSVQgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDU4TCkKKyNkZWZpbmUgSU1BUF9NRVNTQUdFX0JBREhFQURFUiAgICAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NTdMKQorI2RlZmluZSBJTUFQX01FU1NBR0VfTk9CTEFOS0xJTkUgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ1NkwpCisjZGVmaW5lIElNQVBfUVVPVEFST09UX05PTkVYSVNURU5UICAgICAgICAgICAgICAgKC0xOTA0ODA5NDU1TCkKKyNkZWZpbmUgSU1BUF9VTlJFQ09HTklaRURfQ0hBUlNFVCAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NTRMKQorI2RlZmluZSBJTUFQX0lOVkFMSURfVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ1M0wpCisjZGVmaW5lIElNQVBfSU5WQUxJRF9MT0dJTiAgICAgICAgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDUyTCkKKyNkZWZpbmUgSU1BUF9BTk9OWU1PVVNfTk9UX1BFUk1JVFRFRCAgICAgICAgICAgICAoLTE5MDQ4MDk0NTFMKQorI2RlZmluZSBJTUFQX1VOU1VQUE9SVEVEX1FVT1RBICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ1MEwpCisjZGVmaW5lIElNQVBfTk9fT1ZFUlFVT1RBICAgICAgICAgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDQ5TCkKKyNkZWZpbmUgSU1BUF9OT19DTE9TRVFVT1RBICAgICAgICAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NDhMKQorI2RlZmluZSBJTUFQX05PX01TR0dPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ0N0wpCisjZGVmaW5lIElNQVBfTk9fQ0hFQ0tTRUVOICAgICAgICAgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDQ2TCkKKyNkZWZpbmUgSU1BUF9OT19DSEVDS1BSRVNFUlZFICAgICAgICAgICAgICAgICAgICAoLTE5MDQ4MDk0NDVMKQorI2RlZmluZSBJTUFQX0JZRV9MT0dPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTkwNDgwOTQ0NEwpCisjZGVmaW5lIElNQVBfT0tfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgKC0xOTA0ODA5NDQzTCkKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfaW1hcF9lcnJvcl90YWJsZTsKK2V4dGVybiB2b2lkIGluaXRpYWxpemVfaW1hcF9lcnJvcl90YWJsZSh2b2lkKTsKKworLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBIZWltZGFsICovCitleHRlcm4gdm9pZCBpbml0aWFsaXplX2ltYXBfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QpOworCisjZGVmaW5lIEVSUk9SX1RBQkxFX0JBU0VfaW1hcCAoLTE5MDQ4MDk0NzJMKQorCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zLi4uICovCisjZGVmaW5lIGluaXRfaW1hcF9lcnJfdGJsIGluaXRpYWxpemVfaW1hcF9lcnJvcl90YWJsZQorI2RlZmluZSBpbWFwX2Vycl9iYXNlIEVSUk9SX1RBQkxFX0JBU0VfaW1hcApkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9zaW1wbGUuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvc2ltcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MmM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvc2ltcGxlLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIHNpbXBsZS5jOgorICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG8gbm90IGVkaXQgaXQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRbXSA9IHsKKwkJCQkiQ2FuJ3QgcmVhZCB0aWNrZXQgZmlsZSIsCisJCQkJIkNhbid0IGZpbmQgdGlja2V0IG9yIFRHVCIsCisJCQkJIlRHVCBleHBpcmVkIiwKKwkJCQkiQ2FuJ3QgZGVjb2RlIGF1dGhlbnRpY2F0b3IiLAorCQkJCSJUaWNrZXQgZXhwaXJlZCIsCisJCQkJIlJlcGVhdGVkIHJlcXVlc3QiLAorCQkJCSJUaGUgdGlja2V0IGlzbid0IGZvciB1cyIsCisJCQkJIlJlcXVlc3QgaXMgaW5jb25zaXN0ZW50IiwKKwkJCQkiRGVsdGEtVCB0b28gYmlnIiwKKwkJCQkiSW5jb3JyZWN0IG5ldCBhZGRyZXNzIiwKKwkJCQkiUHJvdG9jb2wgdmVyc2lvbiBtaXNtYXRjaCIsCisJCQkJIkludmFsaWQgbWVzc2FnZSB0eXBlIiwKKwkJCQkiTWVzc2FnZSBzdHJlYW0gbW9kaWZpZWQiLAorCQkJCSJNZXNzYWdlIG91dCBvZiBvcmRlciIsCisJCQkJIlVuYXV0aG9yaXplZCByZXF1ZXN0IiwKKwkJCQkiQ3VycmVudCBwYXNzd29yZCBpcyBudWxsIiwKKwkJCQkiSW5jb3JyZWN0IGN1cnJlbnQgcGFzc3dvcmQiLAorCQkJCSJQcm90b2NvbCBlcnJvciIsCisJCQkJIkVycm9yIHJldHVybmVkIGJ5IEtEQyIsCisJCQkJIk51bGwgdGlja2V0IHJldHVybmVkIGJ5IEtEQyIsCisJCQkJIlJldHJ5IGNvdW50IGV4Y2VlZGVkIiwKKwkJCQkiQ2FuJ3Qgc2VuZCByZXF1ZXN0IiwKKyAgICAwCit9OworCitzdHJ1Y3QgZXJyb3JfdGFibGUgeworICAgIGNoYXIgY29uc3QgKiBjb25zdCAqIG1zZ3M7CisgICAgbG9uZyBiYXNlOworICAgIGludCBuX21zZ3M7Cit9Oworc3RydWN0IGV0X2xpc3QgeworICAgIHN0cnVjdCBldF9saXN0ICpuZXh0OworICAgIGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSAqIHRhYmxlOworfTsKK2V4dGVybiBzdHJ1Y3QgZXRfbGlzdCAqX2V0X2xpc3Q7CisKK2NvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSBldF9rcmJfZXJyb3JfdGFibGUgPSB7IHRleHQsIDM5NTI1Mzc2TCwgMjIgfTsKKworc3RhdGljIHN0cnVjdCBldF9saXN0IGxpbmsgPSB7IDAsIDAgfTsKKwordm9pZCBpbml0aWFsaXplX2tyYl9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCk7Cit2b2lkIGluaXRpYWxpemVfa3JiX2Vycm9yX3RhYmxlKHZvaWQpOworCit2b2lkIGluaXRpYWxpemVfa3JiX2Vycm9yX3RhYmxlKHZvaWQpIHsKKyAgICBpbml0aWFsaXplX2tyYl9lcnJvcl90YWJsZV9yKCZfZXRfbGlzdCk7Cit9CisKKy8qIEZvciBIZWltZGFsIGNvbXBhdGliaWxpdHkgKi8KK3ZvaWQgaW5pdGlhbGl6ZV9rcmJfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QpCit7CisgICAgc3RydWN0IGV0X2xpc3QgKmV0LCAqKmVuZDsKKworICAgIGZvciAoZW5kID0gbGlzdCwgZXQgPSAqbGlzdDsgZXQ7IGVuZCA9ICZldC0+bmV4dCwgZXQgPSBldC0+bmV4dCkKKyAgICAgICAgaWYgKGV0LT50YWJsZS0+bXNncyA9PSB0ZXh0KQorICAgICAgICAgICAgcmV0dXJuOworICAgIGV0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXRfbGlzdCkpOworICAgIGlmIChldCA9PSAwKSB7CisgICAgICAgIGlmICghbGluay50YWJsZSkKKyAgICAgICAgICAgIGV0ID0gJmxpbms7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXQtPnRhYmxlID0gJmV0X2tyYl9lcnJvcl90YWJsZTsKKyAgICBldC0+bmV4dCA9IDA7CisgICAgKmVuZCA9IGV0OworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9zaW1wbGUuZXQgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL3NpbXBsZS5ldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdiNzdmCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGVzdF9jYXNlcy9zaW1wbGUuZXQKQEAgLTAsMCArMSw2OSBAQAorCWVycm9yX3RhYmxlCWtyYgorCisJZXJyb3JfY29kZQlLUkJfTUtfQVBfVEtGSUwsCisJCQkiQ2FuJ3QgcmVhZCB0aWNrZXQgZmlsZSIKKworCWVjCQlLUkJfTUtfQVBfTk9US1QsCisJCQkiQ2FuJ3QgZmluZCB0aWNrZXQgb3IgVEdUIgorCisJZWMJCUtSQl9NS19BUF9UR1RFWFAsCisJCQkiVEdUIGV4cGlyZWQiCisKKwllYwkJS1JCX1JEX0FQX1VOREVDLAorCQkJIkNhbid0IGRlY29kZSBhdXRoZW50aWNhdG9yIgorCisJZWMJCUtSQl9SRF9BUF9FWFAsCisJCQkiVGlja2V0IGV4cGlyZWQiCisKKwllYwkJS1JCX1JEX0FQX1JFUEVBVCwKKwkJCSJSZXBlYXRlZCByZXF1ZXN0IgorCisJZWMJCUtSQl9SRF9BUF9OT1RfVVMsCisJCQkiVGhlIHRpY2tldCBpc24ndCBmb3IgdXMiCisKKwllYwkJS1JCX1JEX0FQX0lOQ09OLAorCQkJIlJlcXVlc3QgaXMgaW5jb25zaXN0ZW50IgorCisJZWMJCUtSQl9SRF9BUF9USU1FLAorCQkJIkRlbHRhLVQgdG9vIGJpZyIKKworCWVjCQlLUkJfUkRfQVBfQkFERCwKKwkJCSJJbmNvcnJlY3QgbmV0IGFkZHJlc3MiCisKKwllYwkJS1JCX1JEX0FQX1ZFUlNJT04sCisJCQkiUHJvdG9jb2wgdmVyc2lvbiBtaXNtYXRjaCIKKworCWVjCQlLUkJfUkRfQVBfTVNHX1RZUEUsCisJCQkiSW52YWxpZCBtZXNzYWdlIHR5cGUiCisKKwllYwkJS1JCX1JEX0FQX01PRElGSUVELAorCQkJIk1lc3NhZ2Ugc3RyZWFtIG1vZGlmaWVkIgorCisJZWMJCUtSQl9SRF9BUF9PUkRFUiwKKwkJCSJNZXNzYWdlIG91dCBvZiBvcmRlciIKKworCWVjCQlLUkJfUkRfQVBfVU5BVVRIT1IsCisJCQkiVW5hdXRob3JpemVkIHJlcXVlc3QiCisKKwllYwkJS1JCX0dUX1BXX05VTEwsCisJCQkiQ3VycmVudCBwYXNzd29yZCBpcyBudWxsIgorCisJZWMJCUtSQl9HVF9QV19CQURQVywKKwkJCSJJbmNvcnJlY3QgY3VycmVudCBwYXNzd29yZCIKKworCWVjCQlLUkJfR1RfUFdfUFJPVCwKKwkJCSJQcm90b2NvbCBlcnJvciIKKworCWVjCQlLUkJfR1RfUFdfS0RDRVJSLAorCQkJIkVycm9yIHJldHVybmVkIGJ5IEtEQyIKKworCWVjCQlLUkJfR1RfUFdfTlVMTFRLVCwKKwkJCSJOdWxsIHRpY2tldCByZXR1cm5lZCBieSBLREMiCisKKwllYwkJS1JCX1NLRENfUkVUUlksCisJCQkiUmV0cnkgY291bnQgZXhjZWVkZWQiCisKKwllYwkJS1JCX1NLRENfQ0FOVCwKKwkJCSJDYW4ndCBzZW5kIHJlcXVlc3QiCisKKwllbmQKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3Rlc3RfY2FzZXMvc2ltcGxlLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL3NpbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODAwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXN0X2Nhc2VzL3NpbXBsZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBzaW1wbGUuaDoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZDsgcGxlYXNlIGRvIG5vdCBlZGl0IGl0LgorICovCisKKyNpbmNsdWRlIDxldC9jb21fZXJyLmg+CisKKyNkZWZpbmUgS1JCX01LX0FQX1RLRklMICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzNzZMKQorI2RlZmluZSBLUkJfTUtfQVBfTk9US1QgICAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM3N0wpCisjZGVmaW5lIEtSQl9NS19BUF9UR1RFWFAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzc4TCkKKyNkZWZpbmUgS1JCX1JEX0FQX1VOREVDICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzNzlMKQorI2RlZmluZSBLUkJfUkRfQVBfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM4MEwpCisjZGVmaW5lIEtSQl9SRF9BUF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1MzgxTCkKKyNkZWZpbmUgS1JCX1JEX0FQX05PVF9VUyAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzODJMKQorI2RlZmluZSBLUkJfUkRfQVBfSU5DT04gICAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM4M0wpCisjZGVmaW5lIEtSQl9SRF9BUF9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzg0TCkKKyNkZWZpbmUgS1JCX1JEX0FQX0JBREQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzODVMKQorI2RlZmluZSBLUkJfUkRfQVBfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM4NkwpCisjZGVmaW5lIEtSQl9SRF9BUF9NU0dfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzg3TCkKKyNkZWZpbmUgS1JCX1JEX0FQX01PRElGSUVEICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzODhMKQorI2RlZmluZSBLUkJfUkRfQVBfT1JERVIgICAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM4OUwpCisjZGVmaW5lIEtSQl9SRF9BUF9VTkFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1MzkwTCkKKyNkZWZpbmUgS1JCX0dUX1BXX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzOTFMKQorI2RlZmluZSBLUkJfR1RfUFdfQkFEUFcgICAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM5MkwpCisjZGVmaW5lIEtSQl9HVF9QV19QUk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1MzkzTCkKKyNkZWZpbmUgS1JCX0dUX1BXX0tEQ0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzOTRMKQorI2RlZmluZSBLUkJfR1RfUFdfTlVMTFRLVCAgICAgICAgICAgICAgICAgICAgICAgICgzOTUyNTM5NUwpCisjZGVmaW5lIEtSQl9TS0RDX1JFVFJZICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5NTI1Mzk2TCkKKyNkZWZpbmUgS1JCX1NLRENfQ0FOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzk1MjUzOTdMKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBlcnJvcl90YWJsZSBldF9rcmJfZXJyb3JfdGFibGU7CitleHRlcm4gdm9pZCBpbml0aWFsaXplX2tyYl9lcnJvcl90YWJsZSh2b2lkKTsKKworLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBIZWltZGFsICovCitleHRlcm4gdm9pZCBpbml0aWFsaXplX2tyYl9lcnJvcl90YWJsZV9yKHN0cnVjdCBldF9saXN0ICoqbGlzdCk7CisKKyNkZWZpbmUgRVJST1JfVEFCTEVfQkFTRV9rcmIgKDM5NTI1Mzc2TCkKKworLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucy4uLiAqLworI2RlZmluZSBpbml0X2tyYl9lcnJfdGJsIGluaXRpYWxpemVfa3JiX2Vycm9yX3RhYmxlCisjZGVmaW5lIGtyYl9lcnJfYmFzZSBFUlJPUl9UQUJMRV9CQVNFX2tyYgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGV4aW5mby50ZXggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9ldC90ZXhpbmZvLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzgxNjBjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdGV4aW5mby50ZXgKQEAgLTAsMCArMSwyMDc3IEBACislJSBUZVggbWFjcm9zIHRvIGhhbmRsZSB0ZXhpbmZvIGZpbGVzCisKKyUgICBDb3B5cmlnaHQgKEMpIDE5ODUsIDE5ODYsIDE5ODggUmljaGFyZCBNLiBTdGFsbG1hbgorCislCQkgICAgICAgTk8gV0FSUkFOVFkKKworJSAgQkVDQVVTRSBUSElTIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFdFIFBST1ZJREUgQUJTT0xVVEVMWQorJU5PIFdBUlJBTlRZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIFNUQVRFIExBVy4gIEVYQ0VQVAorJVdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HLCBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQywKKyVSSUNIQVJEIE0uIFNUQUxMTUFOIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhJUyBQUk9HUkFNICJBUyBJUyIKKyVXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywKKyVCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorJUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZCislQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFCislREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IKKyVDT1JSRUNUSU9OLgorCislIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBXSUxMIFJJQ0hBUkQgTS4KKyVTVEFMTE1BTiwgVEhFIEZSRUUgU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLiwgQU5EL09SIEFOWSBPVEhFUiBQQVJUWQorJVdITyBNQVkgTU9ESUZZIEFORCBSRURJU1RSSUJVVEUgVEhJUyBQUk9HUkFNIEFTIFBFUk1JVFRFRCBCRUxPVywgQkUKKyVMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIExPU1QgUFJPRklUUywgTE9TVCBNT05JRVMsIE9SCislT1RIRVIgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFCislVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SCislREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgVEhJUkQgUEFSVElFUyBPUgorJUEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSBUSElTCislUFJPR1JBTSwgRVZFTiBJRiBZT1UgSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyVEQU1BR0VTLCBPUiBGT1IgQU5ZIENMQUlNIEJZIEFOWSBPVEhFUiBQQVJUWS4KKworJQkJR0VORVJBTCBQVUJMSUMgTElDRU5TRSBUTyBDT1BZCisKKyUgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBzb3VyY2UgZmlsZQorJWFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5CislYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYSB2YWxpZCBjb3B5cmlnaHQgbm90aWNlCislIkNvcHlyaWdodCAoQykgMTk4NiBSaWNoYXJkIE0uIFN0YWxsbWFuIjsgYW5kIGluY2x1ZGUKKyVmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBhYm92ZSBkaXNjbGFpbWVyCislb2Ygd2FycmFudHkgYW5kIG9mIHRoaXMgTGljZW5zZS4KKworJSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGlzIHNvdXJjZSBmaWxlIG9yCislYW55IHBvcnRpb24gb2YgaXQsIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyB1bmRlcgorJXRoZSB0ZXJtcyBvZiBQYXJhZ3JhcGggMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyB0aGUgZm9sbG93aW5nOgorCislICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCislICAgIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlOyBhbmQKKworJSAgICBiKSBjYXVzZSB0aGUgd2hvbGUgb2YgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLAorJSAgICB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgYSBkZXJpdmF0aXZlIG9mIHRoaXMKKyUgICAgcHJvZ3JhbSBvciBhbnkgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhdCBubyBjaGFyZ2UgdG8gYWxsCislICAgIHRoaXJkIHBhcnRpZXMgb24gdGVybXMgaWRlbnRpY2FsIHRvIHRob3NlIGNvbnRhaW5lZCBpbiB0aGlzCislICAgIExpY2Vuc2UgQWdyZWVtZW50IChleGNlcHQgdGhhdCB5b3UgbWF5IGNob29zZSB0byBncmFudCBtb3JlIGV4dGVuc2l2ZQorJSAgICB3YXJyYW50eSBwcm90ZWN0aW9uIHRvIHNvbWUgb3IgYWxsIHRoaXJkIHBhcnRpZXMsIGF0IHlvdXIgb3B0aW9uKS4KKworJSAgICBjKSBZb3UgbWF5IGNoYXJnZSBhIGRpc3RyaWJ1dGlvbiBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YKKyUgICAgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkKKyUgICAgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyVNZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgdW5yZWxhdGVkIHByb2dyYW0gd2l0aCB0aGlzIHByb2dyYW0gKG9yIGl0cworJWRlcml2YXRpdmUpIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nCisldGhlIG90aGVyIHByb2dyYW0gdW5kZXIgdGhlIHNjb3BlIG9mIHRoZXNlIHRlcm1zLgorCislICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBwcm9ncmFtIChvciBhIHBvcnRpb24gb3IgZGVyaXZhdGl2ZQorJW9mIGl0LCB1bmRlciBQYXJhZ3JhcGggMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcworJW9mIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCislICAgIGEpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyUgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCislICAgIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZTsgb3IsCisKKyUgICAgYikgYWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyUgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5IGZyZWUgKGV4Y2VwdCBmb3IgYSBub21pbmFsCislICAgIHNoaXBwaW5nIGNoYXJnZSkgYSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCislICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorJSAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLAorCislICAgIGMpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gd2hlcmUgdGhlCislICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyUgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyUgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIGFsb25lLikKKworJUZvciBhbiBleGVjdXRhYmxlIGZpbGUsIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yCislYWxsIG1vZHVsZXMgaXQgY29udGFpbnM7IGJ1dCwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaXQgbmVlZCBub3QgaW5jbHVkZQorJXNvdXJjZSBjb2RlIGZvciBtb2R1bGVzIHdoaWNoIGFyZSBzdGFuZGFyZCBsaWJyYXJpZXMgdGhhdCBhY2NvbXBhbnkgdGhlCislb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBmaWxlIHJ1bnMuCisKKyUgIDQuIFlvdSBtYXkgbm90IGNvcHksIHN1YmxpY2Vuc2UsIGRpc3RyaWJ1dGUgb3IgdHJhbnNmZXIgdGhpcyBwcm9ncmFtCislZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgQW55IGF0dGVtcHQKKyVvdGhlcndpc2UgdG8gY29weSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2ZlciB0aGlzIHByb2dyYW0gaXMgdm9pZCBhbmQKKyV5b3VyIHJpZ2h0cyB0byB1c2UgdGhlIHByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIGFncmVlbWVudCBzaGFsbCBiZQorJWF1dG9tYXRpY2FsbHkgdGVybWluYXRlZC4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29tcHV0ZXIKKyVzb2Z0d2FyZSBwcm9ncmFtcyBmcm9tIHlvdSB3aXRoIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgd2lsbCBub3QgaGF2ZQorJXRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworJSAgNS4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhpcyBwcm9ncmFtIGludG8gb3RoZXIgZnJlZQorJXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBGcmVlCislU29mdHdhcmUgRm91bmRhdGlvbiBhdCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzkuICBXZSBoYXZlIG5vdCB5ZXQKKyV3b3JrZWQgb3V0IGEgc2ltcGxlIHJ1bGUgdGhhdCBjYW4gYmUgc3RhdGVkIGhlcmUsIGJ1dCB3ZSB3aWxsIG9mdGVuIHBlcm1pdAorJXRoaXMuICBXZSB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mCislYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mCislc29mdHdhcmUuCisKKyVJbiBvdGhlciB3b3JkcywgeW91IGFyZSB3ZWxjb21lIHRvIHVzZSwgc2hhcmUgYW5kIGltcHJvdmUgdGhpcyBwcm9ncmFtLgorJVlvdSBhcmUgZm9yYmlkZGVuIHRvIGZvcmJpZCBhbnlvbmUgZWxzZSB0byB1c2UsIHNoYXJlIGFuZCBpbXByb3ZlCisld2hhdCB5b3UgZ2l2ZSB0aGVtLiAgIEhlbHAgc3RhbXAgb3V0IHNvZnR3YXJlLWhvYXJkaW5nIQorCitcZGVmXHRleGluZm92ZXJzaW9uezEuMTh9CitcbWVzc2FnZXtMb2FkaW5nIHRleGluZm8gcGFja2FnZSBbVmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dOn0KK1xtZXNzYWdle30KKworJSBTYXZlIHNvbWUgcGFydHMgb2YgcGxhaW4gdGV4IHdob3NlIG5hbWVzIHdlIHdpbGwgcmVkZWZpbmUuCisKK1xsZXRccHRleGxicmFjZT1ceworXGxldFxwdGV4cmJyYWNlPVx9CitcbGV0XHB0ZXhkb3Q9XC4KK1xsZXRccHRleHN0YXI9XCoKK1xsZXRccHRleGVuZD1cZW5kCitcbGV0XHB0ZXhidWxsZXQ9XGJ1bGxldAorXGxldFxwdGV4Yj1cYgorXGxldFxwdGV4Yz1cYworXGxldFxwdGV4aT1caQorXGxldFxwdGV4dD1cdAorXGxldFxwdGV4bD1cbAorXGxldFxwdGV4TD1cTAorCitcZGVmXHRpZXtccGVuYWx0eSAxMDAwMFwgfSAgICAgJSBTYXZlIHBsYWluIHRleCBkZWZpbml0aW9uIG9mIH4uCisKK1xtZXNzYWdle0Jhc2ljcyx9CitcY2hhcmRlZlxvdGhlcj0xMgorCitcaHlwaGVuYXRpb257YXAtcGVuLWRpeH0KK1xoeXBoZW5hdGlvbnttaW5pLWJ1Zi1mZXIgbWluaS1idWYtZmVyc30KK1xoeXBoZW5hdGlvbntlc2hlbGx9CisKKyUgTWFyZ2luIHRvIGFkZCB0byByaWdodCBvZiBldmVuIHBhZ2VzLCB0byBsZWZ0IG9mIG9kZCBwYWdlcy4KK1xuZXdkaW1lbiBcYmluZGluZ29mZnNldCAgXGJpbmRpbmdvZmZzZXQ9MHB0CitcbmV3ZGltZW4gXG5vcm1hbG9mZnNldCAgIFxub3JtYWxvZmZzZXQ9XGhvZmZzZXQKK1xuZXdkaW1lblxwYWdld2lkdGggXG5ld2RpbWVuXHBhZ2VoZWlnaHQKK1xwYWdld2lkdGg9XGhzaXplIFxwYWdlaGVpZ2h0PVx2c2l6ZQorCislLS0tLS0tLS0tLS0tLS0tLS0tLS0tQmVnaW4gY2hhbmdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUKKyUgRGltZW5zaW9ucyB0byBhZGQgY3JvcG1hcmtzIGF0IGNvcm5lcnMgQWRkZWQgYnkgUC4gQS4gTWFjS2F5LCAxMiBOb3YuIDE5ODYKKyUKK1xuZXdkaW1lblxjb3JuZXJsb25nIFxuZXdkaW1lblxjb3JuZXJ0aGljaworXG5ld2RpbWVuIFx0b3BhbmRib3R0b21tYXJnaW4KK1xuZXdkaW1lbiBcb3V0ZXJoc2l6ZSBcbmV3ZGltZW4gXG91dGVydnNpemUKK1xjb3JuZXJsb25nPTFwY1xjb3JuZXJ0aGljaz0uM3B0CSUgVGhlc2Ugc2V0IHNpemUgb2YgY3JvcG1hcmtzCitcb3V0ZXJoc2l6ZT03aW4KK1xvdXRlcnZzaXplPTkuNWluCitcdG9wYW5kYm90dG9tbWFyZ2luPS43NWluCislCislLS0tLS0tLS0tLS0tLS0tLS0tLS0tRW5kIGNoYW5nZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyUgXG9uZXBhZ2VvdXQgdGFrZXMgYSB2Ym94IGFzIGFuIGFyZ3VtZW50LiAgTm90ZSB0aGF0IFxwYWdlY29udGVudHMKKyUgZG9lcyBpbnNlcnRpb25zIGl0c2VsZiwgYnV0IHlvdSBoYXZlIHRvIGNhbGwgaXQgeW91cnNlbGYuCitcY2hhcmRlZlxQQUdFPTI1NSAgXG91dHB1dD17XG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xQQUdFfX0KK1xkZWZcb25lcGFnZW91dCMxe1xob2Zmc2V0PVxub3JtYWxvZmZzZXQKK1xpZm9kZFxwYWdlbm8gIFxhZHZhbmNlXGhvZmZzZXQgYnkgXGJpbmRpbmdvZmZzZXQKK1xlbHNlIFxhZHZhbmNlXGhvZmZzZXQgYnkgLVxiaW5kaW5nb2Zmc2V0XGZpCitcc2hpcG91dFx2Ym94e3tcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2VoZWFkbGluZX0gXHBhZ2Vib2R5eyMxfSUKKyB7XGxldFxoc2l6ZT1ccGFnZXdpZHRoIFxtYWtlZm9vdGxpbmV9fQorXGFkdmFuY2VwYWdlbm8gXGlmbnVtXG91dHB1dHBlbmFsdHk+LTIwMDAwIFxlbHNlXGRvc3VwZXJlamVjdFxmaX0KKworCislIEhlcmUgaXMgYSBtb2RpZmljYXRpb24gb2YgdGhlIG1haW4gb3V0cHV0IHJvdXRpbmUgZm9yIE5lYXIgRWFzdCBQdWJsaWNhdGlvbnMKKyUgVGhpcyBwcm92aWRlcyByaWdodC1hbmdsZSBjcm9wbWFya3MgYXQgYWxsIGZvdXIgY29ybmVycy4KKyUgVGhlIGNvbnRlbnRzIG9mIHRoZSBwYWdlIGFyZSBjZW50ZXJsaW5lZCBpbnRvIHRoZSBjcm9wbWFya3MsCislIGFuZCBhbnkgZGVzaXJlZCBiaW5kaW5nIG9mZnNldCBpcyBhZGRlZCBhcyBhbiBcaHNraXAgb24gZWl0aGVyCislIHNpdGUgb2YgdGhlIGNlbnRlcmxpbmVkIGJveC4gIChQLiBBLiBNYWNLYXksIDEyIE5vdmVtYmVyLCAxOTg2KQorJQorXGRlZlxjcm9wcGFnZW91dCMxe1xob2Zmc2V0PTBwdCAlIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgbWVzcyB0aGluZ3MgdXAKKwkJIFxzaGlwb3V0CisJCSBcdmJveCB0byBcb3V0ZXJ2c2l6ZXtcaHNpemU9XG91dGVyaHNpemUKKyAgICAgICAgICAgICAgICAgXHZib3h7XGxpbmV7XGV3dG9wXGhmaWxsXGV3dG9wfX0KKyAgICAgICAgICAgICAgICAgXG5vaW50ZXJsaW5lc2tpcAorICAgICAgICAgICAgICAgICBcbGluZXtcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnN0b3B9CisgICAgICAgICAgICAgICAgICAgICAgIFxoZmlsbAorICAgICAgICAgICAgICAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zdG9wfX0KKyAgICAgICAgICAgICAgICAgXHZza2lwIFx0b3BhbmRib3R0b21tYXJnaW4KKyAgICAgICAgICAgICAgICAgXGNlbnRlcmxpbmV7XGlmb2RkXHBhZ2Vub1xoc2tpcFxiaW5kaW5nb2Zmc2V0XGZpCisJCQlcdmJveHsKKwkJCXtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2VoZWFkbGluZX0KKwkJCVxwYWdlYm9keXsjMX0KKwkJCXtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2Vmb290bGluZX19CisJCQlcaWZvZGRccGFnZW5vXGVsc2VcaHNraXBcYmluZGluZ29mZnNldFxmaX0KKwkJIFx2c2tpcCBcdG9wYW5kYm90dG9tbWFyZ2luIHBsdXMxZmlsbCBtaW51czFmaWxsCisgICAgICAgICAgICAgICAgIFxib3htYXhkZXB0aFxjb3JuZXJ0aGljaworICAgICAgICAgICAgICAgICBcbGluZXtcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnNib3R9CisgICAgICAgICAgICAgICAgICAgICAgIFxoZmlsbAorICAgICAgICAgICAgICAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zYm90fX0KKyAgICAgICAgICAgICAgICAgXG5vaW50ZXJsaW5lc2tpcAorICAgICAgICAgICAgICAgICBcdmJveHtcbGluZXtcZXdib3RcaGZpbGxcZXdib3R9fQorCX0KKyAgXGFkdmFuY2VwYWdlbm8gCisgIFxpZm51bVxvdXRwdXRwZW5hbHR5Pi0yMDAwMCBcZWxzZVxkb3N1cGVyZWplY3RcZml9CislCislIERvIEBjcm9wbWFya3MgdG8gZ2V0IGNyb3AgbWFya3MKK1xkZWZcY3JvcG1hcmtze1xsZXRcb25lcGFnZW91dD1cY3JvcHBhZ2VvdXQgfQorCitcZGVmXHBhZ2Vib2R5IzF7XHZib3ggdG9ccGFnZWhlaWdodHtcYm94bWF4ZGVwdGg9XG1heGRlcHRoICMxfX0KK3tcY2F0Y29kZWBcQCA9MTEKK1xnZGVmXHBhZ2Vjb250ZW50cyMxe1xpZnZvaWRcdG9waW5zXGVsc2VcdW52Ym94XHRvcGluc1xmaQorXGRpbWVuQD1cZHAjMSBcdW52Ym94IzEKK1xpZnZvaWRcZm9vdGluc1xlbHNlXHZza2lwXHNraXBcZm9vdGluc1xmb290bm90ZXJ1bGUgXHVudmJveFxmb290aW5zXGZpCitcaWZyQGdnZWRib3R0b20gXGtlcm4tXGRpbWVuQCBcdmZpbCBcZml9Cit9CisKKyUKKyUgSGVyZSBhcmUgdGhlIHJ1bGVzIGZvciB0aGUgY3JvcG1hcmtzLiAgTm90ZSB0aGF0IHRoZXkgYXJlCislIG9mZnNldCBzbyB0aGF0IHRoZSBzcGFjZSBiZXR3ZWVuIHRoZW0gaXMgdHJ1bHkgXG91dGVyaHNpemUgb3IgXG91dGVydnNpemUKKyUgKFAuIEEuIE1hY0theSwgMTIgTm92ZW1iZXIsIDE5ODYpCislCitcZGVmXGV3dG9we1x2cnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGgwcHQgd2lkdGhcY29ybmVybG9uZ30KK1xkZWZcbnN0b3B7XHZib3gKKyAge1xocnVsZSBoZWlnaHRcY29ybmVydGhpY2sgZGVwdGhcY29ybmVybG9uZyB3aWR0aFxjb3JuZXJ0aGlja319CitcZGVmXGV3Ym90e1x2cnVsZSBoZWlnaHQwcHQgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVybG9uZ30KK1xkZWZcbnNib3R7XHZib3gKKyAge1xocnVsZSBoZWlnaHRcY29ybmVybG9uZyBkZXB0aFxjb3JuZXJ0aGljayB3aWR0aFxjb3JuZXJ0aGlja319CisKKyUgUGFyc2UgYW4gYXJndW1lbnQsIHRoZW4gcGFzcyBpdCB0byAjMS4KKyUgVGhlIGFyZ3VtZW50IGNhbiBiZSBkZWxpbWl0ZWQgd2l0aCBbLi4uXSBvciB3aXRoICIuLi4iIG9yIGJyYWNlcworJSBvciBpdCBjYW4gYmUgYSB3aG9sZSBsaW5lLgorJSAjMSBzaG91bGQgYmUgYSBtYWNybyB3aGljaCBleHBlY3RzCislIGFuIG9yZGluYXJ5IHVuZGVsaW1pdGVkIFRlWCBhcmd1bWVudC4KKworXGRlZlxwYXJzZWFyZyAjMXtcbGV0XG5leHQ9IzFcYmVnaW5ncm91cFxvYmV5bGluZXNcZnV0dXJlbGV0XHRlbXBccGFyc2Vhcmd4fQorCitcZGVmXHBhcnNlYXJneHslCitcaWZ4IFxvYmV5ZWRzcGFjZVx0ZW1wIFxhZnRlcmdyb3VwXHBhcnNlYXJnZGlzY2FyZHNwYWNlIFxlbHNlJQorXGFmdGVyZ3JvdXAgXHBhcnNlYXJnbGluZSAlCitcZmkgXGVuZGdyb3VwfQorCit7XG9iZXlzcGFjZXMgJQorXGdkZWZccGFyc2VhcmdkaXNjYXJkc3BhY2Uge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xmdXR1cmVsZXRcdGVtcFxwYXJzZWFyZ3h9fQorCitcZ2RlZlxvYmV5ZWRzcGFjZXtcIH0KKworXGRlZlxwYXJzZWFyZ2xpbmV7XGJlZ2luZ3JvdXAgXG9iZXlsaW5lcyBccGFyc2VhcmdsaW5leH0KK3tcb2JleWxpbmVzICUKK1xnZGVmXHBhcnNlYXJnbGluZXggIzFeXk17XGVuZGdyb3VwIFxuZXh0IHsjMX19fQorCitcZGVmXGZsdXNoY3J7XGlmeFxwYXJcbGlzcHBhciBcZGVmXG5leHQjIzF7fVxlbHNlIFxsZXRcbmV4dD1ccmVsYXggXGZpIFxuZXh0fQorCislJSBUaGVzZSBhcmUgdXNlZCB0byBrZWVwIEBiZWdpbi9AZW5kIGxldmVscyBmcm9tIHJ1bm5pbmcgYXdheQorJSUgQ2FsbCBcaW5FTlYgd2l0aGluIGVudmlyb25tZW50cyAoYWZ0ZXIgYSBcYmVnaW5ncm91cCkKK1xuZXdpZlxpZkVOViBcRU5WZmFsc2UgXGRlZlxpbkVOVntcaWZFTlZccmVsYXhcZWxzZVxFTlZ0cnVlXGZpfQorXGRlZlxFTlZjaGVja3slCitcaWZFTlZcZXJybWVzc2FnZXtTdGlsbCB3aXRoaW4gYW4gZW52aXJvbm1lbnQuICBUeXBlIFJldHVybiB0byBjb250aW51ZS59CitcZW5kZ3JvdXBcZml9ICUgVGhpcyBpcyBub3QgcGVyZmVjdCwgYnV0IGl0IHNob3VsZCByZWR1Y2UgbG9zc2FnZQorCislIEBiZWdpbiBmb28gIGlzIHRoZSBzYW1lIGFzIEBmb28sIGZvciBub3cuCitcbmV3aGVscFxFTXNpbXBsZXtUeXBlIDxSZXR1cm4+IHRvIGNvbnRpbnVlfQorCitcb3V0ZXJcZGVmXGJlZ2lue1xwYXJzZWFyZ1xiZWdpbnh4eH0KKworXGRlZlxiZWdpbnh4eCAjMXslCitcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSAjMVxlbmRjc25hbWVccmVsYXgKK3tcZXJyaGVscD1cRU1zaW1wbGUgXGVycm1lc3NhZ2V7VW5kZWZpbmVkIGNvbW1hbmQgQGJlZ2luICMxfX1cZWxzZQorXGNzbmFtZSAjMVxlbmRjc25hbWVcZml9CisKKyUlIEBlbmQgZm9vIGV4ZWN1dGVzIHRoZSBkZWZpbml0aW9uIG9mIFxFZm9vLgorJSUgZm9vIGNhbiBiZSBkZWxpbWl0ZWQgYnkgZG91YmxlcXVvdGVzIG9yIGJyYWNrZXRzLgorCitcZGVmXGVuZHtccGFyc2VhcmdcZW5keHh4fQorCitcZGVmXGVuZHh4eCAjMXslCitcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBFIzFcZW5kY3NuYW1lXHJlbGF4CitcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSAjMVxlbmRjc25hbWVccmVsYXgKK1xlcnJtZXNzYWdle1VuZGVmaW5lZCBjb21tYW5kIEBlbmQgIzF9XGVsc2UKK1xlcnJvckV7IzF9XGZpXGZpCitcY3NuYW1lIEUjMVxlbmRjc25hbWV9CitcZGVmXGVycm9yRSMxewore1xlcnJoZWxwPVxFTXNpbXBsZSBcZXJybWVzc2FnZXtAZW5kICMxIG5vdCB3aXRoaW4gIzEgZW52aXJvbm1lbnR9fX0KKworJSBTaW5nbGUtc3BhY2luZyBpcyBkb25lIGJ5IHZhcmlvdXMgZW52aXJvbm1lbnRzLgorCitcbmV3c2tpcFxzaW5nbGVzcGFjZXNraXAgXHNpbmdsZXNwYWNlc2tpcCA9IFxiYXNlbGluZXNraXAKK1xkZWZcc2luZ2xlc3BhY2V7JQore1xhZHZhbmNlIFxiYXNlbGluZXNraXAgYnkgLVxzaW5nbGVzcGFjZXNraXAKK1xrZXJuIFxiYXNlbGluZXNraXB9JQorXGJhc2VsaW5lc2tpcD1cc2luZ2xlc3BhY2Vza2lwCit9CisKKyUlIFNpbXBsZSBzaW5nbGUtY2hhcmFjdGVyIEAgY29tbWFuZHMKKworJSBAQCBwcmludHMgYW4gQAorJSBLbHVkZ2UgdGhpcyB1bnRpbCB0aGUgZm9udHMgYXJlIHJpZ2h0IChncnIpLgorXGRlZlxAe3tcc2YgXGNoYXIgJzEwMH19CisKKyUgRGVmaW5lIEBgIGFuZCBAJyB0byBiZSB0aGUgc2FtZSBhcyBgIGFuZCAnCislIGJ1dCBzdXBwcmVzc2luZyBsaWdhdHVyZXMuCitcZGVmXGB7e2B9fQorXGRlZlwne3snfX0KKworJSBVc2VkIHRvIGdlbmVyYXRlIHF1b3RlZCBicmFjZXMuCisKK1xkZWZcbXlsYnJhY2Uge3tcdHQgXGNoYXIgJzE3M319CitcZGVmXG15cmJyYWNlIHt7XHR0IFxjaGFyICcxNzV9fQorXGxldFx7PVxteWxicmFjZQorXGxldFx9PVxteXJicmFjZQorCislIEA6IGZvcmNlcyBub3JtYWwgc2l6ZSB3aGl0ZXNwYWNlIGZvbGxvd2luZy4KK1xkZWZcOntcc3BhY2VmYWN0b3I9MTAwMCB9CisKKyUgQCogZm9yY2VzIGEgbGluZSBicmVhay4KK1xkZWZcKntcaGZpbFxicmVha30KKworJSBALiBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgcGVyaW9kLgorXGRlZlwuey5cc3BhY2VmYWN0b3I9MzAwMCB9CisKKyUgQHcgcHJldmVudHMgYSB3b3JkIGJyZWFrCitcZGVmXHcgIzF7XGhib3h7IzF9fQorCislIEBncm91cCAuLi4gQGVuZCBncm91cCAgZm9yY2VzIC4uLiB0byBiZSBhbGwgb24gb25lIHBhZ2UuCisKK1xkZWZcZ3JvdXB7XGJlZ2luZ3JvdXAlIFxpbkVOViA/Pz8KK1xkZWYgXEVncm91cHtcZWdyb3VwXGVuZGdyb3VwfQorXHZib3hcYmdyb3VwfQorCislIEBiciAgIGZvcmNlcyBwYXJhZ3JhcGggYnJlYWsKKworXGxldFxiciA9IFxwYXIKKworJSBAZG90c3t9ICBvdXRwdXQgc29tZSBkb3RzCisKK1xkZWZcZG90c3skXGxkb3RzJH0KKworJSBAcGFnZSAgICBmb3JjZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBhZ2UKKworXGRlZlxwYWdle1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KKworJSBAZXhkZW50IHRleHQuLi4uCislIG91dHB1dHMgdGV4dCBvbiBzZXBhcmF0ZSBsaW5lIGluIHJvbWFuIGZvbnQsIHN0YXJ0aW5nIGF0IHN0YW5kYXJkIHBhZ2UgbWFyZ2luCisKK1xkZWZcZXhkZW50e1xlcnJtZXNzYWdle0BleGRlbnQgaW4gZmlsbGVkIHRleHR9fQorICAlIEBsaXNwLCBldGMsIGRlZmluZSBcZXhkZW50IGxvY2FsbHkgZnJvbSBcaW50ZXJuYWxleGRlbnQKKwore1xvYmV5c3BhY2VzCitcZ2RlZlxpbnRlcm5hbGV4ZGVudHtccGFyc2VhcmdcZXhkZW50enp6fX0KKworXGRlZlxleGRlbnR6enogIzF7e1xhZHZhbmNlIFxsZWZ0c2tpcCBieSAtXGxpc3BuYXJyb3dpbmcKK1xhZHZhbmNlIFxoc2l6ZSBieSAtXGxlZnRza2lwCitcYWR2YW5jZSBcaHNpemUgYnkgLVxyaWdodHNraXAKK1xsZWZ0bGluZXt7XHJtIzF9fX19CisKKyUgQGluY2x1ZGUgZmlsZSAgICBpbnNlcnQgdGV4dCBvZiB0aGF0IGZpbGUgYXMgaW5wdXQuCisKK1xkZWZcaW5jbHVkZXtccGFyc2VhcmdcaW5jbHVkZXp6en0KK1xkZWZcaW5jbHVkZXp6eiAjMXt7XGRlZlx0aGlzZmlsZXsjMX1caW5wdXQgIzEKK319CisKK1xkZWZcdGhpc2ZpbGV7fQorCislIEBjZW50ZXIgbGluZSAgIG91dHB1dHMgdGhhdCBsaW5lLCBjZW50ZXJlZAorCitcZGVmXGNlbnRlcntccGFyc2VhcmdcY2VudGVyenp6fQorXGRlZlxjZW50ZXJ6enogIzF7e1xhZHZhbmNlXGhzaXplIGJ5IC1cbGVmdHNraXAKK1xhZHZhbmNlXGhzaXplIGJ5IC1ccmlnaHRza2lwCitcY2VudGVybGluZXsjMX19fQorCislIEBzcCBuICAgb3V0cHV0cyBuIGxpbmVzIG9mIHZlcnRpY2FsIHNwYWNlCisKK1xkZWZcc3B7XHBhcnNlYXJnXHNweHh4fQorXGRlZlxzcHh4eCAjMXtccGFyIFx2c2tpcCAjMVxiYXNlbGluZXNraXB9CisKKyUgQGNvbW1lbnQgLi4ubGluZSB3aGljaCBpcyBpZ25vcmVkLi4uCislIEBjIGlzIHRoZSBzYW1lIGFzIEBjb21tZW50CislIEBpZ25vcmUgLi4uIEBlbmQgaWdub3JlICBpcyBhbm90aGVyIHdheSB0byB3cml0ZSBhIGNvbW1lbnQKKworXGRlZlxjb21tZW50e1xwYXJzZWFyZyBcY29tbWVudHh4eH0KKworXGRlZlxjb21tZW50eHh4ICMxe30KKworXGxldFxjPVxjb21tZW50CisKK1xsb25nXGRlZlxpZ25vcmUgIzFcZW5kIGlnbm9yZXt9CisKK1xvdXRlclxkZWZcaWZzZXR7XHBhcnNlYXJnXGlmc2V0eHh4fQorCitcZGVmXGlmc2V0eHh4ICMxIzJcZW5kIGlmc2V0eyUKK1xleHBhbmRhZnRlclxpZnhcY3NuYW1lIElGIzFcZW5kY3NuYW1lXHJlbGF4IFxlbHNlICMyXGZpfQorCitcb3V0ZXJcZGVmXGlmY2xlYXJ7XHBhcnNlYXJnXGlmY2xlYXJ4eHh9CisKK1xkZWZcaWZjbGVhcnh4eCAjMSMyXGVuZCBpZmNsZWFyeyUKK1xleHBhbmRhZnRlclxpZnhcY3NuYW1lIElGIzFcZW5kY3NuYW1lXHJlbGF4ICMyXGZpfQorCislIFNvbWUgdGV4aW5mbyBjb25zdHJ1Y3RzIHRoYXQgYXJlIHRyaXZpYWwgaW4gdGV4CisKK1xkZWZcaWZ0ZXh7fQorXGRlZlxFaWZ0ZXh7fQorXGxvbmdcZGVmXGlmaW5mbyAjMVxlbmQgaWZpbmZve30KK1xsb25nXGRlZlxtZW51ICMxXGVuZCBtZW51e30KK1xkZWZcYXNpcyMxeyMxfQorCitcZGVmXG5vZGV7XHBhcnNlYXJnXG5vZGV6enp9CitcZGVmXG5vZGV6enojMXtcbm9kZXh4eCBbIzEsXX0KK1xkZWZcbm9kZXh4eFsjMSwjMl17XGdkZWZcbGFzdG5vZGV7IzF9fQorXGxldFxsYXN0bm9kZT1ccmVsYXgKKworXGRlZlxkb25vZGVyZWZ7XGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCitcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX1cZmkKK1xsZXRcbGFzdG5vZGU9XHJlbGF4fQorCitcZGVmXHVubnVtYm5vZGVyZWZ7XGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCitcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcdW5udW1ic2V0cmVme1xsYXN0bm9kZX1cZmkKK1xsZXRcbGFzdG5vZGU9XHJlbGF4fQorCitcbGV0XHJlZmlsbD1ccmVsYXgKKworXGxldFxzZXRmaWxlbmFtZT1cY29tbWVudAorCitcZGVmXGluZm9yZWYgIzF7XGluZm9yZWZ6enogIzEsLCwsKip9CitcZGVmXGluZm9yZWZ6enogIzEsIzIsIzMsIzQqKntTZWUgSW5mbyBmaWxlIFxmaWxle1xsb3Nlc3BhY2UjM3t9fSwgbm9kZSBgXGxvc2VzcGFjZSMxe30nfQorXGRlZlxsb3Nlc3BhY2UgIzF7IzF9CisKK1xtZXNzYWdle2ZvbnRzLH0KKworJSBGb250LWNoYW5nZSBjb21tYW5kcy4KKworJSUgVHJ5IG91dCBDb21wdXRlciBNb2Rlcm4gZm9udHMgYXQgXG1hZ3N0ZXBoYWxmCitcZm9udFx0ZW5ybT1jbXIxMCBzY2FsZWQgXG1hZ3N0ZXBoYWxmCitcZm9udFx0ZW50dD1jbXR0MTAgc2NhbGVkIFxtYWdzdGVwaGFsZgorJSBJbnN0ZWFkIG9mIGNtYjEwLCB5b3UgbWFueSB3YW50IHRvIHVzZSBjbWJ4MTAuCislIGNtYngxMCBpcyBhIHByZXR0aWVyIGZvbnQgb24gaXRzIG93biwgYnV0IGNtYjEwCislIGxvb2tzIGJldHRlciB3aGVuIGVtYmVkZGVkIGluIGEgbGluZSB3aXRoIGNtcjEwLgorXGZvbnRcdGVuYmY9Y21iMTAgc2NhbGVkIFxtYWdzdGVwaGFsZiAKK1xmb250XHRlbml0PWNtdGkxMCBzY2FsZWQgXG1hZ3N0ZXBoYWxmCitcZm9udFx0ZW5zbD1jbXNsMTAgc2NhbGVkIFxtYWdzdGVwaGFsZgorXGZvbnRcdGVuc2Y9Y21zczEwIHNjYWxlZCBcbWFnc3RlcGhhbGYKK1xkZWZcbGl7XHNmfQorXGZvbnRcdGVuc2M9Y21jc2MxMCBzY2FsZWQgXG1hZ3N0ZXBoYWxmCisKKyUgRm9udHMgZm9yIEBkZWZ1biwgZXRjLgorXGZvbnRcZGVmYmY9Y21ieDEwIHNjYWxlZCBcbWFnc3RlcDEgJXdhcyAxMzE0CitcbGV0XGRlZnR0PVx0ZW50dAorXGRlZlxkZntcbGV0XHR0PVxkZWZ0dCBcZGVmYmZ9CisKKyUgRm9udCBmb3IgdGl0bGUKK1xmb250XHRpdGxlcm0gPSBjbWJ4MTAgc2NhbGVkIFxtYWdzdGVwNQorCislIEZvbnRzIGZvciBpbmRpY2VzCitcZm9udFxpbmRpdD1jbXRpOSBcZm9udFxpbmRybT1jbXI5CitcZGVmXGluZGJme1xpbmRybX0gXGRlZlxpbmRzbHtcaW5kaXR9CitcZGVmXGluZGV4Zm9udHN7XGxldFxpdD1caW5kaXQgXGxldFxzbD1caW5kc2wgXGxldFxiZj1caW5kYmYgXGxldFxybT1caW5kcm19CisKKyUgRm9udHMgZm9yIGhlYWRpbmdzCitcZm9udFxjaGFwcm09Y21ieDEwIHNjYWxlZCBcbWFnc3RlcDMKK1xmb250XGNoYXBpdD1jbXRpMTAgc2NhbGVkIFxtYWdzdGVwMworXGZvbnRcY2hhcHNsPWNtc2wxMCBzY2FsZWQgXG1hZ3N0ZXAzCitcZm9udFxjaGFwdHQ9Y210dDEwIHNjYWxlZCBcbWFnc3RlcDMKK1xmb250XGNoYXBzZj1jbXNzMTAgc2NhbGVkIFxtYWdzdGVwMworXGxldFxjaGFwYmY9XGNoYXBybQorCitcZm9udFxzZWNybT1jbWJ4MTAgc2NhbGVkIFxtYWdzdGVwMgorXGZvbnRcc2VjaXQ9Y210aTEwIHNjYWxlZCBcbWFnc3RlcDIKK1xmb250XHNlY3NsPWNtc2wxMCBzY2FsZWQgXG1hZ3N0ZXAyCitcZm9udFxzZWN0dD1jbXR0MTAgc2NhbGVkIFxtYWdzdGVwMgorXGZvbnRcc2Vjc2Y9Y21zczEwIHNjYWxlZCBcbWFnc3RlcDIKK1xsZXRcc2VjYmY9XHNlY3JtCisKK1xmb250XHNzZWNybT1jbWJ4MTAgc2NhbGVkIFxtYWdzdGVwMQorXGZvbnRcc3NlY2l0PWNtdGkxMCBzY2FsZWQgXG1hZ3N0ZXAxCitcZm9udFxzc2Vjc2w9Y21zbDEwIHNjYWxlZCBcbWFnc3RlcDEKK1xmb250XHNzZWN0dD1jbXR0MTAgc2NhbGVkIFxtYWdzdGVwMQorXGZvbnRcc3NlY3NmPWNtc3MxMCBzY2FsZWQgXG1hZ3N0ZXAxCitcbGV0XHNzZWNiZj1cc3NlY3JtCisKK1xkZWZcdGV4dGZvbnRze1xsZXRccm09XHRlbnJtXGxldFxpdD1cdGVuaXRcbGV0XHNsPVx0ZW5zbFxsZXRcYmY9XHRlbmJmJQorXGxldFxzYz1cdGVuc2NcbGV0XHNmPVx0ZW5zZn0KK1xkZWZcY2hhcGZvbnRze1xsZXRccm09XGNoYXBybVxsZXRcaXQ9XGNoYXBpdFxsZXRcc2w9XGNoYXBzbFxsZXRcYmY9XGNoYXBiZlxsZXRcdHQ9XGNoYXB0dFxsZXRcc2Y9XGNoYXBzZn0KK1xkZWZcc2VjZm9udHN7XGxldFxybT1cc2Vjcm1cbGV0XGl0PVxzZWNpdFxsZXRcc2w9XHNlY3NsXGxldFxiZj1cc2VjYmZcbGV0XHR0PVxzZWN0dFxsZXRcc2Y9XHNlY3NmfQorXGRlZlxzdWJzZWNmb250c3tcbGV0XHJtPVxzc2Vjcm1cbGV0XGl0PVxzc2VjaXRcbGV0XHNsPVxzc2Vjc2xcbGV0XGJmPVxzc2VjYmZcbGV0XHR0PVxzc2VjdHRcbGV0XHNmPVxzc2Vjc2Z9CislIENvdW50IGRlcHRoIGluIGZvbnQtY2hhbmdlcywgZm9yIGVycm9yIGNoZWNrcworXG5ld2NvdW50XGZvbnRkZXB0aCBcZm9udGRlcHRoPTAKKworJSUgQWRkIHNjcmliZS1saWtlIGZvbnQgZW52aXJvbm1lbnRzLCBwbHVzIEBsIGZvciBpbmxpbmUgbGlzcCAodXN1YWxseSBzYW5zCislJSBzZXJpZikgYW5kIEBpaSBmb3IgVGVYIGl0YWxpYworCitcZGVmXGkjMXt7XHNsICMxfX0KK1xsZXRcdmFyPVxpCitcbGV0XGRmbj1caQorXGxldFxlbXBoPVxpCitcbGV0XGNpdGU9XGkKKworXGRlZlxiIzF7e1xiZiAjMX19CitcbGV0XHN0cm9uZz1cYgorCitcZGVmXHQjMXt7XHR0IFxyYXdiYWNrc2xhc2ggXGZyZW5jaHNwYWNpbmcgIzF9XG51bGx9CitcbGV0XHR0Zm9udCA9IFx0CitcbGV0XGtiZD1cdAorXGxldFxjb2RlPVx0CitcZGVmXHNhbXAgIzF7YHtcdHQgXHJhd2JhY2tzbGFzaCBcZnJlbmNoc3BhY2luZyAjMX0nXG51bGx9CitcZGVmXGtleSAjMXt7XHR0IFx1cHBlcmNhc2V7IzF9fVxudWxsfQorXGRlZlxjdHJsICMxe3tcdHQgXHJhd2JhY2tzbGFzaCBcaGF0fSMxfQorCitcbGV0XGZpbGU9XHNhbXAKKworXGRlZlxsIzF7e1xsaSAjMX1cbnVsbH0KKworXGRlZlxyIzF7e1xybSAjMX19CitcZGVmXHMjMXt7XHNjICMxfX0KK1xkZWZcaWkjMXt7XGl0ICMxfX0KKworXGRlZlx0aXRsZWZvbnQjMXt7XHRpdGxlcm0gIzF9fQorCitcZGVmXHRpdGxlcGFnZXtcYmVnaW5ncm91cCBccGFyaW5kZW50PTBwdCBcaGJveHt9JQorXGxldFxvbGRwYWdlPVxwYWdlCitcZGVmXHBhZ2V7XG9sZHBhZ2UgXGhib3h7fX19CisKK1xkZWZcRXRpdGxlcGFnZXtcZW5kZ3JvdXBccGFnZVxIRUFESU5HU29ufQorCislIE1ha2UgYWx0bW9kZSBpbiBmaWxlIHByaW50IG91dCByaWdodAorCitcY2F0Y29kZSBgXF5eWz1cYWN0aXZlIFxkZWZeXlt7JFxkaWFtb25kc3VpdCR9CisKK1xtZXNzYWdle3BhZ2UgaGVhZGluZ3MsfQorCislJSUgU2V0IHVwIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzLgorCitcbGV0XHRoaXNwYWdlPVxmb2xpbworCitcbmV3dG9rcyBcZXZlbmhlYWRsaW5lICAgICUgVG9rZW4gc2VxdWVuY2UgZm9yIGhlYWRpbmcgbGluZSBvZiBldmVuIHBhZ2VzCitcbmV3dG9rcyBcb2RkaGVhZGxpbmUgICAgICUgVG9rZW4gc2VxdWVuY2UgZm9yIGhlYWRpbmcgbGluZSBvZiBvZGQgcGFnZXMKK1xuZXd0b2tzIFxldmVuZm9vdGxpbmUgICAgJSBUb2tlbiBzZXF1ZW5jZSBmb3IgZm9vdGluZyBsaW5lIG9mIGV2ZW4gcGFnZXMKK1xuZXd0b2tzIFxvZGRmb290bGluZSAgICAgJSBUb2tlbiBzZXF1ZW5jZSBmb3IgZm9vdGluZyBsaW5lIG9mIG9kZCBwYWdlcworCislIE5vdyBtYWtlIFRleCB1c2UgdGhvc2UgdmFyaWFibGVzCitcaGVhZGxpbmU9e3tcdGV4dGZvbnRzXHJtIFxpZm9kZFxwYWdlbm8gXHRoZVxvZGRoZWFkbGluZSBcZWxzZSBcdGhlXGV2ZW5oZWFkbGluZSBcZml9fQorXGZvb3RsaW5lPXt7XHRleHRmb250c1xybSBcaWZvZGRccGFnZW5vIFx0aGVcb2RkZm9vdGxpbmUgXGVsc2UgXHRoZVxldmVuZm9vdGxpbmUgXGZpfX0KKworJSBDb21tYW5kcyB0byBzZXQgdGhvc2UgdmFyaWFibGVzLgorJSBGb3IgZXhhbXBsZSwgdGhpcyBpcyB3aGF0ICBAaGVhZGluZ3Mgb24gIGRvZXMKKyUgQGV2ZW5oZWFkaW5nIEB0aGlzdGl0bGV8QHRoaXNwYWdlfEB0aGlzY2hhcHRlcgorJSBAb2RkaGVhZGluZyBAdGhpc2NoYXB0ZXJ8QHRoaXNwYWdlfEB0aGlzdGl0bGUKKyUgQGV2ZW5mb290aW5nIEB0aGlzZmlsZXx8CislIEBvZGRmb290aW5nIHx8QHRoaXNmaWxlCisKK1xkZWZcZXZlbmhlYWRpbmd7XHBhcnNlYXJnXGV2ZW5oZWFkaW5neHh4fQorXGRlZlxvZGRoZWFkaW5ne1xwYXJzZWFyZ1xvZGRoZWFkaW5neHh4fQorXGRlZlxldmVyeWhlYWRpbmd7XHBhcnNlYXJnXGV2ZXJ5aGVhZGluZ3h4eH0KKworXGRlZlxldmVuZm9vdGluZ3tccGFyc2VhcmdcZXZlbmZvb3Rpbmd4eHh9CitcZGVmXG9kZGZvb3Rpbmd7XHBhcnNlYXJnXG9kZGZvb3Rpbmd4eHh9CitcZGVmXGV2ZXJ5Zm9vdGluZ3tccGFyc2VhcmdcZXZlcnlmb290aW5neHh4fQorCit7XGNhdGNvZGVgXEA9MCAlCisKK1xnZGVmXGV2ZW5oZWFkaW5neHh4ICMxe1xldmVuaGVhZGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KK1xnZGVmXGV2ZW5oZWFkaW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQorCitcZ2RlZlxvZGRoZWFkaW5neHh4ICMxe1xvZGRoZWFkaW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQorXGdkZWZcb2RkaGVhZGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQorXGdsb2JhbFxvZGRoZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQorCitcZ2RlZlxldmVyeWhlYWRpbmd4eHggIzF7XGV2ZXJ5aGVhZGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KK1xnZGVmXGV2ZXJ5aGVhZGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQorXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQorCitcZ2RlZlxldmVuZm9vdGluZ3h4eCAjMXtcZXZlbmZvb3Rpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9CitcZ2RlZlxldmVuZm9vdGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KKworXGdkZWZcb2RkZm9vdGluZ3h4eCAjMXtcb2RkZm9vdGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KK1xnZGVmXG9kZGZvb3Rpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKK1xnbG9iYWxcb2RkZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KKworXGdkZWZcZXZlcnlmb290aW5neHh4ICMxe1xldmVyeWZvb3Rpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9CitcZ2RlZlxldmVyeWZvb3Rpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKK1xnbG9iYWxcZXZlbmZvb3RsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX0KK1xnbG9iYWxcb2RkZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KKyUKK30lIHVuYmluZCB0aGUgY2F0Y29kZSBvZiBALgorCislIEBoZWFkaW5ncyBvbiAgIHR1cm5zIHRoZW0gb24uCislIEBoZWFkaW5ncyBvZmYgIHR1cm5zIHRoZW0gb2ZmLgorJSBCeSBkZWZhdWx0LCB0aGV5IGFyZSBvZmYuCisKK1xkZWZcaGVhZGluZ3MgIzEge1xjc25hbWUgSEVBRElOR1MjMVxlbmRjc25hbWV9CisKK1xkZWZcSEVBRElOR1NvZmZ7CitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGhmaWx9IFxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcb2RkaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH19CitcSEVBRElOR1NvZmYKKyUgV2hlbiB3ZSB0dXJuIGhlYWRpbmdzIG9uLCBzZXQgdGhlIHBhZ2UgbnVtYmVyIHRvIDEsCislIFB1dCBjdXJyZW50IGZpbGUgbmFtZSBpbiBsb3dlciBsZWZ0IGNvcm5lciwKKyUgUHV0IGNoYXB0ZXIgbmFtZSBvbiBpbnNpZGUgdG9wIG9mIHJpZ2h0IGhhbmQgcGFnZXMsIGRvY3VtZW50CislIHRpdGxlIG9uIGluc2lkZSB0b3Agb2YgbGVmdCBoYW5kIHBhZ2VzLCBhbmQgcGFnZSBudW1iZXJzIG9uIG91dHNpZGUgdG9wCislIGVkZ2Ugb2YgYWxsIHBhZ2VzLgorXGRlZlxIRUFESU5HU29ueworXHBhZ2VhbGlnbm1hY3JvCitcZ2xvYmFsXHBhZ2Vubz0xCitcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorfQorCislIFN1YnJvdXRpbmVzIHVzZWQgaW4gZ2VuZXJhdGluZyBoZWFkaW5ncworJSBQcm9kdWNlcyBEYXkgTW9udGggWWVhciBzdHlsZSBvZiBvdXRwdXQuCitcZGVmXHRvZGF5e1xudW1iZXJcZGF5XHNwYWNlCitcaWZjYXNlXG1vbnRoXG9yCitKYW51YXJ5XG9yIEZlYnJ1YXJ5XG9yIE1hcmNoXG9yIEFwcmlsXG9yIE1heVxvciBKdW5lXG9yCitKdWx5XG9yIEF1Z3VzdFxvciBTZXB0ZW1iZXJcb3IgT2N0b2JlclxvciBOb3ZlbWJlclxvciBEZWNlbWJlclxmaQorXHNwYWNlXG51bWJlclx5ZWFyfQorCislIFVzZSB0aGlzIGlmIHlvdSB3YW50IHRoZSBNb250aCBEYXksIFllYXIgc3R5bGUgb2Ygb3V0cHV0LgorJVxkZWZcdG9kYXl7XGlmY2FzZVxtb250aFxvcgorJUphbnVhcnlcb3IgRmVicnVhcnlcb3IgTWFyY2hcb3IgQXByaWxcb3IgTWF5XG9yIEp1bmVcb3IKKyVKdWx5XG9yIEF1Z3VzdFxvciBTZXB0ZW1iZXJcb3IgT2N0b2JlclxvciBOb3ZlbWJlclxvciBEZWNlbWJlclxmaQorJVxzcGFjZVxudW1iZXJcZGF5LCBcbnVtYmVyXHllYXJ9CisKKyUgQHNldHRpdGxlIGxpbmUuLi4gIHNwZWNpZmllcyB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LCBmb3IgaGVhZGluZ3MKKyUgSXQgZ2VuZXJhdGVzIG5vIG91dHB1dCBvZiBpdHMgb3duCisKK1xkZWZcdGhpc3RpdGxle05vIFRpdGxlfQorXGRlZlxzZXR0aXRsZXtccGFyc2Vhcmdcc2V0dGl0bGV6enp9CitcZGVmXHNldHRpdGxlenp6ICMxe1xnZGVmXHRoaXN0aXRsZXsjMX19CisKK1xtZXNzYWdle3RhYmxlcyx9CisKKyUgVGFibGVzIC0tIEB0YWJsZSwgQGZ0YWJsZSwgQGl0ZW0oeCksIEBraXRlbSh4KSwgQHhpdGVtKHgpLgorCislIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgdGFibGUgdGV4dAorXG5ld2RpbWVuXHRhYmxlaW5kZW50IFx0YWJsZWluZGVudD0uOGluCislIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgQGl0ZW1pemUgYW5kIEBlbnVtZXJhdGUgdGV4dAorXG5ld2RpbWVuXGl0ZW1pbmRlbnQgIFxpdGVtaW5kZW50PS4zaW4KKyUgbWFyZ2luIGJldHdlZW4gZW5kIG9mIHRhYmxlIGl0ZW0gYW5kIHN0YXJ0IG9mIHRhYmxlIHRleHQuCitcbmV3ZGltZW5caXRlbW1hcmdpbiAgXGl0ZW1tYXJnaW49LjFpbgorCislIHVzZWQgaW50ZXJuYWxseSBmb3IgXGl0ZW1pbmRlbnQgbWludXMgXGl0ZW1tYXJnaW4KK1xuZXdkaW1lblxpdGVtbWF4CisKKyUgTm90ZSBAdGFibGUgYW5kIEBmdGFibGUgZGVmaW5lIEBpdGVtLCBAaXRlbXgsIGV0Yy4sIHdpdGggdGhlc2UgZGVmcy4KKyUgVGhleSBhbHNvIGRlZmluZSBcaXRlbWluZGV4CislIHRvIGluZGV4IHRoZSBpdGVtIG5hbWUgaW4gd2hhdGV2ZXIgbWFubmVyIGlzIGRlc2lyZWQgKHBlcmhhcHMgbm9uZSkuCisKK1xkZWZcaW50ZXJuYWxCaXRlbXtcc21hbGxicmVhayBccGFyc2VhcmdcaXRlbXp6en0KK1xkZWZcaW50ZXJuYWxCaXRlbXh7XHBhciBccGFyc2VhcmdcaXRlbXp6en0KKworXGRlZlxpbnRlcm5hbEJ4aXRlbSAiIzEie1xkZWZceGl0ZW1zdWJ0b3BpeHsjMX0gXHNtYWxsYnJlYWsgXHBhcnNlYXJnXHhpdGVtenp6fQorXGRlZlxpbnRlcm5hbEJ4aXRlbXggIiMxIntcZGVmXHhpdGVtc3VidG9waXh7IzF9IFxwYXIgXHBhcnNlYXJnXHhpdGVtenp6fQorCitcZGVmXGludGVybmFsQmtpdGVte1xzbWFsbGJyZWFrIFxwYXJzZWFyZ1xraXRlbXp6en0KK1xkZWZcaW50ZXJuYWxCa2l0ZW14e1xwYXIgXHBhcnNlYXJnXGtpdGVtenp6fQorCitcZGVmXGtpdGVtenp6ICMxe1xkb3N1YmluZCB7a3d9e1xjb2RleyMxfX17Zm9yIHtcYmYgXGxhc3RmdW5jdGlvbn19XGl0ZW16enogeyMxfX0KKworXGRlZlx4aXRlbXp6eiAjMXtcZG9zdWJpbmQge2t3fXtcY29kZXsjMX19e2ZvciB7XGJmIFx4aXRlbXN1YnRvcGljfX1caXRlbXp6eiB7IzF9fQorCitcZGVmXGl0ZW16enogIzF7XGJlZ2luZ3JvdXAgJQorXGFkdmFuY2UgXGhzaXplIGJ5IC1ccmlnaHRza2lwICUKK1xhZHZhbmNlIFxoc2l6ZSBieSAtXGxlZnRza2lwICUKK1xzZXRib3gwPVxoYm94e1xpdGVtZm9udHsjMX19JQorXGl0ZW1pbmRleHsjMX0lCitccGFyc2tpcD0waW4gJQorXG5vaW5kZW50ICUKK1xpZmRpbSBcd2QwPlxpdGVtbWF4ICUKK1x2YWRqdXN0e1xwZW5hbHR5IDEwMDAwfSUKK1xoYm94IHRvIFxoc2l6ZXtcaHNraXAgLVx0YWJsZWluZGVudFxib3gwXGhzc31cICUKK1xlbHNlICUKK1xoYm94IHRvIDBwdHtcaHNraXAgLVx0YWJsZWluZGVudFxib3gwXGhzc30lCitcZmkgJQorXGVuZGdyb3VwICUKK30KKworXGRlZlxpdGVte1xlcnJtZXNzYWdle0BpdGVtIHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KK1xkZWZcaXRlbXh7XGVycm1lc3NhZ2V7QGl0ZW14IHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KK1xkZWZca2l0ZW17XGVycm1lc3NhZ2V7QGtpdGVtIHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KK1xkZWZca2l0ZW14e1xlcnJtZXNzYWdle0BraXRlbXggd2hpbGUgbm90IGluIGEgdGFibGV9fQorXGRlZlx4aXRlbXtcZXJybWVzc2FnZXtAeGl0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQorXGRlZlx4aXRlbXh7XGVycm1lc3NhZ2V7QHhpdGVteCB3aGlsZSBub3QgaW4gYSB0YWJsZX19CisKKyUlIENvbnRhaW5zIGEga2x1ZGdlIHRvIGdldCBAZW5kW2Rlc2NyaXB0aW9uXSB0byB3b3JrCitcZGVmXGRlc2NyaXB0aW9ue1x0YWJsZXp7XGRvbnRpbmRleH17MX17fXt9e317fX0KKworXGRlZlx0YWJsZXtcYmVnaW5ncm91cFxpbkVOVlxvYmV5bGluZXNcb2JleXNwYWNlc1x0YWJsZXh9Cit7XG9iZXlsaW5lc1xvYmV5c3BhY2VzJQorXGdkZWZcdGFibGV4ICMxXl5NeyUKK1x0YWJsZXlcZG9udGluZGV4IzEgICAgICAgIFxlbmR0YWJsZXl9fQorCitcZGVmXGZ0YWJsZXtcYmVnaW5ncm91cFxpbkVOVlxvYmV5bGluZXNcb2JleXNwYWNlc1xmdGFibGV4fQore1xvYmV5bGluZXNcb2JleXNwYWNlcyUKK1xnZGVmXGZ0YWJsZXggIzFeXk17JQorXHRhYmxleVxmbml0ZW1pbmRleCMxICAgICAgICBcZW5kdGFibGV5fX0KKworXGRlZlxkb250aW5kZXggIzF7fQorXGRlZlxmbml0ZW1pbmRleCAjMXtcZG9pbmQge2ZufXtcY29kZXsjMX19fSUKKwore1xvYmV5c3BhY2VzICUKK1xnZGVmXHRhYmxleSMxIzIgIzMgIzQgIzUgIzYgIzdcZW5kdGFibGV5e1xlbmRncm91cCUKK1x0YWJsZXp7IzF9eyMyfXsjM317IzR9eyM1fXsjNn19fQorCitcZGVmXHRhYmxleiAjMSMyIzMjNCM1IzZ7JQorXGFib3ZlZW52YnJlYWsgJQorXGJlZ2luZ3JvdXAgJQorXGRlZlxFZGVzY3JpcHRpb257XEV0YWJsZX0lIE5lY2Nlc3Nhcnkga2x1ZGdlLgorXGxldFxpdGVtaW5kZXg9IzElCitcaWZudW0gMCMzPjAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5ICMzXG1pbCBcZmkgJQorXGlmbnVtIDAjND4wIFx0YWJsZWluZGVudD0jNFxtaWwgXGZpICUKK1xpZm51bSAwIzU+MCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5ICM1XG1pbCBcZmkgJQorXGRlZlxpdGVtZm9udHsjMn0lCitcaXRlbW1heD1cdGFibGVpbmRlbnQgJQorXGFkdmFuY2UgXGl0ZW1tYXggYnkgLVxpdGVtbWFyZ2luICUKK1xhZHZhbmNlIFxsZWZ0c2tpcCBieSBcdGFibGVpbmRlbnQgJQorXHBhcmluZGVudCA9IDBwdAorXHBhcnNraXAgPSBcc21hbGxza2lwYW1vdW50CitcaWZkaW0gXHBhcnNraXA9MHB0IFxwYXJza2lwPTJwdCBcZmklCitcZGVmXEV0YWJsZXtcZW5kZ3JhZlxlbmRncm91cFxhZnRlcmVudmJyZWFrfSUKK1xsZXRcaXRlbSA9IFxpbnRlcm5hbEJpdGVtICUKK1xsZXRcaXRlbXggPSBcaW50ZXJuYWxCaXRlbXggJQorXGxldFxraXRlbSA9IFxpbnRlcm5hbEJraXRlbSAlCitcbGV0XGtpdGVteCA9IFxpbnRlcm5hbEJraXRlbXggJQorXGxldFx4aXRlbSA9IFxpbnRlcm5hbEJ4aXRlbSAlCitcbGV0XHhpdGVteCA9IFxpbnRlcm5hbEJ4aXRlbXggJQorfQorCislIFRoaXMgaXMgdGhlIGNvdW50ZXIgdXNlZCBieSBAZW51bWVyYXRlLCB3aGljaCBpcyByZWFsbHkgQGl0ZW1pemUKKworXG5ld2NvdW50IFxpdGVtbm8KKworXGRlZlxpdGVtaXple1xwYXJzZWFyZ1xpdGVtaXplenp6fQorCitcZGVmXGl0ZW1pemV6enogIzF7XGl0ZW1pemV5IHsjMX17XEVpdGVtaXplfX0KKworXGRlZlxpdGVtaXpleSAjMSMyeyUKK1xhYm92ZWVudmJyZWFrICUKK1xiZWdpbmdyb3VwICUKK1xpdGVtbm8gPSAwICUKK1xpdGVtbWF4PVxpdGVtaW5kZW50ICUKK1xhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbiAlCitcYWR2YW5jZSBcbGVmdHNraXAgYnkgXGl0ZW1pbmRlbnQgJQorXHBhcmluZGVudCA9IDBwdAorXHBhcnNraXAgPSBcc21hbGxza2lwYW1vdW50CitcaWZkaW0gXHBhcnNraXA9MHB0IFxwYXJza2lwPTJwdCBcZmklCitcZGVmIzJ7XGVuZGdyYWZcZW5kZ3JvdXBcYWZ0ZXJlbnZicmVha30lCitcZGVmXGl0ZW1jb250ZW50c3sjMX0lCitcbGV0XGl0ZW09XGl0ZW1pemVpdGVtfQorCitcZGVmXGJ1bGxldHskXHB0ZXhidWxsZXQkfQorXGRlZlxtaW51c3skLSR9CisKK1xkZWZcZW51bWVyYXRle1xpdGVtaXpleXtcdGhlXGl0ZW1uby59XEVlbnVtZXJhdGVcZmx1c2hjcn0KKworJSBEZWZpbml0aW9uIG9mIEBpdGVtIHdoaWxlIGluc2lkZSBAaXRlbWl6ZS4KKworXGRlZlxpdGVtaXplaXRlbXslCitcYWR2YW5jZVxpdGVtbm8gYnkgMQore1xsZXRccGFyPVxlbmRncmFmIFxzbWFsbGJyZWFrfSUKK1xpZmhtb2RlIFxlcnJtZXNzYWdle1xpbiBobW9kZSBhdCBpdGVtaXplaXRlbX1cZmkKK3tccGFyc2tpcD0waW4gXGhza2lwIDBwdAorXGhib3ggdG8gMHB0e1xoc3MgXGl0ZW1jb250ZW50c1xoc2tpcCBcaXRlbW1hcmdpbn0lCitcdmFkanVzdHtccGVuYWx0eSAzMDB9fSUKK1xmbHVzaGNyfQorCitcbWVzc2FnZXtpbmRleGluZyx9CislIEluZGV4IGdlbmVyYXRpb24gZmFjaWxpdGllcworCislIERlZmluZSBcbmV3d3JpdGUgdG8gYmUgaWRlbnRpY2FsIHRvIHBsYWluIHRleCdzIFxuZXd3cml0ZQorJSBleGNlcHQgbm90IFxvdXRlciwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aGluIFxuZXdpbmRleC4KK3tcY2F0Y29kZWBcQD0xMQorXGdkZWZcbmV3d3JpdGV7XGFsbG9jQDdcd3JpdGVcY2hhcmRlZlxzaXh0QEBufX0KKworJSBcbmV3aW5kZXgge2Zvb30gZGVmaW5lcyBhbiBpbmRleCBuYW1lZCBmb28uCislIEl0IGF1dG9tYXRpY2FsbHkgZGVmaW5lcyBcZm9vaW5kZXggc3VjaCB0aGF0CislIFxmb29pbmRleCAuLi5yZXN0IG9mIGxpbmUuLi4gcHV0cyBhbiBlbnRyeSBpbiB0aGUgaW5kZXggZm9vLgorJSBJdCBhbHNvIGRlZmluZXMgXGZvb2luZGZpbGUgdG8gYmUgdGhlIG51bWJlciBvZiB0aGUgb3V0cHV0IGNoYW5uZWwgZm9yCislIHRoZSBmaWxlIHRoYXQJYWNjdW11bGF0ZXMgdGhpcyBpbmRleC4gIFRoZSBmaWxlJ3MgZXh0ZW5zaW9uIGlzIGZvby4KKyUgVGhlIG5hbWUgb2YgYW4gaW5kZXggc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiAyIGNoYXJhY3RlcnMgbG9uZworJSBmb3IgdGhlIHNha2Ugb2Ygdm1zLgorCitcZGVmXG5ld2luZGV4ICMxeworXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lJSBEZWZpbmUgbnVtYmVyIGZvciBvdXRwdXQgZmlsZQorXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEJJSBPcGVuIHRoZSBmaWxlCitcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslCSUgRGVmaW5lIFx4eHhpbmRleAorXG5vZXhwYW5kXGRvaW5kZXggeyMxfX0KK30KKworJSBAZGVmaW5kZXggZm9vICA9PSAgXG5ld2luZGV4e2Zvb30KKworXGRlZlxkZWZpbmRleHtccGFyc2VhcmdcbmV3aW5kZXh9CisKKyUgRGVmaW5lIEBkZWZjb2RlaW5kZXgsIGxpa2UgQGRlZmluZGV4IGV4Y2VwdCBwdXQgYWxsIGVudHJpZXMgaW4gQGNvZGUuCisKK1xkZWZcbmV3Y29kZWluZGV4ICMxeworXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lJSBEZWZpbmUgbnVtYmVyIGZvciBvdXRwdXQgZmlsZQorXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEJJSBPcGVuIHRoZSBmaWxlCitcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslCSUgRGVmaW5lIFx4eHhpbmRleAorXG5vZXhwYW5kXGRvY29kZWluZGV4IHsjMX19Cit9CisKK1xkZWZcZGVmY29kZWluZGV4e1xwYXJzZWFyZ1xuZXdjb2RlaW5kZXh9CisKKyUgQHN5bmluZGV4IGZvbyBiYXIgICAgbWFrZXMgaW5kZXggZm9vIGZlZWQgaW50byBpbmRleCBiYXIuCislIERvIHRoaXMgaW5zdGVhZCBvZiBAZGVmaW5kZXggZm9vIGlmIHlvdSBkb24ndCB3YW50IGl0IGFzIGEgc2VwYXJhdGUgaW5kZXguCitcZGVmXHN5bmluZGV4ICMxICMyIHslCitcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslCSUgRGVmaW5lIFx4eHhpbmRleAorXG5vZXhwYW5kXGRvaW5kZXggeyMyfX0lCit9CisKKyUgQHN5bmNvZGVpbmRleCBmb28gYmFyICAgc2ltaWxhciwgYnV0IHB1dCBhbGwgZW50cmllcyBtYWRlIGZvciBpbmRleCBmb28KKyUgaW5zaWRlIEBjb2RlLgorXGRlZlxzeW5jb2RlaW5kZXggIzEgIzIgeyUKK1xleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUJJSBEZWZpbmUgXHh4eGluZGV4Citcbm9leHBhbmRcZG9jb2RlaW5kZXggeyMyfX0lCit9CisKKyUgRGVmaW5lIFxkb2luZGV4LCB0aGUgZHJpdmVyIGZvciBhbGwgXGZvb2luZGV4IG1hY3Jvcy4KKyUgQXJndW1lbnQgIzEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsaW5nIFxmb29pbmRleCBtYWNybywKKyUgIGFuZCBpdCBpcyAiZm9vIiwgdGhlIG5hbWUgb2YgdGhlIGluZGV4LgorCislIFxkb2luZGV4IGp1c3QgdXNlcyBccGFyc2Vhcmc7IGl0IGNhbGxzIFxkb2luZCBmb3IgdGhlIGFjdHVhbCB3b3JrLgorJSBUaGlzIGlzIGJlY2F1c2UgXGRvaW5kIGlzIG1vcmUgdXNlZnVsIHRvIGNhbGwgZnJvbSBvdGhlciBtYWNyb3MuCisKKyUgVGhlcmUgaXMgYWxzbyBcZG9zdWJpbmQge2luZGV4fXt0b3BpY317c3VidG9waWN9CislIHdoaWNoIG1ha2VzIGFuIGVudHJ5IGluIGEgdHdvLWxldmVsIGluZGV4IHN1Y2ggYXMgdGhlIG9wZXJhdGlvbiBpbmRleC4KKworXGRlZlxkb2luZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVpbmRleGVyfQorXGRlZlxzaW5nbGVpbmRleGVyICMxe1xkb2luZHtcaW5kZXhuYW1lfXsjMX19CisKKyUgbGlrZSB0aGUgcHJldmlvdXMgdHdvLCBidXQgdGhleSBwdXQgQGNvZGUgYXJvdW5kIHRoZSBhcmd1bWVudC4KK1xkZWZcZG9jb2RlaW5kZXgjMXtcZWRlZlxpbmRleG5hbWV7IzF9XHBhcnNlYXJnXHNpbmdsZWNvZGVpbmRleGVyfQorXGRlZlxzaW5nbGVjb2RlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17XGNvZGV7IzF9fX0KKworXGRlZlxpbmRleGR1bW1pZXN7JQorXGRlZlxiZntccmVhbGJhY2tzbGFzaCBiZiB9JQorXGRlZlxybXtccmVhbGJhY2tzbGFzaCBybSB9JQorXGRlZlxzbHtccmVhbGJhY2tzbGFzaCBzbCB9JQorXGRlZlxkb3Rze1xyZWFsYmFja3NsYXNoIGRvdHMgfSUKK1xkZWZcY29weXJpZ2h0e1xyZWFsYmFja3NsYXNoIGNvcHlyaWdodCB9JQorfQorCislIFxpbmRleG5vZm9udHMgbm8tb3BzIGFsbCBmb250LWNoYW5nZSBjb21tYW5kcy4KKyUgVGhpcyBpcyB1c2VkIHdoZW4gb3V0cHV0dGluZyB0aGUgc3RyaW5ncyB0byBzb3J0IHRoZSBpbmRleCBieS4KK1xkZWZcaW5kZXhkdW1teWZvbnQjMXsjMX0KK1xkZWZcaW5kZXhub2ZvbnRzeyUKK1xsZXRcY29kZT1caW5kZXhkdW1teWZvbnQKK1xsZXRcc2FtcD1caW5kZXhkdW1teWZvbnQKK1xsZXRca2JkPVxpbmRleGR1bW15Zm9udAorXGxldFxrZXk9XGluZGV4ZHVtbXlmb250CitcbGV0XHZhcj1caW5kZXhkdW1teWZvbnQKK30KKworJSBUbyBkZWZpbmUgXHJlYWxiYWNrc2xhc2gsIHdlIG11c3QgbWFrZSBcIG5vdCBiZSBhbiBlc2NhcGUuCislIFdlIG11c3QgZmlyc3QgbWFrZSBhbm90aGVyIGNoYXJhY3RlciAoQCkgYW4gZXNjYXBlCislIHNvIHdlIGRvIG5vdCBiZWNvbWUgdW5hYmxlIHRvIGRvIGEgZGVmaW5pdGlvbi4KKwore1xjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9XG90aGVyCitAZ2RlZkByZWFsYmFja3NsYXNoe1x9fQorCitcbGV0XGluZGV4YmFja3NsYXNoPTAgICVvdmVycmlkZGVuIGR1cmluZyBccHJpbnRpbmRleC4KKworXGRlZlxkb2luZCAjMSMyeyUKK3tcaW5kZXhkdW1taWVzICUgTXVzdCBkbyB0aGlzIGhlcmUsIHNpbmNlIFxiZiwgZXRjIGV4cGFuZCBhdCB0aGlzIHN0YWdlCitcY291bnQxMD1cbGFzdHBlbmFsdHkgJQorXGVzY2FwZWNoYXI9YFxcJQore1xsZXRcZm9saW89MCUgRXhwYW5kIGFsbCBtYWNyb3Mgbm93IEVYQ0VQVCBcZm9saW8KK1xkZWZccmF3YmFja3NsYXNoeHh7XGluZGV4YmFja3NsYXNofSUgXGluZGV4YmFja3NsYXNoIGlzbid0IGRlZmluZWQgbm93CislIHNvIGl0IHdpbGwgYmUgb3V0cHV0IGFzIGlzOyBhbmQgaXQgd2lsbCBwcmludCBhcyBiYWNrc2xhc2ggaW4gdGhlIGluZHguCislCislIE5vdyBwcm9jZXNzIHRoZSBpbmRleC1zdHJpbmcgb25jZSwgd2l0aCBhbGwgZm9udCBjb21tYW5kcyB0dXJuZWQgb2ZmLAorJSB0byBnZXQgdGhlIHN0cmluZyB0byBzb3J0IHRoZSBpbmRleCBieS4KK3tcaW5kZXhub2ZvbnRzCitceGRlZlx0ZW1wMXsjMn0lCit9JQorJSBOb3cgcHJvZHVjZSB0aGUgY29tcGxldGUgaW5kZXggZW50cnkuICBXZSBwcm9jZXNzIHRoZSBpbmRleC1zdHJpbmcgYWdhaW4sCislIHRoaXMgdGltZSB3aXRoIGZvbnQgY29tbWFuZHMgZXhwYW5kZWQsIHRvIGdldCB3aGF0IHRvIHByaW50IGluIHRoZSBpbmRleC4KK1xlZGVmXHRlbXB7JQorXHdyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1leyUKK1xyZWFsYmFja3NsYXNoIGVudHJ5IHtcdGVtcDF9e1xmb2xpb317IzJ9fX0lCitcdGVtcCB9JQorXHBlbmFsdHlcY291bnQxMH19CisKK1xkZWZcZG9zdWJpbmQgIzEjMiMzeyUKK3tcaW5kZXhkdW1taWVzICUgTXVzdCBkbyB0aGlzIGhlcmUsIHNpbmNlIFxiZiwgZXRjIGV4cGFuZCBhdCB0aGlzIHN0YWdlCitcY291bnQxMD1cbGFzdHBlbmFsdHkgJQorXGVzY2FwZWNoYXI9YFxcJQore1xsZXRcZm9saW89MCUKK1xkZWZccmF3YmFja3NsYXNoeHh7XGluZGV4YmFja3NsYXNofSUKKyUKKyUgTm93IHByb2Nlc3MgdGhlIGluZGV4LXN0cmluZyBvbmNlLCB3aXRoIGFsbCBmb250IGNvbW1hbmRzIHR1cm5lZCBvZmYsCislIHRvIGdldCB0aGUgc3RyaW5nIHRvIHNvcnQgdGhlIGluZGV4IGJ5Lgore1xpbmRleG5vZm9udHMKK1x4ZGVmXHRlbXAxeyMyICMzfSUKK30lCislIE5vdyBwcm9kdWNlIHRoZSBjb21wbGV0ZSBpbmRleCBlbnRyeS4gIFdlIHByb2Nlc3MgdGhlIGluZGV4LXN0cmluZyBhZ2FpbiwKKyUgdGhpcyB0aW1lIHdpdGggZm9udCBjb21tYW5kcyBleHBhbmRlZCwgdG8gZ2V0IHdoYXQgdG8gcHJpbnQgaW4gdGhlIGluZGV4LgorXGVkZWZcdGVtcHslCitcd3JpdGUgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWV7JQorXHJlYWxiYWNrc2xhc2ggZW50cnkge1x0ZW1wMX17XGZvbGlvfXsjMn17IzN9fX0lCitcdGVtcCB9JQorXHBlbmFsdHlcY291bnQxMH19CisKKyUgVGhlIGluZGV4IGVudHJ5IHdyaXR0ZW4gaW4gdGhlIGZpbGUgYWN0dWFsbHkgbG9va3MgbGlrZQorJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY30KKyUgb3IKKyUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9e3N1YnRvcGljfQorJSBUaGUgdGV4aW5kZXggcHJvZ3JhbSByZWFkcyBpbiB0aGVzZSBmaWxlcyBhbmQgd3JpdGVzIGZpbGVzCislIGNvbnRhaW5pbmcgdGhlc2Uga2luZHMgb2YgbGluZXM6CislICBcaW5pdGlhbCB7Y30KKyUgICAgIGJlZm9yZSB0aGUgZmlyc3QgdG9waWMgd2hvc2UgaW5pdGlhbCBpcyBjCislICBcZW50cnkge3RvcGljfXtwYWdlbGlzdH0KKyUgICAgIGZvciBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRob3V0IHN1YnRvcGljcworJSAgXHByaW1hcnkge3RvcGljfQorJSAgICAgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYSB0b3BpYyB0aGF0IGlzIHVzZWQgd2l0aCBzdWJ0b3BpY3MKKyUgIFxzZWNvbmRhcnkge3N1YnRvcGljfXtwYWdlbGlzdH0KKyUgICAgIGZvciBlYWNoIHN1YnRvcGljLgorCislIERlZmluZSB0aGUgdXNlci1hY2Nlc3NpYmxlIGluZGV4aW5nIGNvbW1hbmRzIAorJSBAZmluZGV4LCBAdmluZGV4LCBAa2luZGV4LCBAY2luZGV4LgorCitcZGVmXGZpbmRleCB7XGZuaW5kZXh9CitcZGVmXGtpbmRleCB7XGt5aW5kZXh9CitcZGVmXGNpbmRleCB7XGNwaW5kZXh9CitcZGVmXHZpbmRleCB7XHZyaW5kZXh9CitcZGVmXHRpbmRleCB7XHRwaW5kZXh9CitcZGVmXHBpbmRleCB7XHBnaW5kZXh9CisKK1xkZWZcY2luZGV4c3ViIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcY2luZGV4c3VifQore1xvYmV5bGluZXMgJQorXGdkZWZcY2luZGV4c3ViICIjMSIgIzJeXk17XGVuZGdyb3VwICUKK1xkb3N1YmluZHtjcH17IzJ9eyMxfX19CisKKyUgRGVmaW5lIHRoZSBtYWNyb3MgdXNlZCBpbiBmb3JtYXR0aW5nIG91dHB1dCBvZiB0aGUgc29ydGVkIGluZGV4IG1hdGVyaWFsLgorCislIFRoaXMgaXMgd2hhdCB5b3UgY2FsbCB0byBjYXVzZSBhIHBhcnRpY3VsYXIgaW5kZXggdG8gZ2V0IHByaW50ZWQuCislIFdyaXRlCislIEB1bm51bWJlcmVkIEZ1bmN0aW9uIEluZGV4CislIEBwcmludGluZGV4IGZuCisKK1xkZWZccHJpbnRpbmRleHtccGFyc2VhcmdcZG9wcmludGluZGV4fQorCitcZGVmXGRvcHJpbnRpbmRleCMxe1x0ZXggJQorXGNhdGNvZGVgXCU9XG90aGVyXGNhdGNvZGVgXCY9XG90aGVyXGNhdGNvZGVgXCM9XG90aGVyCitcY2F0Y29kZWBcJD1cb3RoZXJcY2F0Y29kZWBcXz1cb3RoZXIKK1xjYXRjb2RlYFx+PVxvdGhlcgorXGRlZlxpbmRleGJhY2tzbGFzaHtccmF3YmFja3NsYXNoeHh9CitcaW5kZXhmb250c1xybSBcdG9sZXJhbmNlPTk1MDAgXGFkdmFuY2VcYmFzZWxpbmVza2lwIC0xcHQKK1xiZWdpbmRvdWJsZWNvbHVtbnMKK1xvcGVuaW4gMSBcam9ibmFtZS4jMXMKK1xpZmVvZiAxIFxlbHNlIFxjbG9zZWluIDEgXGlucHV0IFxqb2JuYW1lLiMxcworXGZpCitcZW5kZG91YmxlY29sdW1ucworXEV0ZXh9CisKKyUgVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSBzb3J0ZWQgaW5kZXggZmlsZSBpdHNlbGYuCislIENoYW5nZSB0aGVtIHRvIGNvbnRyb2wgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluZGV4LgorCislIFNhbWUgYXMgXGJpZ3NraXBhbW91bnQgZXhjZXB0IG5vIHNocmluay4KKyUgXGJhbGFuY2Vjb2x1bW5zIGdldHMgY29uZnVzZWQgaWYgdGhlcmUgaXMgYW55IHNocmluay4KK1xuZXdza2lwXGluaXRpYWxza2lwYW1vdW50IFxpbml0aWFsc2tpcGFtb3VudCAxMnB0IHBsdXM0cHQKKworXG91dGVyXGRlZlxpbml0aWFsICMxeyUKK3tcbGV0XHRlbnR0PVxzZWN0dCBcbGV0XHNmPVxzZWN0dAorXGlmZGltXGxhc3Rza2lwPFxpbml0aWFsc2tpcGFtb3VudAorXHJlbW92ZWxhc3Rza2lwIFxwZW5hbHR5LTIwMCBcdnNraXAgXGluaXRpYWxza2lwYW1vdW50XGZpCitcbGluZXtcc2VjYmYjMVxoZmlsbH1ca2VybiAycHRccGVuYWx0eTMwMDB9fQorCitcb3V0ZXJcZGVmXGVudHJ5ICMxIzJ7Cit7XHBhcmZpbGxza2lwPTBpbiBccGFyc2tpcD0waW4gXHBhcmluZGVudD0waW4KK1xoYW5naW5kZW50PTFpbiBcaGFuZ2FmdGVyPTElCitcbm9pbmRlbnRcaGJveHsjMX1cbGVhZGVyc1xEb3RzYm94XGhza2lwIDBwdCBwbHVzIDFmaWxsbCAjMlxwYXIKK319CisKK1xkZWZccHJpbWFyeSAjMXtcbGluZXsjMVxoZmlsfX0KKworXG5ld3NraXBcc2Vjb25kYXJ5aW5kZW50IFxzZWNvbmRhcnlpbmRlbnQ9MC41Y20KKworXGRlZlxzZWNvbmRhcnkgIzEjMnsKK3tccGFyZmlsbHNraXA9MGluIFxwYXJza2lwPTBpbgorXGhhbmdpbmRlbnQgPTFpbiBcaGFuZ2FmdGVyPTEKK1xub2luZGVudFxoc2tpcFxzZWNvbmRhcnlpbmRlbnRcaGJveHsjMX1cbGVhZGVyc1xEb3RzYm94XGhza2lwIDBwdCBwbHVzIDFmaWxsbCMyXHBhcgorfX0KKworJSUgRGVmaW5lIHR3by1jb2x1bW4gbW9kZSwgd2hpY2ggaXMgdXNlZCBpbiBpbmRleGVzLgorJSUgQWRhcHRlZCBmcm9tIHRoZSBUZVhCb29rLCBwYWdlIDQxNgorXGNhdGNvZGUgYFxAPTExCisKK1xuZXdib3hccGFydGlhbHBhZ2UKKworXG5ld2RpbWVuXGRvdWJsZWNvbHVtbmhzaXplICBcZG91YmxlY29sdW1uaHNpemUgPSAzLjExaW4KK1xuZXdkaW1lblxkb3VibGVjb2x1bW52c2l6ZSAgXGRvdWJsZWNvbHVtbnZzaXplID0gMTkuMWluCisKK1xkZWZcYmVnaW5kb3VibGVjb2x1bW5ze1xiZWdpbmdyb3VwCisgIFxvdXRwdXQ9e1xnbG9iYWxcc2V0Ym94XHBhcnRpYWxwYWdlPVx2Ym94e1x1bnZib3gyNTVca2VybiAtXHRvcHNraXAgXGtlcm4gXGJhc2VsaW5lc2tpcH19XGVqZWN0CisgIFxvdXRwdXQ9e1xkb3VibGVjb2x1bW5vdXR9IFxoc2l6ZT1cZG91YmxlY29sdW1uaHNpemUgXHZzaXplPVxkb3VibGVjb2x1bW52c2l6ZX0KK1xkZWZcZW5kZG91YmxlY29sdW1uc3tcb3V0cHV0PXtcYmFsYW5jZWNvbHVtbnN9XGVqZWN0CisgIFxlbmRncm91cCBccGFnZWdvYWw9XHZzaXplfQorCitcZGVmXGRvdWJsZWNvbHVtbm91dHtcc3BsaXR0b3Bza2lwPVx0b3Bza2lwIFxzcGxpdG1heGRlcHRoPVxtYXhkZXB0aAorICBcZGltZW5APVxwYWdlaGVpZ2h0IFxhZHZhbmNlXGRpbWVuQCBieS1caHRccGFydGlhbHBhZ2UKKyAgXHNldGJveDA9XHZzcGxpdDI1NSB0b1xkaW1lbkAgXHNldGJveDI9XHZzcGxpdDI1NSB0b1xkaW1lbkAKKyAgXG9uZXBhZ2VvdXRccGFnZXNvZmFyIFx1bnZib3gyNTUgXHBlbmFsdHlcb3V0cHV0cGVuYWx0eX0KK1xkZWZccGFnZXNvZmFye1x1bnZib3hccGFydGlhbHBhZ2UgJQorICBcaHNpemU9XGRvdWJsZWNvbHVtbmhzaXplICUgaGF2ZSB0byByZXN0b3JlIHRoaXMgc2luY2Ugb3V0cHV0IHJvdXRpbmUKKyUJICAgICAgY2hhbmdlcyBpdCB0byBzZXQgY3JvcG1hcmtzIChQLiBBLiBNYWNLYXksIDEyIE5vdi4gMTk4NikKKyAgXHdkMD1caHNpemUgXHdkMj1caHNpemUgXGhib3ggdG9ccGFnZXdpZHRoe1xib3gwXGhmaWxcYm94Mn19CitcZGVmXGJhbGFuY2Vjb2x1bW5ze1xzZXRib3gwPVx2Ym94e1x1bnZib3gyNTV9IFxkaW1lbkA9XGh0MAorICBcYWR2YW5jZVxkaW1lbkAgYnlcdG9wc2tpcCBcYWR2YW5jZVxkaW1lbkAgYnktXGJhc2VsaW5lc2tpcAorICBcZGl2aWRlXGRpbWVuQCBieTIgXHNwbGl0dG9wc2tpcD1cdG9wc2tpcAorICB7XHZiYWRuZXNzPTEwMDAwIFxsb29wIFxnbG9iYWxcc2V0Ym94Mz1cY29weTAKKyAgICBcZ2xvYmFsXHNldGJveDE9XHZzcGxpdDMgdG9cZGltZW5ACisgICAgXGlmZGltXGh0Mz5cZGltZW5AIFxnbG9iYWxcYWR2YW5jZVxkaW1lbkAgYnkxcHQgXHJlcGVhdH0KKyAgXHNldGJveDA9XHZib3ggdG9cZGltZW5Ae1x1bnZib3gxfSAgXHNldGJveDI9XHZib3ggdG9cZGltZW5Ae1x1bnZib3gzfQorICBccGFnZXNvZmFyfQorCitcY2F0Y29kZSBgXEA9XG90aGVyCitcbWVzc2FnZXtzZWN0aW9uaW5nLH0KKyUgRGVmaW5lIGNoYXB0ZXJzLCBzZWN0aW9ucywgZXRjLgorCitcbmV3Y291bnQgXGNoYXBubworXG5ld2NvdW50IFxzZWNubworXG5ld2NvdW50IFxzdWJzZWNubworXG5ld2NvdW50IFxzdWJzdWJzZWNubworCislIFRoaXMgY291bnRlciBpcyBmdW5ueSBzaW5jZSBpdCBjb3VudHMgdGhyb3VnaCBjaGFyY29kZXMgb2YgbGV0dGVycyBBLCBCLCAuLi4KK1xuZXdjb3VudCBcYXBwZW5kaXhubyAgXGFwcGVuZGl4bm8gPSBgXEAKK1xkZWZcYXBwZW5kaXhsZXR0ZXJ7XGNoYXJcdGhlXGFwcGVuZGl4bm99CisKK1xuZXd3cml0ZSBcY29udGVudHNmaWxlCitcb3Blbm91dCBcY29udGVudHNmaWxlID0gXGpvYm5hbWUudG9jCisKKyUgRWFjaCBAY2hhcHRlciBkZWZpbmVzIHRoaXMgYXMgdGhlIG5hbWUgb2YgdGhlIGNoYXB0ZXIuCislIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzIGNhbiB1c2UgaXQuICBAc2VjdGlvbiBkb2VzIGxpa2V3aXNlCisKK1xkZWZcdGhpc2NoYXB0ZXJ7fSBcZGVmXHRoaXNzZWN0aW9ue30KK1xkZWZcc2VjY2hlY2sjMXtcaWYgXHBhZ2VubzwwICUKK1xlcnJtZXNzYWdle0AjMSBub3QgYWxsb3dlZCBhZnRlciBnZW5lcmF0aW5nIHRhYmxlIG9mIGNvbnRlbnRzfVxmaQorJQorfQorCitcb3V0ZXJcZGVmXGNoYXB0ZXJ7XHBhcnNlYXJnXGNoYXB0ZXJ6enp9CitcZGVmXGNoYXB0ZXJ6enogIzF7XHNlY2NoZWNre2NoYXB0ZXJ9JQorXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxjaGFwbm8gYnkgMSBcbWVzc2FnZXtDaGFwdGVyIFx0aGVcY2hhcG5vfSUKK1xjaGFwbWFjcm8geyMxfXtcdGhlXGNoYXBub30lCitcZ2RlZlx0aGlzc2VjdGlvbnsjMX1cZ2RlZlx0aGlzY2hhcHRlcnsjMX0lCitcbGV0XHJhd2JhY2tzbGFzaD1ccmVsYXglCitcbGV0XGZyZW5jaHNwYWNpbmc9XHJlbGF4JQorXGVkZWZcdGVtcHt7XHJlYWxiYWNrc2xhc2ggY2hhcGVudHJ5IHsjMX17XHRoZVxjaGFwbm99e1xub2V4cGFuZFxmb2xpb319fSUKK1xlc2NhcGVjaGFyPWBcXCUKK1x3cml0ZSBcY29udGVudHNmaWxlIFx0ZW1wICAlCitcZG9ub2RlcmVmICUKK30KKworXG91dGVyXGRlZlxhcHBlbmRpeHtccGFyc2VhcmdcYXBwZW5kaXh6enp9CitcZGVmXGFwcGVuZGl4enp6ICMxe1xzZWNjaGVja3thcHBlbmRpeH0lCitcc2Vjbm89MCBcc3Vic2Vjbm89MCBcc3Vic3Vic2Vjbm89MCBcZ2xvYmFsXGFkdmFuY2UgXGFwcGVuZGl4bm8gYnkgMSBcbWVzc2FnZXtBcHBlbmRpeCBcYXBwZW5kaXhsZXR0ZXJ9JQorXGNoYXBtYWNybyB7IzF9e0FwcGVuZGl4IFxhcHBlbmRpeGxldHRlcn0lCitcZ2RlZlx0aGlzY2hhcHRlcnsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCitcbGV0XHJhd2JhY2tzbGFzaD1ccmVsYXglCitcbGV0XGZyZW5jaHNwYWNpbmc9XHJlbGF4JQorXGVkZWZcdGVtcHt7XHJlYWxiYWNrc2xhc2ggY2hhcGVudHJ5IHsjMX17QXBwZW5kaXggXGFwcGVuZGl4bGV0dGVyfXtcbm9leHBhbmRcZm9saW99fX0lCitcZXNjYXBlY2hhcj1gXFwlCitcd3JpdGUgXGNvbnRlbnRzZmlsZSBcdGVtcCAgJQorXHVubnVtYm5vZGVyZWYgJQorfQorCitcb3V0ZXJcZGVmXHVubnVtYmVyZWR7XHBhcnNlYXJnXHVubnVtYmVyZWR6enp9CitcZGVmXHVubnVtYmVyZWR6enogIzF7XHNlY2NoZWNre3VubnVtYmVyZWR9JQorXHNlY25vPTAgXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXG1lc3NhZ2V7KCMxKX0KK1x1bm51bWJjaGFwbWFjcm8geyMxfSUKK1xnZGVmXHRoaXNjaGFwdGVyeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKK1xsZXRccmF3YmFja3NsYXNoPVxyZWxheCUKK1xsZXRcZnJlbmNoc3BhY2luZz1ccmVsYXglCitcZWRlZlx0ZW1we3tccmVhbGJhY2tzbGFzaCB1bm51bWJjaGFwZW50cnkgeyMxfXtcbm9leHBhbmRcZm9saW99fX0lCitcZXNjYXBlY2hhcj1gXFwlCitcd3JpdGUgXGNvbnRlbnRzZmlsZSBcdGVtcCAgJQorXHVubnVtYm5vZGVyZWYgJQorfQorCitcb3V0ZXJcZGVmXHNlY3Rpb257XHBhcnNlYXJnXHNlY3Rpb256enp9CitcZGVmXHNlY3Rpb256enogIzF7XHNlY2NoZWNre3NlY3Rpb259JQorXHN1YnNlY25vPTAgXHN1YnN1YnNlY25vPTAgXGdsb2JhbFxhZHZhbmNlIFxzZWNubyBieSAxICUKK1xnZGVmXHRoaXNzZWN0aW9ueyMxfVxzZWNoZWFkaW5nIHsjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99JQorXGxldFxyYXdiYWNrc2xhc2g9XHJlbGF4JQorXGxldFxmcmVuY2hzcGFjaW5nPVxyZWxheCUKK1xlZGVmXHRlbXB7e1xyZWFsYmFja3NsYXNoIHNlY2VudHJ5ICUKK3sjMX17XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1xub2V4cGFuZFxmb2xpb319fSUKK1xlc2NhcGVjaGFyPWBcXCUKK1x3cml0ZSBcY29udGVudHNmaWxlIFx0ZW1wICUKK1xkb25vZGVyZWYgJQorXHBlbmFsdHkgMTAwMDAgJQorfQorCitcb3V0ZXJcZGVmXGFwcGVuZGl4c2VjdGlvbntccGFyc2VhcmdcYXBwZW5kaXhzZWN0aW9uenp6fQorXG91dGVyXGRlZlxhcHBlbmRpeHNlY3tccGFyc2VhcmdcYXBwZW5kaXhzZWN0aW9uenp6fQorXGRlZlxhcHBlbmRpeHNlY3Rpb256enogIzF7XHNlY2NoZWNre2FwcGVuZGl4c2VjdGlvbn0lCitcc3Vic2Vjbm89MCBcc3Vic3Vic2Vjbm89MCBcZ2xvYmFsXGFkdmFuY2UgXHNlY25vIGJ5IDEgJQorXGdkZWZcdGhpc3NlY3Rpb257IzF9XHNlY2hlYWRpbmcgeyMxfXtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99JQorXGxldFxyYXdiYWNrc2xhc2g9XHJlbGF4JQorXGxldFxmcmVuY2hzcGFjaW5nPVxyZWxheCUKK1xlZGVmXHRlbXB7e1xyZWFsYmFja3NsYXNoIHNlY2VudHJ5ICUKK3sjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcbm9leHBhbmRcZm9saW99fX0lCitcZXNjYXBlY2hhcj1gXFwlCitcd3JpdGUgXGNvbnRlbnRzZmlsZSBcdGVtcCAlCitcdW5udW1ibm9kZXJlZiAlCitccGVuYWx0eSAxMDAwMCAlCit9CisKK1xvdXRlclxkZWZcdW5udW1iZXJlZHNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHNlY3p6en0KK1xkZWZcdW5udW1iZXJlZHNlY3p6eiAjMXtcc2VjY2hlY2t7dW5udW1iZXJlZHNlY30lCitccGxhaW5zZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCitcbGV0XHJhd2JhY2tzbGFzaD1ccmVsYXglCitcbGV0XGZyZW5jaHNwYWNpbmc9XHJlbGF4JQorXGVkZWZcdGVtcHt7XHJlYWxiYWNrc2xhc2ggdW5udW1ic2VjZW50cnl7IzF9e1xub2V4cGFuZFxmb2xpb319fSUKK1xlc2NhcGVjaGFyPWBcXCUKK1x3cml0ZSBcY29udGVudHNmaWxlIFx0ZW1wICUKK1x1bm51bWJub2RlcmVmICUKK1xwZW5hbHR5IDEwMDAwICUKK30KKworXG91dGVyXGRlZlxzdWJzZWN0aW9ue1xwYXJzZWFyZ1xzdWJzZWN0aW9uenp6fQorXGRlZlxzdWJzZWN0aW9uenp6ICMxe1xzZWNjaGVja3tzdWJzZWN0aW9ufSUKK1xnZGVmXHRoaXNzZWN0aW9ueyMxfVxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc3Vic2Vjbm8gYnkgMSAlCitcc3Vic2VjaGVhZGluZyB7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfSUKK1xsZXRccmF3YmFja3NsYXNoPVxyZWxheCUKK1xsZXRcZnJlbmNoc3BhY2luZz1ccmVsYXglCitcZWRlZlx0ZW1we3tccmVhbGJhY2tzbGFzaCBzdWJzZWNlbnRyeSAlCit7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcbm9leHBhbmRcZm9saW99fX0lCitcZXNjYXBlY2hhcj1gXFwlCitcd3JpdGUgXGNvbnRlbnRzZmlsZSBcdGVtcCAlCitcZG9ub2RlcmVmICUKK1xwZW5hbHR5IDEwMDAwICUKK30KKworXG91dGVyXGRlZlxhcHBlbmRpeHN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzZWN6enp9CitcZGVmXGFwcGVuZGl4c3Vic2Vjenp6ICMxe1xzZWNjaGVja3thcHBlbmRpeHN1YnNlY30lCitcZ2RlZlx0aGlzc2VjdGlvbnsjMX1cc3Vic3Vic2Vjbm89MCBcZ2xvYmFsXGFkdmFuY2UgXHN1YnNlY25vIGJ5IDEgJQorXHN1YnNlY2hlYWRpbmcgeyMxfXtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99JQorXGxldFxyYXdiYWNrc2xhc2g9XHJlbGF4JQorXGxldFxmcmVuY2hzcGFjaW5nPVxyZWxheCUKK1xlZGVmXHRlbXB7e1xyZWFsYmFja3NsYXNoIHN1YnNlY2VudHJ5ICUKK3sjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcbm9leHBhbmRcZm9saW99fX0lCitcZXNjYXBlY2hhcj1gXFwlCitcd3JpdGUgXGNvbnRlbnRzZmlsZSBcdGVtcCAlCitcdW5udW1ibm9kZXJlZiAlCitccGVuYWx0eSAxMDAwMCAlCit9CisKK1xvdXRlclxkZWZcdW5udW1iZXJlZHN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnNlY3p6en0KK1xkZWZcdW5udW1iZXJlZHN1YnNlY3p6eiAjMXtcc2VjY2hlY2t7dW5udW1iZXJlZHN1YnNlY30lCitccGxhaW5zZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCitcbGV0XHJhd2JhY2tzbGFzaD1ccmVsYXglCitcbGV0XGZyZW5jaHNwYWNpbmc9XHJlbGF4JQorXGVkZWZcdGVtcHt7XHJlYWxiYWNrc2xhc2ggdW5udW1ic3Vic2VjZW50cnl7IzF9e1xub2V4cGFuZFxmb2xpb319fSUKK1xlc2NhcGVjaGFyPWBcXCUKK1x3cml0ZSBcY29udGVudHNmaWxlIFx0ZW1wICUKK1x1bm51bWJub2RlcmVmICUKK1xwZW5hbHR5IDEwMDAwICUKK30KKworXG91dGVyXGRlZlxzdWJzdWJzZWN0aW9ue1xwYXJzZWFyZ1xzdWJzdWJzZWN0aW9uenp6fQorXGRlZlxzdWJzdWJzZWN0aW9uenp6ICMxe1xzZWNjaGVja3tzdWJzdWJzZWN0aW9ufSUKK1xnZGVmXHRoaXNzZWN0aW9ueyMxfVxnbG9iYWxcYWR2YW5jZSBcc3Vic3Vic2Vjbm8gYnkgMSAlCitcc3Vic3Vic2VjaGVhZGluZyB7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfSUKK1xsZXRccmF3YmFja3NsYXNoPVxyZWxheCUKK1xsZXRcZnJlbmNoc3BhY2luZz1ccmVsYXglCitcZWRlZlx0ZW1we3tccmVhbGJhY2tzbGFzaCBzdWJzdWJzZWNlbnRyeSAlCit7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfXtcbm9leHBhbmRcZm9saW99fX0lXAorXGVzY2FwZWNoYXI9YFxcJQorXHdyaXRlIFxjb250ZW50c2ZpbGUgXHRlbXAgJQorXGRvbm9kZXJlZiAlCitccGVuYWx0eSAxMDAwMCAlCit9CisKK1xvdXRlclxkZWZcYXBwZW5kaXhzdWJzdWJzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c3Vic3Vic2Vjenp6fQorXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3p6eiAjMXtcc2VjY2hlY2t7YXBwZW5kaXhzdWJzdWJzZWN9JQorXGdkZWZcdGhpc3NlY3Rpb257IzF9XGdsb2JhbFxhZHZhbmNlIFxzdWJzdWJzZWNubyBieSAxICUKK1xzdWJzdWJzZWNoZWFkaW5nIHsjMX17XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfSUKK1xsZXRccmF3YmFja3NsYXNoPVxyZWxheCUKK1xsZXRcZnJlbmNoc3BhY2luZz1ccmVsYXglCitcZWRlZlx0ZW1we3tccmVhbGJhY2tzbGFzaCBzdWJzdWJzZWNlbnRyeXsjMX0lCit7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfXtcbm9leHBhbmRcZm9saW99fX0lXAorXGVzY2FwZWNoYXI9YFxcJQorXHdyaXRlIFxjb250ZW50c2ZpbGUgXHRlbXAgJQorXHVubnVtYm5vZGVyZWYgJQorXHBlbmFsdHkgMTAwMDAgJQorfQorCitcb3V0ZXJcZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzdWJzZWN6enp9CitcZGVmXHVubnVtYmVyZWRzdWJzdWJzZWN6enogIzF7XHNlY2NoZWNre3VubnVtYmVyZWRzdWJzdWJzZWN9JQorXHBsYWluc2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQorXGxldFxyYXdiYWNrc2xhc2g9XHJlbGF4JQorXGxldFxmcmVuY2hzcGFjaW5nPVxyZWxheCUKK1xlZGVmXHRlbXB7e1xyZWFsYmFja3NsYXNoIHVubnVtYnN1YnN1YnNlY2VudHJ5eyMxfXtcbm9leHBhbmRcZm9saW99fX0lCitcZXNjYXBlY2hhcj1gXFwlCitcd3JpdGUgXGNvbnRlbnRzZmlsZSBcdGVtcCAlCitcdW5udW1ibm9kZXJlZiAlCitccGVuYWx0eSAxMDAwMCAlCit9CisKKyUgRGVmaW5lIEBtYWpvcmhlYWRpbmcsIEBoZWFkaW5nIGFuZCBAc3ViaGVhZGluZworCitcb3V0ZXJcZGVmXG1ham9yaGVhZGluZyAjMXslCit7XGFkdmFuY2VcY2hhcGhlYWRpbmdza2lwIGJ5IDEwcHQgXGNoYXBicmVhayB9JQore1xjaGFwZm9udHMgXGxpbmV7XGNoYXBybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxwZW5hbHR5IDIwMH0KKworXG91dGVyXGRlZlxjaGFwaGVhZGluZyAjMXtcY2hhcGJyZWFrICUKK3tcY2hhcGZvbnRzIFxsaW5le1xjaGFwcm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJccGVuYWx0eSAyMDB9CisKK1xsZXRcaGVhZGluZz1cc2VjaGVhZGluZ2kKK1xsZXRcc3ViaGVhZGluZz1cc3Vic2VjaGVhZGluZ2kKK1xsZXRcc3Vic3ViaGVhZGluZz1cc3Vic3Vic2VjaGVhZGluZ2kKKworJSBUaGVzZSBtYWNyb3MgZ2VuZXJhdGUgYSBjaGFwdGVyLCBzZWN0aW9uLCBldGMuIGhlYWRpbmcgb25seQorJSAoaW5jbHVkaW5nIHdoaXRlc3BhY2UsIGxpbmVicmVha2luZywgZXRjLiBhcm91bmQgaXQpLAorJSBnaXZlbiBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGNvbnZlbmllbnQsIHBhcnNlZCBmb3JtLgorCislJSUgQXJncyBhcmUgdGhlIHNraXAgYW5kIHBlbmFsdHkgKHVzdWFsbHkgbmVnYXRpdmUpCitcZGVmXGRvYnJlYWsjMSMye1xwYXJcaWZkaW1cbGFzdHNraXA8IzFccmVtb3ZlbGFzdHNraXBccGVuYWx0eSMyXHZza2lwIzFcZml9CisKK1xkZWZcc2V0Y2hhcHRlcnN0eWxlICMxIHtcY3NuYW1lIENIQVBGIzFcZW5kY3NuYW1lfQorCislJSUgRGVmaW5lIHBsYWluIGNoYXB0ZXIgc3RhcnRzLCBhbmQgcGFnZSBvbi9vZmYgc3dpdGNoaW5nIGZvciBpdAorJSBQYXJhbWV0ZXIgY29udHJvbGxpbmcgc2tpcCBiZWZvcmUgY2hhcHRlciBoZWFkaW5ncyAoaWYgbmVlZGVkKQorCitcbmV3c2tpcCBcY2hhcGhlYWRpbmdza2lwIFxjaGFwaGVhZGluZ3NraXAgPSAzMHB0IHBsdXMgOHB0IG1pbnVzIDRwdAorCitcZGVmXGNoYXBicmVha3tcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwIHstNDAwMH19CitcZGVmXGNoYXBwYWdlcntccGFyXHZmaWxsXHN1cGVyZWplY3R9CitcZGVmXGNoYXBvZGRwYWdle1xjaGFwcGFnZXIgXGlmb2RkXHBhZ2VubyBcZWxzZSBcaGJveCB0byAwcHR7fSBcY2hhcHBhZ2VyXGZpfQorCitcZGVmXHNldGNoYXB0ZXJuZXdwYWdlICMxIHtcY3NuYW1lIENIQVBQQUcjMVxlbmRjc25hbWV9CisKK1xkZWZcQ0hBUFBBR29mZnsKK1xnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBicmVhaworXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcn0KKworXGRlZlxDSEFQUEFHb257CitcZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwcGFnZXIKK1xnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwcGFnZXJ9CisKK1xkZWZcQ0hBUFBBR29kZHsKK1xnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBvZGRwYWdlCitcZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcG9kZHBhZ2V9CisKK1xDSEFQUEFHb24KKworXGRlZlxDSEFQRnBsYWlueworXGdsb2JhbFxsZXRcY2hhcG1hY3JvPVxjaGZwbGFpbgorXGdsb2JhbFxsZXRcdW5udW1iY2hhcG1hY3JvPVx1bm5jaGZwbGFpbn0KKworXGRlZlxjaGZwbGFpbiAjMSMyeyUKK1xwY2hhcHNlcG1hY3JvICUKK3tcY2hhcGZvbnRzIFxsaW5le1xjaGFwcm0gIzIuXGVuc3BhY2UgIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJccGVuYWx0eSA1MDAwICUKK30KKworXGRlZlx1bm5jaGZwbGFpbiAjMXslCitccGNoYXBzZXBtYWNybyAlCit7XGNoYXBmb250cyBcbGluZXtcY2hhcHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXHBlbmFsdHkgMTAwMDAgJQorfQorXENIQVBGcGxhaW4gJSBUaGUgZGVmYXVsdAorCitcZGVmXHVubmNoZm9wZW4gIzF7JQorXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFxsaW5le1xjaGFwcm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJccGVuYWx0eSAxMDAwMCAlCit9CisKK1xkZWZcY2hmb3BlbiAjMSMye1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cworXHZib3ggdG8gM2lue1x2ZmlsIFxoYm94IHRvXGhzaXple1xoZmlsICMyfSBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMX0gXHZmaWx9fSUKK1xwYXJccGVuYWx0eSA1MDAwICUKK30KKworXGRlZlxDSEFQRm9wZW57CitcZ2xvYmFsXGxldFxjaGFwbWFjcm89XGNoZm9wZW4KK1xnbG9iYWxcbGV0XHVubnVtYmNoYXBtYWNybz1cdW5uY2hmb3Blbn0KKworJSBQYXJhbWV0ZXIgY29udHJvbGxpbmcgc2tpcCBiZWZvcmUgc2VjdGlvbiBoZWFkaW5ncy4KKworXG5ld3NraXAgXHN1YnNlY2hlYWRpbmdza2lwICBcc3Vic2VjaGVhZGluZ3NraXAgPSAxN3B0IHBsdXMgOHB0IG1pbnVzIDRwdAorXGRlZlxzdWJzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHN1YnNlY2hlYWRpbmdza2lwIHstNTAwfX0KKworXG5ld3NraXAgXHNlY2hlYWRpbmdza2lwICBcc2VjaGVhZGluZ3NraXAgPSAyMXB0IHBsdXMgOHB0IG1pbnVzIDRwdAorXGRlZlxzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHNlY2hlYWRpbmdza2lwIHstMTAwMH19CisKK1xkZWZcc2VjaGVhZGluZyAjMSMyIzN7XHNlY2hlYWRpbmdpIHsjMi4jM1xlbnNwYWNlICMxfX0KK1xkZWZccGxhaW5zZWNoZWFkaW5nICMxe1xzZWNoZWFkaW5naSB7IzF9fQorXGRlZlxzZWNoZWFkaW5naSAjMXt7XGFkdmFuY2UgXHNlY2hlYWRpbmdza2lwIGJ5IFxwYXJza2lwICUKK1xzZWNoZWFkaW5nYnJlYWt9JQore1xzZWNmb250cyBcbGluZXtcc2Vjcm0gIzFcaGZpbGx9fSUKK1xpZmRpbSBccGFyc2tpcDwxMHB0IFxrZXJuIDEwcHRca2VybiAtXHBhcnNraXBcZmkgXHBlbmFsdHkgMTAwMDAgfQorCitcZGVmXHN1YnNlY2hlYWRpbmcgIzEjMiMzIzR7e1xhZHZhbmNlIFxzdWJzZWNoZWFkaW5nc2tpcCBieSBccGFyc2tpcCAlCitcc3Vic2VjaGVhZGluZ2JyZWFrfSUKK3tcc2VjZm9udHMgXGxpbmV7XHNlY3JtIzIuIzMuIzRcZW5zcGFjZSAjMVxoZmlsbH19JQorXGlmZGltIFxwYXJza2lwPDEwcHQgXGtlcm4gMTBwdFxrZXJuIC1ccGFyc2tpcFxmaSBccGVuYWx0eSAxMDAwMCB9CisKK1xkZWZcc3Vic3Vic2VjZm9udHN7XHN1YnNlY2ZvbnRzfSAlIE1heWJlIHRoaXMgc2hvdWxkIGNoYW5nZQorCitcZGVmXHN1YnN1YnNlY2hlYWRpbmcgIzEjMiMzIzQjNXt7XGFkdmFuY2UgXHN1YnNlY2hlYWRpbmdza2lwIGJ5IFxwYXJza2lwICUKK1xzdWJzZWNoZWFkaW5nYnJlYWt9JQore1xzZWNmb250cyBcbGluZXtcc2Vjcm0jMi4jMy4jNC4jNVxlbnNwYWNlICMxXGhmaWxsfX0lCitcaWZkaW0gXHBhcnNraXA8MTBwdCBca2VybiAxMHB0XGtlcm4gLVxwYXJza2lwXGZpIFxwZW5hbHR5IDEwMDAwfQorCitcbWVzc2FnZXt0b2MgcHJpbnRpbmcsfQorCitcZGVmXERvdHNib3h7XGhib3ggdG8gMWVte1xoc3MuXGhzc319ICUgVXNlZCBieSBpbmRleCBtYWNyb3MKKworXGRlZlxmaW5pc2hjb250ZW50c3slCitcaWZudW1ccGFnZW5vPjAgJQorXHBhZ2VhbGlnbm1hY3JvICUKK1xpbW1lZGlhdGVcY2xvc2VvdXQgXGNvbnRlbnRzZmlsZSUKK1xwYWdlbm89LTEJCSUgUmVxdWVzdCByb21hbiBudW1iZXJlZCBwYWdlcworXGZpfQorCitcb3V0ZXJcZGVmXGNvbnRlbnRzeyUKK1xmaW5pc2hjb250ZW50cyAlCitcdW5udW1iY2hhcG1hY3Jve1RhYmxlIG9mIENvbnRlbnRzfQorXGRlZlx0aGlzY2hhcHRlcntUYWJsZSBvZiBDb250ZW50c30KK3tcY2F0Y29kZWBcXD0wCitcY2F0Y29kZWBcez0xCQklIFNldCB1cCB0byBoYW5kbGUgY29udGVudHMgZmlsZXMgcHJvcGVybHkKK1xjYXRjb2RlYFx9PTIKK1xjYXRjb2RlYFxAPTExCitcaW5wdXQgXGpvYm5hbWUudG9jCit9CitcdmZpbGwgXGVqZWN0fQorCitcb3V0ZXJcZGVmXHN1bW1hcnljb250ZW50c3slCitcZmluaXNoY29udGVudHMgJQorXHVubnVtYmNoYXBtYWNyb3tTdW1tYXJ5IFRhYmxlIG9mIENvbnRlbnRzfQorXGRlZlx0aGlzY2hhcHRlcntTdW1tYXJ5IFRhYmxlIG9mIENvbnRlbnRzfQore1xjYXRjb2RlYFxcPTAKK1xjYXRjb2RlYFx7PTEJCSUgU2V0IHVwIHRvIGhhbmRsZSBjb250ZW50cyBmaWxlcyBwcm9wZXJseQorXGNhdGNvZGVgXH09MgorXGNhdGNvZGVgXEA9MTEKK1xkZWZcc21hbGxicmVha3t9CitcZGVmXHNlY2VudHJ5ICMjMSMjMiMjMyMjNHt9CitcZGVmXHN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNXt9CitcZGVmXHN1YnN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNSMjNnt9CitcZGVmXHVubnVtYnNlY2VudHJ5ICMjMSMjMnt9CitcZGVmXHVubnVtYnN1YnNlY2VudHJ5ICMjMSMjMnt9CitcZGVmXHVubnVtYnN1YnN1YnNlY2VudHJ5ICMjMSMjMnt9CitcbGV0XG1lZGJyZWFrPVxzbWFsbGJyZWFrCitcaW5wdXQgXGpvYm5hbWUudG9jCit9CitcdmZpbGwgXGVqZWN0fQorCitcb3V0ZXJcZGVmXGJ5ZXtccGFnZWFsaWdubWFjcm9cdHJhY2luZ3N0YXRzPTFccHRleGVuZH0KKworJSBUaGVzZSBtYWNyb3MgZ2VuZXJhdGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBjb250ZW50cworJSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNoYXB0ZXIgb3Igc2VjdGlvbiBuYW1lLgorJSBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcGFnZSBudW1iZXIuCislIFRoZSBhcmd1bWVudHMgaW4gYmV0d2VlbiBhcmUgdGhlIGNoYXB0ZXIgbnVtYmVyLCBzZWN0aW9uIG51bWJlciwgLi4uCisKK1xkZWZcY2hhcGVudHJ5ICMxIzIjM3slCitcbWVkYnJlYWsKK1xsaW5leyMyLlxzcGFjZSMxXGxlYWRlcnNcaGJveCB0byAxZW17XGhzcy5caHNzfVxoZmlsbCAjM30KK30KKworXGRlZlx1bm51bWJjaGFwZW50cnkgIzEjMnslCitcbWVkYnJlYWsKK1xsaW5leyMxXGxlYWRlcnNcRG90c2JveFxoZmlsbCAjMn0KK30KKworXGRlZlxzZWNlbnRyeSAjMSMyIzMjNHslCitcbGluZXtcZW5zcGFjZVxlbnNwYWNlIzIuIzNcc3BhY2UjMVxsZWFkZXJzXERvdHNib3hcaGZpbGwjNH0KK30KKworXGRlZlx1bm51bWJzZWNlbnRyeSAjMSMyeyUKK1xsaW5le1xlbnNwYWNlXGVuc3BhY2UjMVxsZWFkZXJzXERvdHNib3hcaGZpbGwgIzJ9Cit9CisKK1xkZWZcc3Vic2VjZW50cnkgIzEjMiMzIzQjNXslCitcbGluZXtcZW5zcGFjZVxlbnNwYWNlXGVuc3BhY2VcZW5zcGFjZQorIzIuIzMuIzRcc3BhY2UjMVxsZWFkZXJzXERvdHNib3hcaGZpbGwgIzV9Cit9CisKK1xkZWZcdW5udW1ic3Vic2VjZW50cnkgIzEjMnslCitcbGluZXtcZW5zcGFjZVxlbnNwYWNlXGVuc3BhY2VcZW5zcGFjZSMxXGxlYWRlcnNcRG90c2JveFxoZmlsbCAjMn0KK30KKworXGRlZlxzdWJzdWJzZWNlbnRyeSAjMSMyIzMjNCM1IzZ7JQorXGxpbmV7XGVuc3BhY2VcZW5zcGFjZVxlbnNwYWNlXGVuc3BhY2VcZW5zcGFjZVxlbnNwYWNlCisjMi4jMy4jNC4jNVxzcGFjZSMxXGxlYWRlcnNcRG90c2JveFxoZmlsbCAjNn0KK30KKworXGRlZlx1bm51bWJzdWJzdWJzZWNlbnRyeSAjMSMyeyUKK1xsaW5le1xlbnNwYWNlXGVuc3BhY2VcZW5zcGFjZVxlbnNwYWNlXGVuc3BhY2VcZW5zcGFjZSMxXGxlYWRlcnNcRG90c2JveFxoZmlsbCAjMn0KK30KKworXG1lc3NhZ2V7ZW52aXJvbm1lbnRzLH0KKworJSBAdGV4IC4uLiBAZW5kIHRleCAgICBlc2NhcGVzIGludG8gcmF3IFRleCB0ZW1wb3JhcmlseS4KKyUgT25lIGV4Y2VwdGlvbjogQCBpcyBzdGlsbCBhbiBlc2NhcGUgY2hhcmFjdGVyLCBzbyB0aGF0IEBlbmQgdGV4IHdvcmtzLgorJSBCdXQgXEAgb3IgQEAgd2lsbCBnZXQgYSBwbGFpbiB0ZXggQCBjaGFyYWN0ZXIuCisKK1xkZWZcdGV4e1xiZWdpbmdyb3VwCitcY2F0Y29kZSBgXFw9MCBcY2F0Y29kZSBgXHs9MSBcY2F0Y29kZSBgXH09MgorXGNhdGNvZGUgYFwkPTMgXGNhdGNvZGUgYFwmPTQgXGNhdGNvZGUgYFwjPTYKK1xjYXRjb2RlIGBcXj03IFxjYXRjb2RlIGBcXz04IFxjYXRjb2RlIGBcfj0xMyBcbGV0fj1cdGllCitcY2F0Y29kZSBgXCU9MTQKK1xjYXRjb2RlYFwiPTEyCitcY2F0Y29kZWBcfD0xMgorXGNhdGNvZGVgXDw9MTIKK1xjYXRjb2RlYFw+PTEyCitcZXNjYXBlY2hhcj1gXFwKKyUKK1xsZXRcez1ccHRleGxicmFjZQorXGxldFx9PVxwdGV4cmJyYWNlCitcbGV0XC49XHB0ZXhkb3QKK1xsZXRcKj1ccHRleHN0YXIKK1xkZWZcQD17QH0lCitcbGV0XGJ1bGxldD1ccHRleGJ1bGxldAorXGxldFxiPVxwdGV4YiBcbGV0XGM9XHB0ZXhjIFxsZXRcaT1ccHRleGkgXGxldFx0PVxwdGV4dCBcbGV0XGw9XHB0ZXhsCitcbGV0XEw9XHB0ZXhMCislCitcbGV0XEV0ZXg9XGVuZGdyb3VwfQorCislIERlZmluZSBAbGlzcCAuLi4gQGVuZGxpc3AuCislIEBsaXNwIGRvZXMgYSBcYmVnaW5ncm91cCBzbyBpdCBjYW4gcmViaW5kIHRoaW5ncywKKyUgaW5jbHVkaW5nIHRoZSBkZWZpbml0aW9uIG9mIEBlbmRsaXNwICh3aGljaCBub3JtYWxseSBpcyBlcnJvbmVvdXMpLgorCislIEFtb3VudCB0byBuYXJyb3cgdGhlIG1hcmdpbnMgYnkgZm9yIEBsaXNwLgorXG5ld3NraXBcbGlzcG5hcnJvd2luZyBcbGlzcG5hcnJvd2luZz0wLjRpbgorCislIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gdGhhdCBeTSBnZXRzIGluc2lkZSBAbGlzcAorJSBwaHI6IGNoYW5nZWQgc3BhY2UgdG8gXG51bGwsIHRvIGF2b2lkIG92ZXJmdWxsIGhib3ggcHJvYmxlbXMuCit7XG9iZXlzcGFjZXMlCitcZ2RlZlxsaXNwcGFye1xudWxsXGVuZGdyYWZ9fQorCislIENhdXNlIFxvYmV5c3BhY2VzIHRvIG1ha2UgZWFjaCBTcGFjZSBjYXVzZSBhIHdvcmQtc2VwYXJhdGlvbgorJSByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCB3aGljaCBpcyB0aGF0IGl0IGFjdHMgcHVuY3R1YXRpb24uCislIFRoaXMgaXMgYmVjYXVzZSBzcGFjZSBpbiB0dCBmb250IGxvb2tzIGZ1bm55Lgore1xvYmV5c3BhY2VzICUKK1xnZGVmXHNlcHNwYWNlc3tcZGVmIHtcIH19fQorCitcbmV3c2tpcFxhYm92ZWVudnNraXBhbW91bnQgXGFib3ZlZW52c2tpcGFtb3VudD0gMHB0CitcZGVmXGFib3ZlZW52YnJlYWt7e1xhZHZhbmNlXGFib3ZlZW52c2tpcGFtb3VudCBieSBccGFyc2tpcAorXGVuZGdyYWYgXGlmZGltXGxhc3Rza2lwPFxhYm92ZWVudnNraXBhbW91bnQKK1xyZW1vdmVsYXN0c2tpcCBccGVuYWx0eS01MCBcdnNraXBcYWJvdmVlbnZza2lwYW1vdW50IFxmaX19CisKK1xkZWZcYWZ0ZXJlbnZicmVha3tcZW5kZ3JhZiBcaWZkaW1cbGFzdHNraXA8XGFib3ZlZW52c2tpcGFtb3VudAorXHJlbW92ZWxhc3Rza2lwIFxwZW5hbHR5LTUwIFx2c2tpcFxhYm92ZWVudnNraXBhbW91bnQgXGZpfQorCitcZGVmXGxpc3B7XGFib3ZlZW52YnJlYWtcYmVnaW5ncm91cFxpbkVOViAlVGhpcyBncm91cCBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIEBsaXNwIGJvZHkKK1xoZnV6ej0xMnRydWVwdCAlIERvbid0IGJlIGZ1c3N5CislIE1ha2Ugc3BhY2VzIGJlIHdvcmQtc2VwYXJhdG9ycyByYXRoZXIgdGhhbiBzcGFjZSB0b2tlbnMuCitcc2Vwc3BhY2VzICUKKyUgU2luZ2xlIHNwYWNlIGxpbmVzCitcc2luZ2xlc3BhY2UgJQorJSBUaGUgZm9sbG93aW5nIGNhdXNlcyBibGFuayBsaW5lcyBub3QgdG8gYmUgaWdub3JlZAorJSBieSBhZGRpbmcgYSBzcGFjZSB0byB0aGUgZW5kIG9mIGVhY2ggbGluZS4KK1xsZXRccGFyPVxsaXNwcGFyCitcZGVmXEVsaXNwe1xlbmRncm91cFxhZnRlcmVudmJyZWFrfSUKK1xwYXJza2lwPTBwdCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5IFxsaXNwbmFycm93aW5nIAorXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCitccGFyaW5kZW50PTBwdAorXGxldFxleGRlbnQ9XGludGVybmFsZXhkZW50Citcb2JleXNwYWNlcyBcb2JleWxpbmVzIFx0dCBccmF3YmFja3NsYXNoCitcZGVmXG5leHQjIzF7fVxuZXh0fQorCisKK1xsZXRcZXhhbXBsZT1cbGlzcAorXGRlZlxFZXhhbXBsZXtcRWxpc3B9CisKK1xsZXRcc21hbGxleGFtcGxlPVxsaXNwCitcZGVmXEVzbWFsbGV4YW1wbGV7XEVsaXNwfQorCislIE1hY3JvIGZvciA5IHB0LiBleGFtcGxlcywgbmVjZXNzYXJ5IHRvIHByaW50IHdpdGggNSIgbGluZXMuCislIEZyb20gUGF2ZWxAeGVyb3guICBUaGlzIGlzIG5vdCByZWFsbHkgdXNlZCB1bmxlc3MgdGhlCislIEBzbWFsbGJvb2sgY29tbWFuZCBpcyBnaXZlbi4KKworXGRlZlxzbWFsbGxpc3B4e1xhYm92ZWVudmJyZWFrXGJlZ2luZ3JvdXBcaW5FTlYKKyUJCQlUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgQGxpc3AgYm9keQorXGhmdXp6PTEydHJ1ZXB0ICUgRG9uJ3QgYmUgZnVzc3kKKyUgTWFrZSBzcGFjZXMgYmUgd29yZC1zZXBhcmF0b3JzIHJhdGhlciB0aGFuIHNwYWNlIHRva2Vucy4KK1xzZXBzcGFjZXMgJQorJSBTaW5nbGUgc3BhY2UgbGluZXMKK1xzaW5nbGVzcGFjZSAlCislIFRoZSBmb2xsb3dpbmcgY2F1c2VzIGJsYW5rIGxpbmVzIG5vdCB0byBiZSBpZ25vcmVkCislIGJ5IGFkZGluZyBhIHNwYWNlIHRvIHRoZSBlbmQgb2YgZWFjaCBsaW5lLgorXGxldFxwYXI9XGxpc3BwYXIKK1xkZWZcRXNtYWxsbGlzcHtcZW5kZ3JvdXBcYWZ0ZXJlbnZicmVha30lCitccGFyc2tpcD0wcHQgXGFkdmFuY2UgXHJpZ2h0c2tpcCBieSBcbGlzcG5hcnJvd2luZyAKK1xhZHZhbmNlIFxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZworXHBhcmluZGVudD0wcHQKK1xsZXRcZXhkZW50PVxpbnRlcm5hbGV4ZGVudAorXG9iZXlzcGFjZXMgXG9iZXlsaW5lcyBcbmluZXR0IFxyYXdiYWNrc2xhc2gKK1xkZWZcbmV4dCMjMXt9XG5leHR9CisKKyUgVGhpcyBpcyBAZGlzcGxheTsgc2FtZSBhcyBAbGlzcCBleGNlcHQgdXNlIHJvbWFuIGZvbnQuCisKK1xkZWZcZGlzcGxheXtcYmVnaW5ncm91cFxpbkVOViAlVGhpcyBncm91cCBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIEBkaXNwbGF5IGJvZHkKK1xhYm92ZWVudmJyZWFrCislIE1ha2Ugc3BhY2VzIGJlIHdvcmQtc2VwYXJhdG9ycyByYXRoZXIgdGhhbiBzcGFjZSB0b2tlbnMuCitcc2Vwc3BhY2VzICUKKyUgU2luZ2xlIHNwYWNlIGxpbmVzCitcc2luZ2xlc3BhY2UgJQorJSBUaGUgZm9sbG93aW5nIGNhdXNlcyBibGFuayBsaW5lcyBub3QgdG8gYmUgaWdub3JlZAorJSBieSBhZGRpbmcgYSBzcGFjZSB0byB0aGUgZW5kIG9mIGVhY2ggbGluZS4KK1xsZXRccGFyPVxsaXNwcGFyCitcZGVmXEVkaXNwbGF5e1xlbmRncm91cFxhZnRlcmVudmJyZWFrfSUKK1xwYXJza2lwPTBwdCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5IFxsaXNwbmFycm93aW5nIAorXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCitccGFyaW5kZW50PTBwdAorXGxldFxleGRlbnQ9XGludGVybmFsZXhkZW50Citcb2JleXNwYWNlcyBcb2JleWxpbmVzCitcZGVmXG5leHQjIzF7fVxuZXh0fQorCislIFRoaXMgaXMgQGZvcm1hdDsgc2FtZSBhcyBAbGlzcCBleGNlcHQgdXNlIHJvbWFuIGZvbnQgYW5kIGRvbid0IG5hcnJvdyBtYXJnaW5zCisKK1xkZWZcZm9ybWF0e1xiZWdpbmdyb3VwXGluRU5WICVUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgQGZvcm1hdCBib2R5CitcYWJvdmVlbnZicmVhaworJSBNYWtlIHNwYWNlcyBiZSB3b3JkLXNlcGFyYXRvcnMgcmF0aGVyIHRoYW4gc3BhY2UgdG9rZW5zLgorXHNlcHNwYWNlcyAlCitcc2luZ2xlc3BhY2UgJQorJSBUaGUgZm9sbG93aW5nIGNhdXNlcyBibGFuayBsaW5lcyBub3QgdG8gYmUgaWdub3JlZAorJSBieSBhZGRpbmcgYSBzcGFjZSB0byB0aGUgZW5kIG9mIGVhY2ggbGluZS4KK1xsZXRccGFyPVxsaXNwcGFyCitcZGVmXEVmb3JtYXR7XGVuZGdyb3VwXGFmdGVyZW52YnJlYWt9CitccGFyc2tpcD0wcHQgXHBhcmluZGVudD0wcHQKK1xvYmV5c3BhY2VzIFxvYmV5bGluZXMKK1xkZWZcbmV4dCMjMXt9XG5leHR9CisKKyUgQGZsdXNobGVmdCBhbmQgQGZsdXNocmlnaHQKKworXGRlZlxmbHVzaGxlZnR7XGJlZ2luZ3JvdXBcaW5FTlYgJVRoaXMgZ3JvdXAgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBAZm9ybWF0IGJvZHkKK1xhYm92ZWVudmJyZWFrCislIE1ha2Ugc3BhY2VzIGJlIHdvcmQtc2VwYXJhdG9ycyByYXRoZXIgdGhhbiBzcGFjZSB0b2tlbnMuCitcc2Vwc3BhY2VzICUKKyUgVGhlIGZvbGxvd2luZyBjYXVzZXMgYmxhbmsgbGluZXMgbm90IHRvIGJlIGlnbm9yZWQKKyUgYnkgYWRkaW5nIGEgc3BhY2UgdG8gdGhlIGVuZCBvZiBlYWNoIGxpbmUuCislIFRoaXMgYWxzbyBjYXVzZXMgQCB0byB3b3JrIHdoZW4gdGhlIGRpcmVjdGl2ZSBuYW1lCislIGlzIHRlcm1pbmF0ZWQgYnkgZW5kIG9mIGxpbmUuCitcbGV0XHBhcj1cbGlzcHBhcgorXGRlZlxFZmx1c2hsZWZ0e1xlbmRncm91cFxhZnRlcmVudmJyZWFrfSUKK1xwYXJza2lwPTBwdCBccGFyaW5kZW50PTBwdAorXG9iZXlzcGFjZXMgXG9iZXlsaW5lcworXGRlZlxuZXh0IyMxe31cbmV4dH0KKworXGRlZlxmbHVzaHJpZ2h0e1xiZWdpbmdyb3VwXGluRU5WICVUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgQGZvcm1hdCBib2R5CitcYWJvdmVlbnZicmVhaworJSBNYWtlIHNwYWNlcyBiZSB3b3JkLXNlcGFyYXRvcnMgcmF0aGVyIHRoYW4gc3BhY2UgdG9rZW5zLgorXHNlcHNwYWNlcyAlCislIFRoZSBmb2xsb3dpbmcgY2F1c2VzIGJsYW5rIGxpbmVzIG5vdCB0byBiZSBpZ25vcmVkCislIGJ5IGFkZGluZyBhIHNwYWNlIHRvIHRoZSBlbmQgb2YgZWFjaCBsaW5lLgorJSBUaGlzIGFsc28gY2F1c2VzIEAgdG8gd29yayB3aGVuIHRoZSBkaXJlY3RpdmUgbmFtZQorJSBpcyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBsaW5lLgorXGxldFxwYXI9XGxpc3BwYXIKK1xkZWZcRWZsdXNocmlnaHR7XGVuZGdyb3VwXGFmdGVyZW52YnJlYWt9JQorXHBhcnNraXA9MHB0IFxwYXJpbmRlbnQ9MHB0CitcYWR2YW5jZSBcbGVmdHNraXAgYnkgMHB0IHBsdXMgMWZpbGwKK1xvYmV5c3BhY2VzIFxvYmV5bGluZXMKK1xkZWZcbmV4dCMjMXt9XG5leHR9CisKKyUgQHF1b3RhdGlvbiAtIG5hcnJvdyB0aGUgbWFyZ2lucy4KKworXGRlZlxxdW90YXRpb257XGJlZ2luZ3JvdXBcaW5FTlYgJVRoaXMgZ3JvdXAgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBAcXVvdGF0aW9uIGJvZHkKK3tccGFyc2tpcD0wcHQgICUgYmVjYXVzZSB3ZSB3aWxsIHNraXAgYnkgXHBhcnNraXAgdG9vLCBsYXRlcgorXGFib3ZlZW52YnJlYWt9JQorXHNpbmdsZXNwYWNlCitccGFyaW5kZW50PTBwdAorXGRlZlxFcXVvdGF0aW9ue1xwYXJcZW5kZ3JvdXBcYWZ0ZXJlbnZicmVha30lCitcYWR2YW5jZSBccmlnaHRza2lwIGJ5IFxsaXNwbmFycm93aW5nIAorXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nfQorCitcbWVzc2FnZXtkZWZ1bnMsfQorJSBEZWZpbmUgZm9ybWF0dGVyIGZvciBkZWZ1bnMKKyUgRmlyc3QsIGFsbG93IHVzZXIgdG8gY2hhbmdlIGRlZmluaXRpb24gb2JqZWN0IGZvbnQgKFxkZikgaW50ZXJuYWxseQorXGRlZlxzZXRkZWZmb250ICMxIHtcY3NuYW1lIERFRiMxXGVuZGNzbmFtZX0KKworXG5ld3NraXBcZGVmYm9keWluZGVudCBcZGVmYm9keWluZGVudD0zNnB0CitcbmV3c2tpcFxkZWZhcmdzaW5kZW50IFxkZWZhcmdzaW5kZW50PTUwcHQKK1xuZXdza2lwXGRlZnR5cGVtYXJnaW4gXGRlZnR5cGVtYXJnaW49MTJwdAorXG5ld3NraXBcZGVmbGFzdGFyZ21hcmdpbiBcZGVmbGFzdGFyZ21hcmdpbj0xOHB0CisKK1xuZXdjb3VudFxwYXJlbmNvdW50CislIGRlZmluZSBcZnVuY3Rpb25wYXJlbnMsIHdoaWNoIG1ha2VzICggYW5kICkgYW5kICYgZG8gc3BlY2lhbCB0aGluZ3MuCislIFxmdW5jdGlvbnBhcmVucyBhZmZlY3RzIHRoZSBncm91cCBpdCBpcyBjb250YWluZWQgaW4uCitcZGVmXGFjdGl2ZXBhcmVuc3slCitcY2F0Y29kZWBcKD1cYWN0aXZlIFxjYXRjb2RlYFwpPVxhY3RpdmUgXGNhdGNvZGVgXCY9XGFjdGl2ZQorXGNhdGNvZGVgXFs9XGFjdGl2ZSBcY2F0Y29kZWBcXT1cYWN0aXZlfQore1xhY3RpdmVwYXJlbnMgJSBOb3csIHNtYXJ0IHBhcmVucyBkb24ndCB0dXJuIG9uIHVudGlsICZmb28gKHNlZSBcYW1wcm0pCitcZ2RlZlxmdW5jdGlvbnBhcmVuc3tcYm9sZGJyYXhcbGV0Jj1cYW1wcm1ccGFyZW5jb3VudD0wIH0KK1xnZGVmXGJvbGRicmF4e1xsZXQoPVxvcG5yXGxldCk9XGNsbnJcbGV0Wz1cbGJyYlxsZXRdPVxyYnJifQorCislIERlZmluaXRpb25zIG9mICgsICkgYW5kICYgdXNlZCBpbiBhcmdzIGZvciBmdW5jdGlvbnMuCislIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgKCBvdXRzaWRlIG9mIGFsbCBwYXJlbnRoZXNlcy4KK1xnZGVmXG9wcm0jMSB7e1xybVxjaGFyYFwofSMxIFxiZiBcbGV0KD1cb3BuZXN0ZWQgJQorXGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgMSB9CislCislIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgKCB3aGVuIGFscmVhZHkgaW5zaWRlIGEgbGV2ZWwgb2YgcGFyZW5zLgorXGdkZWZcb3BuZXN0ZWR7XGNoYXJgXChcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxIH0KKyUKK1xnZGVmXGNscm17JSBQcmludCBhIHBhcmVuIGluIHJvbWFuIGlmIGl0IGlzIHRha2luZyB1cyBiYWNrIHRvIGRlcHRoIG9mIDAuCislIGFsc28gaW4gdGhhdCBjYXNlIHJlc3RvcmUgdGhlIG91dGVyLWxldmVsIGRlZmluaXRpb24gb2YgKC4KK1xpZm51bSBccGFyZW5jb3VudD0xIHtccm0gXGNoYXIgYFwpfVxzbCBcbGV0KD1cb3BybSBcZWxzZSBcY2hhciBgXCkgXGZpCitcZ2xvYmFsXGFkdmFuY2UgXHBhcmVuY291bnQgYnkgLTEgfQorJSBJZiB3ZSBlbmNvdW50ZXIgJmZvbywgdGhlbiB0dXJuIG9uICgpLWhhY2tpbmcgYWZ0ZXJ3YXJkcworXGdkZWZcYW1wcm0jMSB7e1xybVwmIzF9XGxldCg9XG9wcm0gXGxldCk9XGNscm1cIH0KKyUKK1xnZGVmXG5vcm1hbHBhcmVuc3tcYm9sZGJyYXhcbGV0Jj1cYW1wbnJ9Cit9ICUgRW5kIG9mIGRlZmluaXRpb24gaW5zaWRlIFxhY3RpdmVwYXJlbnMKKyUlIFRoZXNlIHBhcmVucyAoaW4gXGJvbGRicmF4KSBhY3R1YWxseSBhcmUgYSBsaXR0bGUgYm9sZGVyIHRoYW4gdGhlCislJSBjb250YWluZWQgdGV4dC4gIFRoaXMgaXMgZXNwZWNpYWxseSBuZWVkZWQgZm9yIFsgYW5kIF0KK1xkZWZcb3Bucnt7XHNmXGNoYXJgXCh9fSBcZGVmXGNsbnJ7e1xzZlxjaGFyYFwpfX0gXGRlZlxhbXBucntcJn0KK1xkZWZcbGJyYnt7XHR0XGNoYXJgXFt9fSBcZGVmXHJicmJ7e1x0dFxjaGFyYFxdfX0KKworJSBGaXJzdCwgZGVmbmFtZSwgd2hpY2ggZm9ybWF0cyB0aGUgaGVhZGVyIGxpbmUgaXRzZWxmLgorJSAjMSBzaG91bGQgYmUgdGhlIGZ1bmN0aW9uIG5hbWUuCislICMyIHNob3VsZCBiZSB0aGUgdHlwZSBvZiBkZWZpbml0aW9uLCBzdWNoIGFzICJGdW5jdGlvbiIuCisKK1xkZWZcZGVmbmFtZSAjMSMyeyUKK1xsZWZ0c2tpcCA9IDBpbiAgJQorXG5vaW5kZW50ICAgICAgICAlCitcc2V0Ym94MD1caGJveHtcaHNraXAgXGRlZmxhc3RhcmdtYXJnaW57XHJtICMyfVxoc2tpcCBcZGVmdHlwZW1hcmdpbn0lCitcZGltZW4wPVxoc2l6ZSBcYWR2YW5jZSBcZGltZW4wIGJ5IC1cd2QwICUgY29tcHV0ZSBzaXplIGZvciBmaXJzdCBsaW5lCitcZGltZW4xPVxoc2l6ZSBcYWR2YW5jZSBcZGltZW4xIGJ5IC1cZGVmYXJnc2luZGVudCAlc2l6ZSBmb3IgY29udGludWF0aW9ucworXHBhcnNoYXBlIDIgMGluIFxkaW1lbjAgXGRlZmFyZ3NpbmRlbnQgXGRpbWVuMSAgICAgJQorJSBOb3cgb3V0cHV0IGFyZyAyICgiRnVuY3Rpb24iIG9yIHNvbWUgc3VjaCkKKyUgZW5kaW5nIGF0IFxkZWZ0eXBlbWFyZ2luIGZyb20gdGhlIHJpZ2h0IG1hcmdpbiwKKyUgYnV0IHN0dWNrIGluc2lkZSBhIGJveCBvZiB3aWR0aCAwIHNvIGl0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIGxpbmVicmVha2luZworXHJsYXB7XHJpZ2h0bGluZXt7XHJtICMyfVxoc2tpcCBcZGVmdHlwZW1hcmdpbn19JQorXHRvbGVyYW5jZT0xMDAwMCBcaGJhZG5lc3M9MTAwMDAgICAgJSBNYWtlIGFsbCBsaW5lcyB1bmRlcmZ1bGwgYW5kIG5vIGNvbXBsYWludHMKK3tcZGYgIzF9XGVuc2tpcCAgICAgICAgJSBHZW5lcmF0ZSBmdW5jdGlvbiBuYW1lCit9CisKKyUgQWN0dWFsbHkgcHJvY2VzcyB0aGUgYm9keSBvZiBhIGRlZmluaXRpb24KKyUgIzEgc2hvdWxkIGJlIHRoZSB0ZXJtaW5hdGluZyBjb250cm9sIHNlcXVlbmNlLCBzdWNoIGFzIFxFZGVmdW4uCislICMyIHNob3VsZCBiZSB0aGUgImFub3RoZXIgbmFtZSIgY29udHJvbCBzZXF1ZW5jZSwgc3VjaCBhcyBcZGVmdW54LgorJSAjMyBzaG91bGQgYmUgdGhlIGNvbnRyb2wgc2VxdWVuY2UgdGhhdCBhY3R1YWxseSBwcm9jZXNzZXMgdGhlIGhlYWRlciwKKyUgICAgc3VjaCBhcyBcZGVmdW5oZWFkZXIuCisKK1xkZWZcZGVmcGFyc2Vib2R5ICMxIzIjM3tcYmVnaW5ncm91cFxpbkVOViUgRW52aXJvbm1lbnQgZm9yIGRlZmluaXRpb25ib2R5CitcbWVkYnJlYWsgJQorJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcworJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgorXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKK1xkZWYjMntcYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXQjM30lCitccGFyaW5kZW50PTBpbiBcbGVmdHNraXA9XGRlZmJvZHlpbmRlbnQgJQorXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0IzN9CisKK1xkZWZcZGVmbWV0aHBhcnNlYm9keSAjMSMyIzMjNCB7XGJlZ2luZ3JvdXBcaW5FTlYgJQorXG1lZGJyZWFrICUKKyUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKKyUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KK1xkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCitcZGVmIzIjIzEge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzF9fX0lCitccGFyaW5kZW50PTBpbiBcbGVmdHNraXA9XGRlZmJvZHlpbmRlbnQgJQorXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyM0fX19CisKKyUgU3BsaXQgdXAgIzIgYXQgdGhlIGZpcnN0IHNwYWNlIHRva2VuLgorJSBjYWxsICMxIHdpdGggdHdvIGFyZ3VtZW50czoKKyUgIHRoZSBmaXJzdCBpcyBhbGwgb2YgIzIgYmVmb3JlIHRoZSBzcGFjZSB0b2tlbiwKKyUgIHRoZSBzZWNvbmQgaXMgYWxsIG9mICMyIGFmdGVyIHRoYXQgc3BhY2UgdG9rZW4uCislIElmICMyIGNvbnRhaW5zIG5vIHNwYWNlIHRva2VuLCBhbGwgb2YgaXQgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmcKKyUgYW5kIHRoZSBzZWNvbmQgaXMgcGFzc2VkIGFzIGVtcHR5LgorCit7XG9iZXlsaW5lcworXGdkZWZcc3BhY2VzcGxpdCMxIzJeXk17XGVuZGdyb3VwXHNwYWNlc3BsaXRmb297IzF9IzIgXHJlbGF4XHNwYWNlc3BsaXRmb299JQorXGxvbmdcZ2RlZlxzcGFjZXNwbGl0Zm9vIzEjMiAjMyM0XHNwYWNlc3BsaXRmb297JQorXGlmeFxyZWxheCAjMyUKKyMxeyMyfXt9XGVsc2UgIzF7IzJ9eyMzIzR9XGZpfX0KKworJSBTbyBtdWNoIGZvciB0aGUgdGhpbmdzIGNvbW1vbiB0byBhbGwga2luZHMgb2YgZGVmaW5pdGlvbnMuCisKKyUgRGVmaW5lIEBkZWZ1bi4KKworJSBGaXJzdCwgZGVmaW5lIHRoZSBwcm9jZXNzaW5nIHRoYXQgaXMgd2FudGVkIGZvciBhcmd1bWVudHMgb2YgXGRlZnVuCislIFVzZSB0aGlzIHRvIGV4cGFuZCB0aGUgYXJncyBhbmQgdGVybWluYXRlIHRoZSBwYXJhZ3JhcGggdGhleSBtYWtlIHVwCisKK1xkZWZcZGVmdW5hcmdzICMxe1xmdW5jdGlvbnBhcmVucyBcc2wgIzElCitcaWZudW1ccGFyZW5jb3VudD0wIFxlbHNlIFxlcnJtZXNzYWdle3VuYmFsYW5jZWQgcGFyZW5zIGluIEBkZWYgYXJndW1lbnRzfVxmaSUKK1xpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCitcZW5kZ3JhZlx2c2tpcCAtXHBhcnNraXAgXHBlbmFsdHkgMTAwMDB9CisKKyUgRG8gY29tcGxldGUgcHJvY2Vzc2luZyBvZiBvbmUgQGRlZnVuIG9yIEBkZWZ1bnggbGluZSBhbHJlYWR5IHBhcnNlZC4KKworJSBAZGVmZm4gQ29tbWFuZCBmb3J3YXJkLWNoYXIgbmNoYXJzCisKK1xkZWZcZGVmZm57XGRlZm1ldGhwYXJzZWJvZHlcRWRlZmZuXGRlZmZueFxkZWZmbmhlYWRlcn0KKworXGRlZlxkZWZmbmhlYWRlciAjMSMyIzN7XGRvaW5kIHtmbn17XGNvZGV7IzJ9fSUKK1xiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXsjMX1cZGVmdW5hcmdzeyMzfVxlbmRncm91cH0KKworJSBAZGVmdW4gPT0gQGRlZmZuIEZ1bmN0aW9uCisKK1xkZWZcZGVmdW57XGRlZnBhcnNlYm9keVxFZGVmdW5cZGVmdW54XGRlZnVuaGVhZGVyfQorCitcZGVmXGRlZnVuaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAorXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e0Z1bmN0aW9ufSUKK1xkZWZ1bmFyZ3MgeyMyfVxlbmRncm91cCAlCit9CisKKyUgQGRlZm1hYyA9PSBAZGVmZm4gTWFjcm8KKworXGRlZlxkZWZtYWN7XGRlZnBhcnNlYm9keVxFZGVmbWFjXGRlZm1hY3hcZGVmbWFjaGVhZGVyfQorCitcZGVmXGRlZm1hY2hlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKK1xiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtNYWNyb30lCitcZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQorfQorCislIEBkZWZzcGVjID09IEBkZWZmbiBTcGVjaWFsIEZvcm0KKworXGRlZlxkZWZzcGVje1xkZWZwYXJzZWJvZHlcRWRlZnNwZWNcZGVmc3BlY3hcZGVmc3BlY2hlYWRlcn0KKworXGRlZlxkZWZzcGVjaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAorXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1NwZWNpYWwgZm9ybX0lCitcZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQorfQorCislIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdW54CislIGFueXdoZXJlIG90aGVyIHRoYW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBAZGVmdW4gb3IgQGRlZnVueC4KKworXGRlZlxkZWZmbnggIzEge1xlcnJtZXNzYWdle0BkZWZmbnggaW4gaW52YWxpZCBjb250ZXh0fX0KK1xkZWZcZGVmdW54ICMxIHtcZXJybWVzc2FnZXtAZGVmdW54IGluIGludmFsaWQgY29udGV4dH19CitcZGVmXGRlZm1hY3ggIzEge1xlcnJtZXNzYWdle0BkZWZtYWN4IGluIGludmFsaWQgY29udGV4dH19CitcZGVmXGRlZnNwZWN4ICMxIHtcZXJybWVzc2FnZXtAZGVmc3BlY3ggaW4gaW52YWxpZCBjb250ZXh0fX0KKworJSBAZGVmbWV0aG9kLCBhbmQgc28gb24KKworJSBAZGVmb3Age0Z1bm55IE1ldGhvZH0gZm9vLWNsYXNzIGZyb2JuaWNhdGUgYXJndW1lbnQKKworXGRlZlxkZWZvcCAjMSB7XGRlZlxkZWZvcHR5cGV7IzF9JQorXGRlZm1ldGhwYXJzZWJvZHlcRWRlZm9wXGRlZm9weFxkZWZvcGhlYWRlcn0KKworXGRlZlxkZWZvcGhlYWRlciAjMSMyIzN7XGRvc3ViaW5kIHtmbn17XGNvZGV7IzJ9fXtvbiAjMX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKK1xiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtcZGVmb3B0eXBle30gb24gIzF9JQorXGRlZnVuYXJncyB7IzN9XGVuZGdyb3VwICUKK30KKworJSBAZGVmbWV0aG9kID09IEBkZWZvcCBNZXRob2QKKworXGRlZlxkZWZtZXRob2R7XGRlZm1ldGhwYXJzZWJvZHlcRWRlZm1ldGhvZFxkZWZtZXRob2R4XGRlZm1ldGhvZGhlYWRlcn0KKworXGRlZlxkZWZtZXRob2RoZWFkZXIgIzEjMiMze1xkb3N1YmluZCB7Zm59e1xjb2RleyMyfX17b24gIzF9JSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAorXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9e09wZXJhdGlvbiBvbiAjMX0lCitcZGVmdW5hcmdzIHsjM31cZW5kZ3JvdXAgJQorfQorCislIEBkZWZjdiB7Q2xhc3MgT3B0aW9ufSBmb28tY2xhc3MgZm9vLWZsYWcKKworXGRlZlxkZWZjdiAjMSB7XGRlZlxkZWZjdnR5cGV7IzF9JQorXGRlZm1ldGhwYXJzZWJvZHlcRWRlZmN2XGRlZmN2eFxkZWZjdmhlYWRlcn0KKworXGRlZlxkZWZjdmFyaGVhZGVyICMxIzIjM3slCitcZG9zdWJpbmQge3ZyfXtcY29kZXsjMn19e29mICMxfSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKK1xiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtcZGVmY3Z0eXBlIG9mICMxfSUKK1xkZWZ2YXJhcmdzIHsjM31cZW5kZ3JvdXAgJQorfQorCislIEBkZWZpdmFyID09IEBkZWZjdiB7SW5zdGFuY2UgVmFyaWFibGV9CisKK1xkZWZcZGVmaXZhcntcZGVmbWV0aHBhcnNlYm9keVxFZGVmaXZhclxkZWZpdmFyeFxkZWZpdmFyaGVhZGVyfQorCitcZGVmXGRlZml2YXJoZWFkZXIgIzEjMiMzeyUKK1xkb3N1YmluZCB7dnJ9e1xjb2RleyMyfX17b2YgIzF9JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAorXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9e0luc3RhbmNlIHZhcmlhYmxlIG9mICMxfSUKK1xkZWZ2YXJhcmdzIHsjM31cZW5kZ3JvdXAgJQorfQorCislIFRoZXNlIGRlZmluaXRpb25zIGFyZSBydW4gaWYgeW91IHVzZSBAZGVmbWV0aG9keCwgZXRjLiwKKyUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZtZXRob2QsIGV0Yy4KKworXGRlZlxkZWZvcHggIzEge1xlcnJtZXNzYWdle0BkZWZvcHggaW4gaW52YWxpZCBjb250ZXh0fX0KK1xkZWZcZGVmbWV0aG9keCAjMSB7XGVycm1lc3NhZ2V7QGRlZm1ldGhvZHggaW4gaW52YWxpZCBjb250ZXh0fX0KK1xkZWZcZGVmY3Z4ICMxIHtcZXJybWVzc2FnZXtAZGVmY3Z4IGluIGludmFsaWQgY29udGV4dH19CitcZGVmXGRlZml2YXJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmaXZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KKworJSBOb3cgQGRlZnZhcgorCislIEZpcnN0LCBkZWZpbmUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyB3YW50ZWQgZm9yIGFyZ3VtZW50cyBvZiBAZGVmdmFyLgorJSBUaGlzIGlzIGFjdHVhbGx5IHNpbXBsZToganVzdCBwcmludCB0aGVtIGluIHJvbWFuLgorJSBUaGlzIG11c3QgZXhwYW5kIHRoZSBhcmdzIGFuZCB0ZXJtaW5hdGUgdGhlIHBhcmFncmFwaCB0aGV5IG1ha2UgdXAKK1xkZWZcZGVmdmFyYXJncyAjMXtcbm9ybWFscGFyZW5zICMxJQorXGludGVybGluZXBlbmFsdHk9MTAwMDAKK1xlbmRncmFmXHZza2lwIC1ccGFyc2tpcCBccGVuYWx0eSAxMDAwMH0KKworJSBAZGVmdnIgQ291bnRlciBmb28tY291bnQKKworXGRlZlxkZWZ2cntcZGVmbWV0aHBhcnNlYm9keVxFZGVmdnJcZGVmdnJ4XGRlZnZyaGVhZGVyfQorCitcZGVmXGRlZnZyaGVhZGVyICMxIzIjM3tcZG9pbmQge3ZyfXtcY29kZXsjMn19JQorXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9eyMxfVxkZWZ2YXJhcmdzeyMzfVxlbmRncm91cH0KKworJSBAZGVmdmFyID09IEBkZWZ2ciBWYXJpYWJsZQorCitcZGVmXGRlZnZhcntcZGVmcGFyc2Vib2R5XEVkZWZ2YXJcZGVmdmFyeFxkZWZ2YXJoZWFkZXJ9CisKK1xkZWZcZGVmdmFyaGVhZGVyICMxIzJ7XGRvaW5kIHt2cn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKK1xiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtWYXJpYWJsZX0lCitcZGVmdmFyYXJncyB7IzJ9XGVuZGdyb3VwICUKK30KKworJSBAZGVmb3B0ID09IEBkZWZ2ciB7VXNlciBPcHRpb259CisKK1xkZWZcZGVmb3B0e1xkZWZwYXJzZWJvZHlcRWRlZm9wdFxkZWZvcHR4XGRlZm9wdGhlYWRlcn0KKworXGRlZlxkZWZvcHRoZWFkZXIgIzEjMntcZG9pbmQge3ZyfXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAorXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1VzZXIgT3B0aW9ufSUKK1xkZWZ2YXJhcmdzIHsjMn1cZW5kZ3JvdXAgJQorfQorCislIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdmFyeAorJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnZhciBvciBAZGVmdmFyeC4KKworXGRlZlxkZWZ2cnggIzEge1xlcnJtZXNzYWdle0BkZWZ2cnggaW4gaW52YWxpZCBjb250ZXh0fX0KK1xkZWZcZGVmdmFyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KK1xkZWZcZGVmb3B0eCAjMSB7XGVycm1lc3NhZ2V7QGRlZm9wdHggaW4gaW52YWxpZCBjb250ZXh0fX0KKworJSBOb3cgZGVmaW5lIEBkZWZ0cAorJSBBcmdzIGFyZSBwcmludGVkIGluIGJvbGQsIGEgc2xpZ2h0IGRpZmZlcmVuY2UgZnJvbSBAZGVmdmFyLgorCitcZGVmXGRlZnRwYXJncyAjMXtcYmYgXGRlZnZhcmFyZ3N7IzF9fQorCislIEBkZWZ0cCBDbGFzcyB3aW5kb3cgaGVpZ2h0IHdpZHRoIC4uLgorCitcZGVmXGRlZnRwe1xkZWZtZXRocGFyc2Vib2R5XEVkZWZ0cFxkZWZ0cHhcZGVmdHBoZWFkZXJ9CisKK1xkZWZcZGVmdHBoZWFkZXIgIzEjMiMze1xkb2luZCB7dHB9e1xjb2RleyMyfX0lCitcYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17IzF9XGRlZnRwYXJnc3sjM31cZW5kZ3JvdXB9CisKKyUgVGhpcyBkZWZpbml0aW9uIGlzIHJ1biBpZiB5b3UgdXNlIEBkZWZ0cHgsIGV0YworJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnRwLCBldGMuCisKK1xkZWZcZGVmdHB4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHB4IGluIGludmFsaWQgY29udGV4dH19CisKK1xtZXNzYWdle2Nyb3NzIHJlZmVyZW5jZSx9CislIERlZmluZSBjcm9zcy1yZWZlcmVuY2UgbWFjcm9zCitcbmV3d3JpdGUgXGF1eGZpbGUKKworJSBcc2V0cmVme2Zvb30gZGVmaW5lcyBhIGNyb3NzLXJlZmVyZW5jZSBwb2ludCBuYW1lZCBmb28uCisKK1xkZWZcc2V0cmVmIzF7JQorXGRvc2V0cXsjMS1wZ317WXBhZ2VudW1iZXJ9JQorXGRvc2V0cXsjMS1zbnR9e1lzZWN0aW9ubnVtYmVyYW5kdHlwZX19CisKK1xkZWZcdW5udW1ic2V0cmVmIzF7JQorXGRvc2V0cXsjMS1wZ317WXBhZ2VudW1iZXJ9JQorXGRvc2V0cXsjMS1zbnR9e1lub3RoaW5nfX0KKworJSBceHJlZiBhbmQgXHB4cmVmIGdlbmVyYXRlIGNyb3NzIHJlZmVyZW5jZXMgdG8gc3BlY2lmaWVkIHBvaW50cy4KKworXGRlZlxweHJlZiAjMXtzZWUgXHhyZWZYIFsjMSwsLCwsLCxdfQorXGRlZlx4cmVmICMxe1NlZSBceHJlZlggWyMxLCwsLCwsLF19CitcZGVmXHhyZWZYIFsjMSwjMiwjMywjNCwjNSwjNl17JQorXHNldGJveDE9XGhib3h7XGl7XGxvc2VzcGFjZSM1e319fSUKK1xzZXRib3gwPVxoYm94e1xsb3Nlc3BhY2UjM3t9fSUKK1xpZmRpbSBcd2QwID0wcHQgXHNldGJveDA9XGhib3h7XGxvc2VzcGFjZSMxe319XGZpJQorXGlmZGltIFx3ZDEgPjBwdCUKK3NlY3Rpb24gXHVuaGJveDB7fSBpbiBcdW5oYm94MSUKK1xlbHNlJQorXHJlZnh7IzEtc250fSBbXHVuaGJveDBdLCBwYWdlXHRpZSBccmVmeHsjMS1wZ30lCitcZmkgfQorCislIFxkb3NldHEgaXMgdGhlIGludGVyZmFjZSBmb3IgY2FsbHMgZnJvbSBvdGhlciBtYWNyb3MKKworXGRlZlxkb3NldHEgIzEjMnt7XGxldFxmb2xpbz0wJQorXGVkZWZcbmV4dHtcd3JpdGVcYXV4ZmlsZXtcaW50ZXJuYWxzZXRxIHsjMX17IzJ9fX0lCitcbmV4dH19CisKKyUgXGludGVybmFsc2V0cSB7Zm9vfXtwYWdlfSBleHBhbmRzIGludG8gQ0hBUkFDVEVSUyAneHJkZWYge2Zvb317Li4uZXhwYW5zaW9uIG9mIFxZcGFnZS4uLn0KKyUgV2hlbiB0aGUgYXV4IGZpbGUgaXMgcmVhZCwgJyBpcyB0aGUgZXNjYXBlIGNoYXJhY3RlcgorCitcZGVmXGludGVybmFsc2V0cSAjMSMyeyd4cmRlZiB7IzF9e1xjc25hbWUgIzJcZW5kY3NuYW1lfX0KKworJSBUaGluZ3MgdG8gYmUgZXhwYW5kZWQgYnkgXGludGVybmFsc2V0cQorCitcZGVmXFlwYWdlbnVtYmVye1xmb2xpb30KKworXGRlZlxZbm90aGluZ3t9CisKK1xkZWZcWXNlY3Rpb25udW1iZXJhbmR0eXBleyUKK1xpZm51bVxzZWNubz0wIGNoYXB0ZXJceHJlZnRpZVx0aGVcY2hhcG5vICUKK1xlbHNlIFxpZm51bSBcc3Vic2Vjbm89MCBzZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vICUKK1xlbHNlIFxpZm51bSBcc3Vic3Vic2Vjbm89MCAlCitzZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8gJQorXGVsc2UgJQorc2VjdGlvblx4cmVmdGllXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm8gJQorXGZpIFxmaSBcZmkgfQorCitcZ2RlZlx4cmVmdGlleyd0aWV9CisKKyUgRGVmaW5lIEByZWZ4IHRvIHJlZmVyZW5jZSBhIHNwZWNpZmljIGNyb3NzLXJlZmVyZW5jZSBzdHJpbmcuCisKK1xkZWZccmVmeCMxeyUKK3slCitcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBYIzFcZW5kY3NuYW1lXHJlbGF4CislIElmIG5vdCBkZWZpbmVkLCBzYXkgc29tZXRoaW5nIGF0IGxlYXN0LgorXGV4cGFuZGFmdGVyXGdkZWZcY3NuYW1lIFgjMVxlbmRjc25hbWUgeyQ8JHVuZGVmaW5lZCQ+JH0lCitcbWVzc2FnZSB7V0FSTklORzogQ3Jvc3MtcmVmZXJlbmNlICIjMSIgdXNlZCBidXQgbm90IHlldCBkZWZpbmVkfSUKK1xtZXNzYWdlIHt9JQorXGZpICUKK1xjc25hbWUgWCMxXGVuZGNzbmFtZSAlSXQncyBkZWZpbmVkLCBzbyBqdXN0IHVzZSBpdC4KK319CisKKyUgUmVhZCB0aGUgbGFzdCBleGlzdGluZyBhdXggZmlsZSwgaWYgYW55LiAgTm8gZXJyb3IgaWYgbm9uZSBleGlzdHMuCisKKyUgVGhpcyBpcyB0aGUgbWFjcm8gaW52b2tlZCBieSBlbnRyaWVzIGluIHRoZSBhdXggZmlsZS4KK1xkZWZceHJkZWYgIzEjMnsKK3tcY2F0Y29kZWBcJz1cb3RoZXJcZXhwYW5kYWZ0ZXIgXGdkZWYgXGNzbmFtZSBYIzFcZW5kY3NuYW1lIHsjMn19fQorCit7CitcY2F0Y29kZSBgXF5eQD1cb3RoZXIKK1xjYXRjb2RlIGBcAT1cb3RoZXIKK1xjYXRjb2RlIGBcAj1cb3RoZXIKK1xjYXRjb2RlIGBcXl5DPVxvdGhlcgorXGNhdGNvZGUgYFxeXkQ9XG90aGVyCitcY2F0Y29kZSBgXF5eRT1cb3RoZXIKK1xjYXRjb2RlIGBcXl5GPVxvdGhlcgorXGNhdGNvZGUgYFxeXkc9XG90aGVyCitcY2F0Y29kZSBgXF5eSD1cb3RoZXIKK1xjYXRjb2RlIGBcCz1cb3RoZXIKK1xjYXRjb2RlIGBcXl5MPVxvdGhlcgorXGNhdGNvZGUgYFwOPVxvdGhlcgorXGNhdGNvZGUgYFwPPVxvdGhlcgorXGNhdGNvZGUgYFwQPVxvdGhlcgorXGNhdGNvZGUgYFwRPVxvdGhlcgorXGNhdGNvZGUgYFwSPVxvdGhlcgorXGNhdGNvZGUgYFwTPVxvdGhlcgorXGNhdGNvZGUgYFwUPVxvdGhlcgorXGNhdGNvZGUgYFwVPVxvdGhlcgorXGNhdGNvZGUgYFwWPVxvdGhlcgorXGNhdGNvZGUgYFwXPVxvdGhlcgorXGNhdGNvZGUgYFwYPVxvdGhlcgorXGNhdGNvZGUgYFwZPVxvdGhlcgorXGNhdGNvZGUgYFwaPVxvdGhlcgorXGNhdGNvZGUgYFxeXls9XG90aGVyCitcY2F0Y29kZSBgXF5eXD1cb3RoZXIKK1xjYXRjb2RlIGBcXl5dPVxvdGhlcgorXGNhdGNvZGUgYFxeXl49XG90aGVyCitcY2F0Y29kZSBgXF5eXz1cb3RoZXIKK1xjYXRjb2RlIGBcQD1cb3RoZXIKK1xjYXRjb2RlIGBcXj1cb3RoZXIKK1xjYXRjb2RlIGBcfj1cb3RoZXIKK1xjYXRjb2RlIGBcWz1cb3RoZXIKK1xjYXRjb2RlIGBcXT1cb3RoZXIKK1xjYXRjb2RlYFwiPVxvdGhlcgorXGNhdGNvZGVgXF89XG90aGVyCitcY2F0Y29kZWBcfD1cb3RoZXIKK1xjYXRjb2RlYFw8PVxvdGhlcgorXGNhdGNvZGVgXD49XG90aGVyCitcY2F0Y29kZSBgXCQ9XG90aGVyCitcY2F0Y29kZSBgXCM9XG90aGVyCitcY2F0Y29kZSBgXCY9XG90aGVyCisKKyUgdGhlIGF1eCBmaWxlIHVzZXMgJyBhcyB0aGUgZXNjYXBlLgorJSBUdXJuIG9mZiBcIGFzIGFuIGVzY2FwZSBzbyB3ZSBkbyBub3QgbG9zZSBvbgorJSBlbnRyaWVzIHdoaWNoIHdlcmUgZHVtcGVkIHdpdGggY29udHJvbCBzZXF1ZW5jZXMgaW4gdGhlaXIgbmFtZXMuCislIEZvciBleGFtcGxlLCAneHJkZWYgeyRcbGVxICQtZnVufXtwYWdlIC4uLn0gbWFkZSBieSBAZGVmdW4gXl4KKyUgUmVmZXJlbmNlIHRvIHN1Y2ggZW50cmllcyBzdGlsbCBkb2VzIG5vdCB3b3JrIHRoZSB3YXkgb25lIHdvdWxkIHdpc2gsCislIGJ1dCBhdCBsZWFzdCB0aGV5IGRvIG5vdCBib21iIG91dCB3aGVuIHRoZSBhdXggZmlsZSBpcyByZWFkIGluLgorCitcY2F0Y29kZSBgXHs9MSBcY2F0Y29kZSBgXH09MgorXGNhdGNvZGUgYFwlPVxvdGhlcgorXGNhdGNvZGUgYFwnPTAKK1xjYXRjb2RlIGBcXD1cb3RoZXIKKworJ29wZW5pbiAxICdqb2JuYW1lLmF1eAorJ2lmZW9mIDEgJ2Vsc2UgJ2Nsb3NlaW4gMSAnaW5wdXQgJ2pvYm5hbWUuYXV4CisnZmkKK30KKworJSBPcGVuIHRoZSBuZXcgYXV4IGZpbGUuICBUZXggd2lsbCBjbG9zZSBpdCBhdXRvbWF0aWNhbGx5IGF0IGV4aXQuCisKK1xvcGVub3V0IFxhdXhmaWxlPVxqb2JuYW1lLmF1eAorCislIEZvb3Rub3Rlcy4KKworXG5ld2NvdW50IFxmb290bm90ZW5vCisKK1xkZWZcc3VwZXJlamVjdHtccGFyXHBlbmFsdHkgLTIwMDAwXGZvb3Rub3Rlbm8gPTAgfQorCitcbGV0XHB0ZXhmb290bm90ZT1cZm9vdG5vdGUKKwore1xjYXRjb2RlIGBcQD0xMQorXGdkZWZcZm9vdG5vdGV7XGdsb2JhbFxhZHZhbmNlIFxmb290bm90ZW5vIGJ5IFxAbmUKK1xlZGVmXHRoaXNmb290bm97JF57XHRoZVxmb290bm90ZW5vfSR9JQorXGxldFxAc2ZcZW1wdHkKK1xpZmhtb2RlXGVkZWZcQHNme1xzcGFjZWZhY3Rvclx0aGVcc3BhY2VmYWN0b3J9XC9cZmkKK1x0aGlzZm9vdG5vXEBzZlxwYXJzZWFyZ1xmb290bm90ZXp6en0KKworXGdkZWZcZm9vdG5vdGV6enogIzF7XGluc2VydFxmb290aW5zeworXGludGVybGluZXBlbmFsdHlcaW50ZXJmb290bm90ZWxpbmVwZW5hbHR5Citcc3BsaXR0b3Bza2lwXGh0XHN0cnV0Ym94ICUgdG9wIGJhc2VsaW5lIGZvciBicm9rZW4gZm9vdG5vdGVzCitcc3BsaXRtYXhkZXB0aFxkcFxzdHJ1dGJveCBcZmxvYXRpbmdwZW5hbHR5XEBNTQorXGxlZnRza2lwXHpAc2tpcCBccmlnaHRza2lwXHpAc2tpcCBcc3BhY2Vza2lwXHpAc2tpcCBceHNwYWNlc2tpcFx6QHNraXAKK1xmb290c3RydXRcaGFuZ1x0ZXh0aW5kZW50e1x0aGlzZm9vdG5vfSMxXHN0cnV0fX0KKworfSVlbmQgXGNhdGNvZGUgYFxAPTExCisKKyUgRW5kIG9mIGNvbnRyb2wgd29yZCBkZWZpbml0aW9ucy4KKworXG1lc3NhZ2V7YW5kIHR1cm5pbmcgb24gdGV4aW5mbyBpbnB1dCBmb3JtYXQufQorCitcbmV3aW5kZXh7Y3B9CitcbmV3Y29kZWluZGV4e2ZufQorXG5ld2NvZGVpbmRleHt2cn0KK1xuZXdjb2RlaW5kZXh7dHB9CitcbmV3Y29kZWluZGV4e2t5fQorXG5ld2NvZGVpbmRleHtwZ30KKworJSBTZXQgc29tZSBudW1lcmljIHN0eWxlIHBhcmFtZXRlcnMsIGZvciA4LjUgeCAxMSBmb3JtYXQuCisKK1xoc2l6ZSA9IDYuNWluCitccGFyaW5kZW50IDE1cHQKK1xwYXJza2lwIDE4cHQgcGx1cyAxcHQKK1xiYXNlbGluZXNraXAgMTVwdAorXGFkdmFuY2VcdG9wc2tpcCBieSAxLjJjbQorCislIFByZXZlbnQgdW5kZXJmdWxsIHZib3ggZXJyb3IgbWVzc2FnZXMuCitcdmJhZG5lc3M9MTAwMDAKKworJSBVc2UgQHNtYWxsYm9vayB0byByZXNldCBwYXJhbWV0ZXJzIGZvciA3eDkuNSBmb3JtYXQKK1xkZWZcc21hbGxib29reworXGdsb2JhbFxsaXNwbmFycm93aW5nID0gMC4zaW4KK1xnbG9iYWxcYmFzZWxpbmVza2lwIDEycHQKK1xnbG9iYWxccGFyc2tpcCAzcHQgcGx1cyAxcHQKK1xnbG9iYWxcaHNpemUgPSA1aW4KK1xnbG9iYWxcZG91YmxlY29sdW1uaHNpemU9Mi40aW4gXGdsb2JhbFxkb3VibGVjb2x1bW52c2l6ZT0xNS4waW4KK1xnbG9iYWxcdnNpemU9Ny41aW4KK1xnbG9iYWxcdG9sZXJhbmNlPTcwMAorXGdsb2JhbFxoZnV6ej0xcHQKKworXGdsb2JhbFxwYWdld2lkdGg9XGhzaXplCitcZ2xvYmFsXHBhZ2VoZWlnaHQ9XHZzaXplCitcZ2xvYmFsXGZvbnRcbmluZXR0PWNtdHQ5CisKK1xnbG9iYWxcbGV0XHNtYWxsbGlzcD1cc21hbGxsaXNweAorXGdsb2JhbFxsZXRcc21hbGxleGFtcGxlPVxzbWFsbGxpc3B4CitcZ2xvYmFsXGRlZlxFc21hbGxleGFtcGxle1xFc21hbGxsaXNwfQorfQorCislJSBGb3IgYSBmaW5hbCBjb3B5LCB0YWtlIG91dCB0aGUgcmVjdGFuZ2xlcworJSUgdGhhdCBtYXJrIG92ZXJmdWxsIGJveGVzIChpbiBjYXNlIHlvdSBoYXZlIGRlY2lkZWQKKyUlIHRoYXQgdGhlIHRleHQgbG9va3Mgb2sgZXZlbiB0aG91Z2ggaXQgcGFzc2VzIHRoZSBtYXJnaW4pLgorXGRlZlxmaW5hbG91dHtcb3ZlcmZ1bGxydWxlPTBwdH0KKworJSBUdXJuIG9mZiBhbGwgc3BlY2lhbCBjaGFyYWN0ZXJzIGV4Y2VwdCBACislIChhbmQgdGhvc2Ugd2hpY2ggdGhlIHVzZXIgY2FuIHVzZSBhcyBpZiB0aGV5IHdlcmUgb3JkaW5hcnkpCislIERlZmluZSBjZXJ0YWluIGNoYXJzIHRvIGJlIGFsd2F5cyBpbiB0dCBmb250LgorCitcY2F0Y29kZWBcIj1cYWN0aXZlCitcZGVmXGFjdGl2ZWRvdWJsZXF1b3Rle3tcdHQgXGNoYXIgJzA0Mn19CitcbGV0Ij1cYWN0aXZlZG91YmxlcXVvdGUKK1xjYXRjb2RlYFx+PVxhY3RpdmUKK1xkZWZ+e3tcdHQgXGNoYXIgJzE3Nn19CitcY2hhcmRlZlxoYXQ9YFxeCitcY2F0Y29kZWBcXj1cYWN0aXZlCitcZGVmXnt7XHR0IFxoYXR9fQorXGNhdGNvZGVgXF89XGFjdGl2ZQorXGRlZl97e1x0dCBcY2hhciAnMTM3fX0KK1xjYXRjb2RlYFx8PVxhY3RpdmUKK1xkZWZ8e3tcdHQgXGNoYXIgJzE3NH19CitcY2hhcmRlZiBcbGVzcz1gXDwKK1xjYXRjb2RlYFw8PVxhY3RpdmUKK1xkZWY8e3tcdHQgXGxlc3N9fQorXGNoYXJkZWYgXGd0cj1gXD4KK1xjYXRjb2RlYFw+PVxhY3RpdmUKK1xkZWY+e3tcdHQgXGd0cn19CisKK1xjYXRjb2RlYFxAPTAKKworJSBccmF3YmFja3NsYXNoeHggb3V0cHV0IG9uZSBiYWNrc2xhc2ggY2hhcmFjdGVyIGluIGN1cnJlbnQgZm9udAore1xjYXRjb2RlYFxcPVxvdGhlcgorQGdkZWZAcmF3YmFja3NsYXNoeHh7XH19CisKKyUgXHJhd2JhY2tzbGFzaCByZWRlZmluZXMgXCBhcyBpbnB1dCB0byBkbyBccmF3YmFja3NsYXNoeHguCit7XGNhdGNvZGVgXFw9XGFjdGl2ZQorQGdkZWZAcmF3YmFja3NsYXNoe0BsZXRcPUByYXdiYWNrc2xhc2h4eCB9fQorCislIFxub3JtYWxiYWNrc2xhc2ggb3V0cHV0cyBvbmUgYmFja3NsYXNoIGluIGZpeGVkIHdpZHRoIGZvbnQuCitcZGVmXG5vcm1hbGJhY2tzbGFzaHt7XHR0XHJhd2JhY2tzbGFzaHh4fX0KKworJSBTYXkgQGZvbywgbm90IFxmb28sIGluIGVycm9yIG1lc3NhZ2VzLgorXGVzY2FwZWNoYXI9YFxACisKKyUlIFRoZXNlIGxvb2sgb2sgaW4gYWxsIGZvbnRzLCBzbyBqdXN0IG1ha2UgdGhlbSBub3Qgc3BlY2lhbC4gIFRoZSBAcm0gYmVsb3cKKyUlIG1ha2VzIHN1cmUgdGhhdCB0aGUgY3VycmVudCBmb250IHN0YXJ0cyBvdXQgYXMgdGhlIG5ld2x5IGxvYWRlZCBjbXIxMAorXGNhdGNvZGVgXCQ9XG90aGVyIFxjYXRjb2RlYFwlPVxvdGhlciBcY2F0Y29kZWBcJj1cb3RoZXIgXGNhdGNvZGVgXCM9XG90aGVyCisKK1xjYXRjb2RlIDE3PTAgICBAYyBEZWZpbmUgY29udHJvbC1xCitcY2F0Y29kZWBcXD1cYWN0aXZlCitAbGV0XD1Abm9ybWFsYmFja3NsYXNoCisKK0B0ZXh0Zm9udHMKK0BybQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvZXQvdmZwcmludGYuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3ZmcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkYzFlOAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2V0L3ZmcHJpbnRmLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpdmZwcmludGYuYwk1LjIgKEJlcmtlbGV5KSA2LzI3Lzg4IjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpZiAhSEFWRV9WUFJJTlRGICYmIEhBVkVfRE9QUk5UCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx2YXJhcmdzLmg+CisKK2ludAordmZwcmludGYoaW9wLCBmbXQsIGFwKQorCUZJTEUgKmlvcDsKKwljaGFyICpmbXQ7CisJdmFfbGlzdCBhcDsKK3sKKwlpbnQgbGVuOworCWNoYXIgbG9jYWxidWZbQlVGU0laXTsKKworCWlmIChpb3AtPl9mbGFnICYgX0lPTkJGKSB7CisJCWlvcC0+X2ZsYWcgJj0gfl9JT05CRjsKKwkJaW9wLT5fcHRyID0gaW9wLT5fYmFzZSA9IGxvY2FsYnVmOworCQlsZW4gPSBfZG9wcm50KGZtdCwgYXAsIGlvcCk7CisJCSh2b2lkKSBmZmx1c2goaW9wKTsKKwkJaW9wLT5fZmxhZyB8PSBfSU9OQkY7CisJCWlvcC0+X2Jhc2UgPSBOVUxMOworCQlpb3AtPl9idWZzaXogPSAwOworCQlpb3AtPl9jbnQgPSAwOworCX0gZWxzZQorCQlsZW4gPSBfZG9wcm50KGZtdCwgYXAsIGlvcCk7CisKKwlyZXR1cm4gKGZlcnJvcihpb3ApID8gRU9GIDogbGVuKTsKK30KKyNlbmRpZiAvKiAhSEFWRV9WUFJJTlRGICovCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9mcG9wZW4uYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL2Zwb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjI1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9mcG9wZW4uYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIGZwb3Blbi5jIC0tLSB1bmxpa2UgdGhlIGxpYmMgcG9wZW4sIGl0IGRpcmVjdGx5IGV4ZWN1dGVzIHRoZQorICogY29tbWFuZCBpbnN0ZWFkIG9mIGNhbGwgb3V0IHRvIHRoZSBzaGVsbC4KKyAqCisgKiBDb3B5cmlnaHQgVGhlb2RvcmUgVHMnbywgMTk5Ni0xOTk5LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlIHRoaXMgZmlsZSBpcyBncmFudGVkIGZvciBhbnkgcHVycG9zZXMsIGFzIGxvbmcgYXMKKyAqIHRoaXMgY29weXJpZ2h0IHN0YXRlbWVudCBpcyBrZXB0IGludGFjdCBhbmQgdGhlIGF1dGhvciBpcyBub3QgaGVsZAorICogbGlhYmxlIGZvciBhbnkgZGFtYWdlcyByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgcHJvZ3JhbS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjZGVmaW5lIE1BWF9BUkdWIDI1NgorCitleHRlcm4gRklMRSAqZnBvcGVuKGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqbW9kZSk7CisKK0ZJTEUgKmZwb3Blbihjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisJY2hhcgkqYXJndltNQVhfQVJHVl07CisJaW50CWkgPSAwOworCWNoYXIJKmJ1ZiwgKnByb2cgPSAwOworCWNoYXIJKnA7CisJaW50CWRvX3N0ZGluLCBkb19zdGRlcnIgPSAwOworCWludAlmZHNbMl07CisJcGlkX3QJcGlkOworCisJaWYgKCFtb2RlKSB7CisJCWVycm5vID0gRUZBVUxUOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzd2l0Y2ggKCptb2RlKSB7CisJY2FzZSAncic6CisJCWRvX3N0ZGluID0gMDsKKwkJYnJlYWs7CisJY2FzZSAndyc6CisJCWRvX3N0ZGluID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiBOVUxMOworCX0KKwlzd2l0Y2ggKCoobW9kZSsxKSkgeworCWNhc2UgJyYnOgorCQlkb19zdGRlcnIgPSAxOworCX0KKworCS8qCisJICogQ3JlYXRlIHRoZSBhcmd2IHZlY3Rvci4uLi4KKwkgKi8KKwlidWYgPSBtYWxsb2Moc3RybGVuKGNtZCkrMSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCXN0cmNweShidWYsIGNtZCk7CisJcCA9IGJ1ZjsKKwl3aGlsZSAocCAmJiAqcCkgeworCQlpZiAoaXNzcGFjZSgqcCkpIHsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpID09IDApCisJCQlwcm9nID0gcDsKKwkJYXJndltpKytdID0gcDsKKwkJcCA9IHN0cmNocihwLCAnICcpOworCQlpZiAocCkKKwkJCSpwKysgPSAwOworCX0KKworCWFyZ3ZbaV0gPSAwOworCisJLyoKKwkgKiBHZXQgdGhlIHBpcGUKKwkgKi8KKwlpZiAocGlwZShmZHMpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBGb3JrIGFuZCBleGVjdXRlIHRoZSBjb3JyZWN0IHByb2dyYW0uICovCisJaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkgeworCQlwZXJyb3IoImZvcmsiKTsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChwaWQgPT0gMCkgeworCQlpZiAoZG9fc3RkaW4pIHsKKwkJCWNsb3NlKGZkc1sxXSk7CisJCQlkdXAyKGZkc1swXSwgMCk7CisJCX0gZWxzZSB7CisJCQljbG9zZShmZHNbMF0pOworCQkJZHVwMihmZHNbMV0sIDEpOworCQkJaWYgKGRvX3N0ZGVycikKKwkJCQlkdXAyKGZkc1sxXSwgMik7CisJCX0KKwkJKHZvaWQpIGV4ZWN2cChwcm9nLCBhcmd2KTsKKwkJcGVycm9yKHByb2cpOworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gZmRvcGVuKGRvX3N0ZGluID8gZmRzWzFdIDogZmRzWzBdLCBtb2RlKTsKK30KKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvTWFrZWZpbGUuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJiZGIxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyMjYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGxpYi9zcworIworCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAordG9wX2J1aWxkZGlyID0gLi4vLi4KK215X2RpciA9IGxpYi9zcworSU5TVEFMTCA9IEBJTlNUQUxMQAorRExPUEVOX0xJQiA9IEBETE9QRU5fTElCQAorCitATUNPTkZJR0AKKworTElCUkFSWT0gbGlic3MKK0xJQkRJUj0gc3MKKworRUxGX1ZFUlNJT04gPSAyLjAKK0VMRl9TT19WRVJTSU9OID0gMgorRUxGX0lNQUdFID0gbGlic3MKK0VMRl9NWURJUiA9IHNzCitFTEZfSU5TVEFMTF9ESVIgPSAkKHJvb3RfbGliZGlyKQorRUxGX09USEVSX0xJQlMgPSAtTC4uLy4uIC1sY29tX2VyciAkKERMT1BFTl9MSUIpCisKK0JTRExJQl9WRVJTSU9OID0gMS4wCitCU0RMSUJfSU1BR0UgPSBsaWJzcworQlNETElCX01ZRElSID0gc3MKK0JTRExJQl9JTlNUQUxMX0RJUiA9ICQocm9vdF9saWJkaXIpCisKK1RBR1M9ZXRhZ3MKK0NPTVBJTEVfRVQ9Li4vZXQvY29tcGlsZV9ldCAtLWJ1aWxkLXRyZWUKK01LX0NNRFM9X1NTX0RJUl9PVkVSUklERT0uIC4vbWtfY21kcworCisjIC1JLi4gaXMgc28gdGhhdCBzcy9zc19lcnIuaCB3b3JrcworIyAtSSQoc3JjZGlyKS8uLiBpcyBzbyB0aGF0IHNzL3NzLmggd29ya3MKKyMgLUkkKHNyY2RpcikvLi4vZXQgaXMgc28gY29tX2Vyci5oIHdvcmtzCitYVFJBX0NGTEFHUz0gLUkkKHNyY2RpcikvLi4vZXQKKworLmMubzoKKwkkKEUpICIJQ0MgJDwiCisJJChRKSAkKENDKSAkKEFMTF9DRkxBR1MpIC1jICQ8CitAUFJPRklMRV9DTVRACSQoUSkgJChDQykgJChBTExfQ0ZMQUdTKSAtZyAtcGcgLW8gcHJvZmlsZWQvJCoubyAtYyAkPAorQENIRUNLRVJfQ01UQAkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgLWNoZWNrZXIgLWcgLW8gY2hlY2tlci8kKi5vIC1jICQ8CitARUxGX0NNVEAJJChRKSAkKENDKSAkKEFMTF9DRkxBR1MpIC1EU0hBUkVEX0VMRl9MSUIgLWZQSUMgLW8gZWxmc2hhcmVkLyQqLm8gLWMgJDwKK0BCU0RMSUJfQ01UQAkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgJChCU0RMSUJfUElDX0ZMQUcpIC1vIHBpYy8kKi5vIC1jICQ8CisKKyMgZm9yIHRoZSBsaWJyYXJ5CisKKyMgd2l0aCBzc19lcnIubyBmaXJzdCwgc3NfZXJyLmggc2hvdWxkIGdldCByZWJ1aWx0IGZpcnN0IHRvby4gIHNob3VsZCBub3QKKyMgYmUgcmVseWluZyBvbiB0aGlzLCB0aG91Z2guCitPQkpTPQlzc19lcnIubyBcCisJc3RkX3Jxcy5vIFwKKwlpbnZvY2F0aW9uLm8gaGVscC5vIFwKKwlleGVjdXRlX2NtZC5vIGxpc3Rlbi5vIHBhcnNlLm8gZXJyb3IubyBwcm9tcHQubyBcCisJcmVxdWVzdF90YmwubyBsaXN0X3Jxcy5vIHBhZ2VyLm8gcmVxdWVzdHMubyBcCisJZGF0YS5vIGdldF9yZWFkbGluZS5vCisKK1NSQ1M9CSQoc3JjZGlyKS9pbnZvY2F0aW9uLmMgJChzcmNkaXIpL2hlbHAuYyBcCisJJChzcmNkaXIpL2V4ZWN1dGVfY21kLmMgJChzcmNkaXIpL2xpc3Rlbi5jICQoc3JjZGlyKS9wYXJzZS5jIFwKKwkkKHNyY2RpcikvZXJyb3IuYyAkKHNyY2RpcikvcHJvbXB0LmMgJChzcmNkaXIpL3JlcXVlc3RfdGJsLmMgXAorCSQoc3JjZGlyKS9saXN0X3Jxcy5jICQoc3JjZGlyKS9wYWdlci5jICQoc3JjZGlyKS9yZXF1ZXN0cy5jIFwKKwkkKHNyY2RpcikvZGF0YS5jICQoc3JjZGlyKS9nZXRfcmVhZGxpbmUuYworCithbGw6OiBta19jbWRzCisKK0BNQUtFRklMRV9MSUJSQVJZQAorQE1BS0VGSUxFX0VMRkAKK0BNQUtFRklMRV9CU0RMSUJACitATUFLRUZJTEVfUFJPRklMRUAKK0BNQUtFRklMRV9DSEVDS0VSQAorCitDT0RFPSAkKFNSQ1MpICQoTUtDTURTRklMRVMpCisKK01LQ01EU09CSlM9CW1rX2NtZHMubyB1dGlscy5vIG9wdGlvbnMubyBjdC50YWIubyBjbWRfdGJsLmxleC5vCisKK01LQ01EU0ZJTEVTPQlta19jbWRzLmMgdXRpbHMuYyBvcHRpb25zLmMgY3QueSBjbWRfdGJsLmxleC5sCisKK01LQ01EU0NTUkNTPQlta19jbWRzLmMgdXRpbHMuYyBvcHRpb25zLmMgY3QudGFiLmMgY21kX3RibC5sZXguYworCisKK0hGSUxFUz0Jc3MuaCBzc19pbnRlcm5hbC5oCitTSEFSRV9GSUxFUz0gY3RfYy5hd2sgY3RfYy5zZWQKKworSU5TVEFMTF9IRklMRVM9CXNzLmggCisKKyMgZm9yICd0YWdzJyBhbmQgZGVwZW5kZW5jaWVzCisKK0NGSUxFUz0JJChTUkNTKSAkKE1LQ01EU0NTUkNTKSB0ZXN0X3NzLmMKKworIyBmb3IgYnVpbGRpbmcgYXJjaGl2ZXMKKworRklMRVM9CSQoU1JDUykgJChNS0NNRFNGSUxFUykgJChIRklMRVMpIFwKKwlzc19lcnIuZXQgc3RkX3Jxcy5jdCBNYWtlZmlsZSBcCisJdGVzdF9zcy5jIHNzIAorCithbGw6OglsaWJzcy5hIHNzLnBjICMgbGlic3NfcC5hIGxpbnQKKworc3RkX3Jxcy5jOiBzdGRfcnFzLmN0IG1rX2NtZHMKKwkkKEUpICIJTUtfQ01EUyAkQCIKKwkkKFEpIERJUj0kKHNyY2RpcikgJChNS19DTURTKSAkKHNyY2Rpcikvc3RkX3Jxcy5jdAorCitzdGRfcnFzLm86IHNzX2Vyci5oCisKK3Rlc3RfY21kLmM6IHRlc3RfY21kLmN0IG1rX2NtZHMKKwkkKEUpICIJTUtfQ01EUyAkQCIKKwkkKFEpIERJUj0kKHNyY2RpcikgJChNS19DTURTKSAkKHNyY2RpcikvdGVzdF9jbWQuY3QKKworc3NfZXJyLmMgc3NfZXJyLmg6IHNzX2Vyci5ldAorCSQoRSkgIglDT01QSUxFX0VUIHNzX2Vyci5ldCIKKwkkKFEpICQoQ09NUElMRV9FVCkgJChzcmNkaXIpL3NzX2Vyci5ldAorCitjdC50YWIuYyBjdC50YWIuaDogY3QueQorCSQoUk0pIC1mIGN0LnRhYi4qIHkuKgorCSQoWUFDQykgLWQgJChzcmNkaXIpL2N0LnkKKwkkKE1WKSAtZiB5LnRhYi5jIGN0LnRhYi5jCisJJChNVikgLWYgeS50YWIuaCBjdC50YWIuaAorCisjbGlic3MubzoJJChPQkpTKQorIwkkKExEKSAtciAtcyAtbyAkQCAkKE9CSlMpCisjCSQoQ0hNT0QpIC14ICRACisKK21rX2NtZHM6ICQoREVQX1NVQlNUSVRVVEUpICQoc3JjZGlyKS9ta19jbWRzLnNoLmluCisJJChFKSAiCVNVQlNUICRAIgorCSQoUSkgJChTVUJTVElUVVRFKSAkKHNyY2RpcikvbWtfY21kcy5zaC5pbiBta19jbWRzCisJJChRKSAkKENITU9EKSAreCBta19jbWRzCisKK3NzLnBjOiAkKHNyY2Rpcikvc3MucGMuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwkkKEUpICIJQ09ORklHLlNUQVRVUyAkQCIKKwkkKFEpIGNkICQodG9wX2J1aWxkZGlyKTsgQ09ORklHX0ZJTEVTPWxpYi9zcy9zcy5wYyAuL2NvbmZpZy5zdGF0dXMKKworaW5zdGFsbGRpcnM6OgorCSQoRSkgIglNS0lOU1RBTExESVJTICQobGliZGlyKSAkKGluY2x1ZGVkaXIpL3NzICQoZGF0YWRpcikvc3MgJChiaW5kaXIpIgorCSQoUSkgJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChsaWJkaXIpIFwKKwkJJChERVNURElSKSQoaW5jbHVkZWRpcikvc3MgJChERVNURElSKSQoZGF0YWRpcikvc3MgXAorCQkkKERFU1RESVIpJChiaW5kaXIpICQoREVTVERJUikkKGxpYmRpcikvcGtnY29uZmlnCisKK2luc3RhbGw6OiBsaWJzcy5hICQoSU5TVEFMTF9IRklMRVMpIGluc3RhbGxkaXJzIHNzX2Vyci5oIG1rX2NtZHMgc3MucGMKKwkkKEUpICIJSU5TVEFMTF9EQVRBICQoREVTVERJUikkKGxpYmRpcikvbGlic3MuYSIKKwkkKFEpICQoSU5TVEFMTF9EQVRBKSBsaWJzcy5hICQoREVTVERJUikkKGxpYmRpcikvbGlic3MuYQorCS0kKFEpICQoUkFOTElCKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYnNzLmEKKwkkKFEpICQoQ0hNT0QpICQoTElCTU9ERSkgJChERVNURElSKSQobGliZGlyKS9saWJzcy5hCisJJChRKSAkKFJNKSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9zcy8qCisJJChRKSBmb3IgaSBpbiAkKElOU1RBTExfSEZJTEVTKTsgZG8gXAorCQllY2hvICIJSU5TVEFMTF9EQVRBICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3NzLyQkaSI7IFwKKwkJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGkgJChERVNURElSKSQoaW5jbHVkZWRpcikvc3MvJCRpOyBcCisJZG9uZQorCSQoRSkgIglJTlNUQUxMX0RBVEEgJChpbmNsdWRlZGlyKS9zcy9zc19lcnIuaCIKKwkkKFEpICQoSU5TVEFMTF9EQVRBKSBzc19lcnIuaCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9zcy9zc19lcnIuaAorCSQoUSkgZm9yIGkgaW4gJChTSEFSRV9GSUxFUyk7IGRvIFwKKwkJZWNobyAiCUlOU1RBTExfREFUQSAkKERFU1RESVIpJChkYXRhZGlyKS9zcy8kJGkiOyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRpICQoREVTVERJUikkKGRhdGFkaXIpL3NzLyQkaTsgXAorCWRvbmUKKwkkKEUpICIJSU5TVEFMTCAkKGJpbmRpcikvbWtfY21kcyIKKwkkKFEpICQoSU5TVEFMTCkgbWtfY21kcyAkKERFU1RESVIpJChiaW5kaXIpL21rX2NtZHMKKwkkKEUpICIJSU5TVEFMTF9EQVRBICQobWFuMWRpcikvbWtfY21kcy4xIgorCSQoUSkgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9ta19jbWRzLjEgJChERVNURElSKSQobWFuMWRpcikvbWtfY21kcy4xCisJJChFKSAiCUlOU1RBTExfREFUQSAkKGxpYmRpcikvcGtnY29uZmlnL3NzLnBjIgorCSQoUSkgJChJTlNUQUxMX0RBVEEpIHNzLnBjICQoREVTVERJUikkKGxpYmRpcikvcGtnY29uZmlnL3NzLnBjCisKK3VuaW5zdGFsbDo6CisJJChSTSkgLWYgJChERVNURElSKSQobGliZGlyKS9saWJzcy5hICQoREVTVERJUikkKGJpbmRpcikvbWtfY21kcyBcCisJCSQoREVTVERJUikkKGxpYmRpcikvcGtnY29uZmlnL3NzLnBjIFwKKwkJJChERVNURElSKSQobWFuMWRpcikvbWtfY21kcy4xIAorCSQoUk0pIC1yZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9zcyAkKERFU1RESVIpJChkYXRhZGlyKS9zcworCit0ZXN0X3NzOiB0ZXN0X3NzLm8gdGVzdF9jbWQubyAkKERFUExJQlNTKSAkKERFUExJQkNPTV9FUlIpCisJJChFKSAiCUxEICRAIgorCSQoUSkgJChDQykgLW8gJEAgdGVzdF9zcy5vIHRlc3RfY21kLm8gJChBTExfQ0ZMQUdTKSBcCisJCSQoTElCU1MpICQoTElCQ09NX0VSUikKKworY2hlY2s6OiBhbGwgdGVzdF9zcworCSQoRSkgIglSVU4gVEVTVCB0ZXN0X3NzIgorCS1AKExEX0xJQlJBUllfUEFUSD0kKExJQikgRFlMRF9MSUJSQVJZX1BBVEg9JChMSUIpIC4vdGVzdF9zcyAtZiAkKHNyY2RpcikvdGVzdF9zY3JpcHQgPiB0ZXN0X291dCAyPiYxOyBleGl0IDApCisJJChRKSBpZiBkaWZmIHRlc3Rfb3V0ICQoc3JjZGlyKS90ZXN0X3NjcmlwdF9leHBlY3RlZCA+IHRlc3QuZGlmZjsgdGhlbiBcCisJCXRydWUgOyBlbHNlIGVjaG8gIlJlZ3Jlc3Npb24gdGVzdCBmb3Igc3MgbGlicmFyeSBmYWlsZWQhIjsgZXhpdCAxIDsgZmkKKworY2xlYW46OgorCSQoUk0pIC1mIC4uL2xpYnNzLmEgbGlic3MuYSBta19jbWRzIHNzX2Vyci5oIHNzX2Vyci5jIHN0ZF9ycXMuYyBcCisJCXRzdF9jbWRzLmMgdGVzdF9zcyB0ZXN0X291dCB0ZXN0LmRpZmYgKi5vICp+IFwjKiAqLmJhayBjb3JlIFwKKwkJdGVzdF9jbWQuYworCittb3N0bHljbGVhbjo6IGNsZWFuCitkaXN0Y2xlYW46OiBjbGVhbgorCSQoUk0pIC1mIC5kZXBlbmQgTWFrZWZpbGUgc3MucGMgXAorCQkkKHNyY2RpcikvVEFHUyAkKHNyY2RpcikvTWFrZWZpbGUuaW4ub2xkCisKKyMKKyMgSGFjayB0byBwYXJhbGxlbCBtYWtlcyByZWNvZ25pemUgZGVwZW5kZW5jaWVzIGNvcnJlY3RseS4KKyMKKyQodG9wX2J1aWxkZGlyKS9saWIvc3Mvc3NfZXJyLmg6IHNzX2Vyci5oCisKKyQoT0JKUyk6IHN1YmRpcnMKKworIyArKysgRGVwZW5kZW5jeSBsaW5lIGVhdGVyICsrKworIyAKKyMgTWFrZWZpbGUgZGVwZW5kZW5jaWVzIGZvbGxvdy4gIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBzZWN0aW9uIGluCisjIHRoZSBNYWtlZmlsZS5pbiBmaWxlCisjCitpbnZvY2F0aW9uLm86ICQoc3JjZGlyKS9pbnZvY2F0aW9uLmMgJChzcmNkaXIpL3NzX2ludGVybmFsLmggJChzcmNkaXIpL3NzLmggXAorICQodG9wX2J1aWxkZGlyKS9saWIvc3Mvc3NfZXJyLmggJCh0b3Bfc3JjZGlyKS9saWIvZXQvY29tX2Vyci5oCitoZWxwLm86ICQoc3JjZGlyKS9oZWxwLmMgJChzcmNkaXIpL3NzX2ludGVybmFsLmggJChzcmNkaXIpL3NzLmggXAorICQodG9wX2J1aWxkZGlyKS9saWIvc3Mvc3NfZXJyLmggJCh0b3Bfc3JjZGlyKS9saWIvZXQvY29tX2Vyci5oCitleGVjdXRlX2NtZC5vOiAkKHNyY2RpcikvZXhlY3V0ZV9jbWQuYyAkKHNyY2Rpcikvc3NfaW50ZXJuYWwuaCAkKHNyY2Rpcikvc3MuaCBcCisgJCh0b3BfYnVpbGRkaXIpL2xpYi9zcy9zc19lcnIuaCAkKHRvcF9zcmNkaXIpL2xpYi9ldC9jb21fZXJyLmgKK2xpc3Rlbi5vOiAkKHNyY2RpcikvbGlzdGVuLmMgJChzcmNkaXIpL3NzX2ludGVybmFsLmggJChzcmNkaXIpL3NzLmggXAorICQodG9wX2J1aWxkZGlyKS9saWIvc3Mvc3NfZXJyLmggJCh0b3Bfc3JjZGlyKS9saWIvZXQvY29tX2Vyci5oCitwYXJzZS5vOiAkKHNyY2RpcikvcGFyc2UuYyAkKHNyY2Rpcikvc3NfaW50ZXJuYWwuaCAkKHNyY2Rpcikvc3MuaCBcCisgJCh0b3BfYnVpbGRkaXIpL2xpYi9zcy9zc19lcnIuaCAkKHRvcF9zcmNkaXIpL2xpYi9ldC9jb21fZXJyLmgKK2Vycm9yLm86ICQoc3JjZGlyKS9lcnJvci5jICQodG9wX3NyY2RpcikvbGliL2V0L2NvbV9lcnIuaCBcCisgJChzcmNkaXIpL3NzX2ludGVybmFsLmggJChzcmNkaXIpL3NzLmggJCh0b3BfYnVpbGRkaXIpL2xpYi9zcy9zc19lcnIuaCBcCisgJCh0b3Bfc3JjZGlyKS9saWIvZXQvY29tX2Vyci5oCitwcm9tcHQubzogJChzcmNkaXIpL3Byb21wdC5jICQoc3JjZGlyKS9zc19pbnRlcm5hbC5oICQoc3JjZGlyKS9zcy5oIFwKKyAkKHRvcF9idWlsZGRpcikvbGliL3NzL3NzX2Vyci5oICQodG9wX3NyY2RpcikvbGliL2V0L2NvbV9lcnIuaAorcmVxdWVzdF90YmwubzogJChzcmNkaXIpL3JlcXVlc3RfdGJsLmMgJChzcmNkaXIpL3NzX2ludGVybmFsLmggJChzcmNkaXIpL3NzLmggXAorICQodG9wX2J1aWxkZGlyKS9saWIvc3Mvc3NfZXJyLmggJCh0b3Bfc3JjZGlyKS9saWIvZXQvY29tX2Vyci5oCitsaXN0X3Jxcy5vOiAkKHNyY2RpcikvbGlzdF9ycXMuYyAkKHNyY2Rpcikvc3NfaW50ZXJuYWwuaCAkKHNyY2Rpcikvc3MuaCBcCisgJCh0b3BfYnVpbGRkaXIpL2xpYi9zcy9zc19lcnIuaCAkKHRvcF9zcmNkaXIpL2xpYi9ldC9jb21fZXJyLmgKK3BhZ2VyLm86ICQoc3JjZGlyKS9wYWdlci5jICQoc3JjZGlyKS9zc19pbnRlcm5hbC5oICQoc3JjZGlyKS9zcy5oIFwKKyAkKHRvcF9idWlsZGRpcikvbGliL3NzL3NzX2Vyci5oICQodG9wX3NyY2RpcikvbGliL2V0L2NvbV9lcnIuaAorcmVxdWVzdHMubzogJChzcmNkaXIpL3JlcXVlc3RzLmMgJChzcmNkaXIpL3NzX2ludGVybmFsLmggJChzcmNkaXIpL3NzLmggXAorICQodG9wX2J1aWxkZGlyKS9saWIvc3Mvc3NfZXJyLmggJCh0b3Bfc3JjZGlyKS9saWIvZXQvY29tX2Vyci5oCitkYXRhLm86ICQoc3JjZGlyKS9kYXRhLmMgJChzcmNkaXIpL3NzX2ludGVybmFsLmggJChzcmNkaXIpL3NzLmggXAorICQodG9wX2J1aWxkZGlyKS9saWIvc3Mvc3NfZXJyLmggJCh0b3Bfc3JjZGlyKS9saWIvZXQvY29tX2Vyci5oCitnZXRfcmVhZGxpbmUubzogJChzcmNkaXIpL2dldF9yZWFkbGluZS5jICQoc3JjZGlyKS9zc19pbnRlcm5hbC5oIFwKKyAkKHNyY2Rpcikvc3MuaCAkKHRvcF9idWlsZGRpcikvbGliL3NzL3NzX2Vyci5oIFwKKyAkKHRvcF9zcmNkaXIpL2xpYi9ldC9jb21fZXJyLmgKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2N0X2MuYXdrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvY3RfYy5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MjRjOAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2N0X2MuYXdrCkBAIC0wLDAgKzEsNzUgQEAKKy9eY29tbWFuZF90YWJsZSAvIHsKKwljbWR0YmwgPSAkMjsKKwlwcmludGYgIi8qICVzLmMgLSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tICVzLmN0ICovXG4iLCBcCisJCXJvb3RuYW1lLCByb290bmFtZSA+IG91dGZpbGUKKwlwcmludCAiI2luY2x1ZGUgPHNzL3NzLmg+IiA+IG91dGZpbGUKKwlwcmludCAiIiA+b3V0ZmlsZQorfQorCQorL15CT1IkLyB7CisJY21kbnVtKysKKwlvcHRpb25zID0gMAorCWNtZHRhYiA9ICIiCisJcHJpbnRmICJzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IHNzdSUwNWRbXSA9IHtcbiIsIGNtZG51bSA+IG91dGZpbGUKK30KKworL15zdWIvIHsKKwlzdWJyID0gc3Vic3RyKCQwLCA2LCBsZW5ndGgoJDApLTUpCit9CisKKy9eaGxwLyB7CisJaGVscCA9IHN1YnN0cigkMCwgNiwgbGVuZ3RoKCQwKS01KQorfQorCisvXmNtZC8geworCWNtZCA9IHN1YnN0cigkMCwgNiwgbGVuZ3RoKCQwKS01KQorCXByaW50ZiAiJXNcIiVzXCIsXG4iLCBjbWR0YWIsIGNtZCA+IG91dGZpbGUKKwljbWR0YWIgPSAiICAgICIKK30KKworL15vcHQvIHsKKwlvcHQgPSBzdWJzdHIoJDAsIDYsIGxlbmd0aCgkMCktNSkKKwlpZiAob3B0ID09ICJkb250X2xpc3QiKSB7CisJCW9wdGlvbnMgKz0gMQorCX0KKwlpZiAob3B0ID09ICJkb250X3N1bW1hcml6ZSIpIHsKKwkJb3B0aW9ucyArPSAyCisJfQorfQorCisvXkVPUi8geworCXByaW50ICIgICAgKGNoYXIgY29uc3QgKikwIiA+IG91dGZpbGUKKwlwcmludCAifTsiID4gb3V0ZmlsZSAKKwlwcmludGYgImV4dGVybiB2b2lkICVzIF9fU1NfUFJPVE87XG4iLCBzdWJyID4gb3V0ZmlsZQorCSMgV29yayBhcm91bmQgYSBidWcgaW4gZ2F3ayAzLjAuNQorCWF3a19idWcgPSBjbWRudW0KKwlzdWJyX3RhYlthd2tfYnVnXSA9IHN1YnIKKwlvcHRpb25zX3RhYlthd2tfYnVnXSA9IG9wdGlvbnMKKwloZWxwX3RhYlthd2tfYnVnXSA9IGhlbHAKK30KKworL15bMC05XS8geworCWxpbmVudW0gPSAkMTsKK30KKworL15FUlJPUi8geworCWVycm9yID0gc3Vic3RyKCQwLCA4LCBsZW5ndGgoJDApLTcpCisJcHJpbnRmICJFcnJvciBpbiBsaW5lICVkOiAlc1xuIiwgbGluZW51bSwgZXJyb3IKKwlwcmludCAiI19fRVJST1JfSU5fRklMRV9fIiA+IG91dGZpbGUKK30KKworRU5EIHsKKwlwcmludGYgInN0YXRpYyBzc19yZXF1ZXN0X2VudHJ5IHNzdSUwNWRbXSA9IHtcbiIsIGNtZG51bSsxID4gb3V0ZmlsZQorCWZvciAoaT0xOyBpIDw9IGNtZG51bTsgaSsrKSB7CisJCXByaW50ZiAiICAgIHsgc3N1JTA1ZCxcbiIsIGkgPiBvdXRmaWxlCisJCXByaW50ZiAiICAgICAgJXMsXG4iLCBzdWJyX3RhYltpXSA+IG91dGZpbGUKKwkJcHJpbnRmICIgICAgICBcIiVzXCIsXG4iLCBoZWxwX3RhYltpXSA+IG91dGZpbGUKKwkJcHJpbnRmICIgICAgICAlZCB9LFxuIiwgb3B0aW9uc190YWJbaV0gPiBvdXRmaWxlCisJfQorCXByaW50ICIgICAgeyAwLCAwLCAwLCAwIH0iID4gb3V0ZmlsZQorCXByaW50ICJ9OyIgPiBvdXRmaWxlCisJcHJpbnQgIiIgPiBvdXRmaWxlCisJcHJpbnRmICJzc19yZXF1ZXN0X3RhYmxlICVzID0geyAyLCBzc3UlMDVkIH07XG4iLCBcCisJCWNtZHRibCwgY21kbnVtKzEgPiBvdXRmaWxlCit9CisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2N0X2Muc2VkIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvY3RfYy5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2NDUyYgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2N0X2Muc2VkCkBAIC0wLDAgKzEsMTYwIEBACisjCisjIFRoaXMgc2NyaXB0IHBhcnNlcyBhIGNvbW1hbmRfdGFibGUgZmlsZSBpbnRvIHNvbWV0aGluZyB3aGljaCBpcyBhIGJpdCAKKyMgZWFzaWVyIGZvciBhbiBhd2sgc2NyaXB0IHRvIHVuZGVyc3RhbmQuCisjCisjIElucHV0IHN5bnRheDogYSAuY3QgZmlsZQorIworIyBPdXRwdXQgc3ludGF4OgorIyAoZm9yIHRoZSBjb21tYW5kX3RhYmxlIGxpbmUpCisjCWNvbW1hbmRfdGFibGUgIDxjb21tYW5kX3RhYmxlPgorIworIyhmb3IgZWFjaCByZXF1ZXN0IGRlZmluaXRpb24pCisjCUJPUgorIwlzdWI6IDxzdWJyb3V0aW5lIG5hbWU+CisjCWhscDogPGhlbHAgdGV4dD4KKyMJY21kOiA8Y29tbWFuZD4KKyMJb3B0OiA8b3B0aW9uPgorIwlFT1IKKyMgKHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lICdjbWQnIG9yICdvcHQnIGxpbmUKKyMKKyMgQSBudW1iZXIgc2VudCB0byB0aGUgb3V0cHV0IHJlcHJlc2VudHMgYSBwYXJzZSBlcnJvciAtLS0gaXQgd2lsbCBiZSAKKyMgZm9sbG93ZWQgYnkgdGhlIG5leHQgbGluZSB3aGljaCB3aWxsIGhhdmUgdGhlIGZvcm06CisjCUVSUk9SOiA8ZXJyb3IgdGV4dD4KKyMKKyMgVGhlIGRlc2lnbiBvZiB0aGlzIG91dHB1dCBzeW50YXggaXMgc3VjaCB0aGF0IGl0IHNob3VsZCBiZSBlYXN5IGZvcgorIyBhbiBhd2sgc2NyaXB0IHRvIHBhcnNlLgorCisjCisjIFRoZSBmaXJzdCBzZWN0aW9uIG9mIHRoaXMgc2NyaXB0IGlzIGp1c3QgdG8gY2Fubm9pY2FsaXplIHRoZSBmaWxlLiAgCisjIEl0IHJlbW92ZXMgY29tbWVudHMsIGFuZCBwdXRzIGVhY2ggY29tbWFuZF90YWJsZSByZXF1ZXN0IG9udG8gYSBzaW5nbGUKKyMgbGluZQorIworOkZJUlNUCit5LwkvIC8KK3MvXiAqLy8KK3MvIy4qJC8vCisvOyAqJC8heworTgoreS8JLyAvCitzL1xuICovIC8KK2JGSVJTVAorfQorcy8sICovLCAvZworIworIyBOb3cgd2UgdGFrZSBjYXJlIG9mIHNvbWUgc3ludGF0aWMgc3VnYXIuLi4uLgorIworL151bmltcGxlbWVudGVkLyB7CisJcy9edW5pbXBsZW1lbnRlZCBbQS1aYS16XzAtOV0qL3JlcXVlc3Qgc3NfdW5pbXBsZW1lbnRlZC8KKwlzLzsvLCAoZG9udF9saXN0LCBkb250X3N1bW1hcml6ZSk7LworfQorL151bmtub3duLyB7CisJcy9edW5rbm93biAvcmVxdWVzdCBzc191bmtub3duLCAiIiwgLworfQorIworIyBEaXNwYXRjaCBiYXNlZCBvbiB0aGUga2V5d29yZC4uLi4gIGlsbGVnYWwga2V5d29yZHMgYXJlIHByZWZpeGVkIGJ5IEVSUk9SOgorIyBhbmQgYXJlIGhhbmRsZWQgYnkgdGhlIGF3ayBzY3JpcHQuCisjCisvXmNvbW1hbmRfdGFibGUgL2JDTUQKKy9ecmVxdWVzdCAvYlJFUVVFU1QKKy9eZW5kOy9iRU5ECitzLyAuKi8vCitzL14vRVJST1I6IHVua25vd24ga2V5d29yZDogLworPQorYgorIworIyBIYW5kbGUgdGhlIGNvbW1hbmRfdGFibGUga2V5d29yZAorIworOkNNRAorcy87JC8vCitwCitkCitiCisjCisjIEhhbmRsZSB0aGUgcmVxdWVzdCBrZXl3b3JkIC0tLSB0aGlzIGlzIHRoZSBoZWFydCBvZiB0aGUgc2VkIHNjcmlwdC4KKyMgCis6UkVRVUVTVAorcy9ecmVxdWVzdCAqLy8KK2gKK2lcCitCT1IKKyMgRmlyc3QsIHBhcnNlIG91dCB0aGUgc3Vicm91dGluZSBuYW1lCitzL14vc3ViOiAvCitzLywuKi8vCitwCisjIE5leHQsIHBhcnNlIG91dCB0aGUgaGVscCBtZXNzYWdlLCBiZWluZyBjYXJlZnVsIHRvIGhhbmRsZSBhIHF1b3RlZCBzdHJpbmcKK2cKK3MvXlteLF0qLCAqLy8KK2gKKy9eIi8geworCXMvXiIvLworCXMvIi4qLy8KKwl4CisJcy9eIlteIl0qIiwgKi8vCisJeAorCWIgRU1JVEhMUAorfQorcy9bXmEtekEtWjAtOV0uKi8vCit4CitzL1thLXpBLVowLTldKiwgKi8vCit4Cis6RU1JVEhMUAorcy9eL2hscDogLworcAorIyBOZXh0IHRha2UgY2FyZSBvZiB0aGUgY29tbWFuZCBuYW1lcworOkNNRExJU1QKK2cKKy9eKC9iIE9QVElPTlMKKy9eOy9iIEVPUgorL14iLyB7CisJcy9eIi8vCisJcy8iLiovLworCXgKKwlzL14iW14iXSoiLy8KKwlzLywgKi8vCisJeAorCWIgRU1JVFJFUQorfQorcy9bXkEtWmEtel8wLTldLiovLworeAorcy9bQS1aYS16XzAtOV0qLy8KK3MvLCAqLy8KK3gKKzpFTUlUUkVRCitzL14vY21kOiAvCitwCitiIENNRExJU1QKKyMKKyMgSGVyZSB3ZSBwYXJzZSB0aGUgbGlzdCBvZiBvcHRpb25zLgorIworOiBPUFRJT05TCitnCitzL14oLy8KK2gKKzogT1BUTElTVAorL14pLyBiIEVPUgorL15bXkEtWmEtel8wLTldLyB7CisJPQorCWNcCitFUlJPUjogcGFyc2UgZXJyb3IgaW4gb3B0aW9ucyBsaXN0Cit9CitzL1teQS1aYS16XzAtOV0uKi8vCit4CitzL1tBLVphLXpfMC05XSovLworcy8sICovLworeAorcy9eL29wdDogLworcAorZworYiBPUFRMSVNUCis6IEVPUgorY1wKK0VPUlwKKworZAorYgorIworIyBIYW5kbGUgdGhlIGVuZCBrZXl3b3JkIC0tLSBpdCdzIGJhc2ljYWxseSBpZ25vcmVkLgorIworOkVORAorZAorYgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvZGF0YS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2NkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9kYXRhLmMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4LCAxOTg5IE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqIChTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQpCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdAorICogdGhlIG5hbWVzIG9mIE0uSS5ULiBhbmQgdGhlIE0uSS5ULiBTLkkuUC5CLiBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIGFuZCB0aGUKKyAqIE0uSS5ULiBTLkkuUC5CLiBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0CisgKiBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAic3NfaW50ZXJuYWwuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQorICAgICJDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk4OSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSI7CisKK3NzX2RhdGEgKipfc3NfdGFibGUgPSAoc3NfZGF0YSAqKilOVUxMOworY2hhciAqX3NzX3BhZ2VyX25hbWUgPSAoY2hhciAqKU5VTEw7CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9lcnJvci5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRiNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvZXJyb3IuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IDE5ODcsIDE5ODgsIDE5ODkgYnkgTUlUIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZworICogQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGNvbV9lcnIuaD4KKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2NoYXIgKiBzc19uYW1lKHNjaV9pZHgpCisgICAgaW50IHNjaV9pZHg7Cit7CisgICAgcmVnaXN0ZXIgY2hhciAqcmV0X3ZhbDsKKyAgICByZWdpc3RlciBzc19kYXRhICppbmZvcDsKKworICAgIGluZm9wID0gc3NfaW5mbyhzY2lfaWR4KTsKKyAgICBpZiAoaW5mb3AtPmN1cnJlbnRfcmVxdWVzdCA9PSAoY2hhciBjb25zdCAqKU5VTEwpIHsKKwlyZXRfdmFsID0gbWFsbG9jKCh1bnNpZ25lZCkKKwkJCSAoc3RybGVuKGluZm9wLT5zdWJzeXN0ZW1fbmFtZSkrMSkKKwkJCSAqIHNpemVvZihjaGFyKSk7CisJaWYgKHJldF92YWwgPT0gKGNoYXIgKilOVUxMKQorCSAgICByZXR1cm4oKGNoYXIgKilOVUxMKTsKKwlzdHJjcHkocmV0X3ZhbCwgaW5mb3AtPnN1YnN5c3RlbV9uYW1lKTsKKwlyZXR1cm4ocmV0X3ZhbCk7CisgICAgfQorICAgIGVsc2UgeworCXJlZ2lzdGVyIGNoYXIgKmNwOworCXJlZ2lzdGVyIGNoYXIgY29uc3QgKmNwMTsKKwlyZXRfdmFsID0gbWFsbG9jKCh1bnNpZ25lZClzaXplb2YoY2hhcikgKgorCQkJIChzdHJsZW4oaW5mb3AtPnN1YnN5c3RlbV9uYW1lKSsKKwkJCSAgc3RybGVuKGluZm9wLT5jdXJyZW50X3JlcXVlc3QpKworCQkJICA0KSk7CisJY3AgPSByZXRfdmFsOworCWNwMSA9IGluZm9wLT5zdWJzeXN0ZW1fbmFtZTsKKwl3aGlsZSAoKmNwMSkKKwkgICAgKmNwKysgPSAqY3AxKys7CisJKmNwKysgPSAnICc7CisJKmNwKysgPSAnKCc7CisJY3AxID0gaW5mb3AtPmN1cnJlbnRfcmVxdWVzdDsKKwl3aGlsZSAoKmNwMSkKKwkgICAgKmNwKysgPSAqY3AxKys7CisJKmNwKysgPSAnKSc7CisJKmNwID0gJ1wwJzsKKwlyZXR1cm4ocmV0X3ZhbCk7CisgICAgfQorfQorCit2b2lkIHNzX2Vycm9yIChpbnQgc2NpX2lkeCwgbG9uZyBjb2RlLCBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisgICAgcmVnaXN0ZXIgY2hhciAqd2hvYW1pOworICAgIHZhX2xpc3QgcHZhcjsKKworICAgIHZhX3N0YXJ0IChwdmFyLCBmbXQpOworICAgIHdob2FtaSA9IHNzX25hbWUgKHNjaV9pZHgpOworICAgIGNvbV9lcnJfdmEgKHdob2FtaSwgY29kZSwgZm10LCBwdmFyKTsKKyAgICBmcmVlICh3aG9hbWkpOworICAgIHZhX2VuZChwdmFyKTsKK30KKwordm9pZCBzc19wZXJyb3IgKHNjaV9pZHgsIGNvZGUsIG1zZykgLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KKyAgICBpbnQgc2NpX2lkeDsKKyAgICBsb25nIGNvZGU7CisgICAgY2hhciBjb25zdCAqbXNnOworeworICAgIHNzX2Vycm9yIChzY2lfaWR4LCBjb2RlLCAiJXMiLCBtc2cpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvZXhlY3V0ZV9jbWQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2V4ZWN1dGVfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyYTIwNAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2V4ZWN1dGVfY21kLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk4OSBieSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdAorICogdGhlIG5hbWVzIG9mIE0uSS5ULiBhbmQgdGhlIE0uSS5ULiBTLkkuUC5CLiBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIGFuZCB0aGUKKyAqIE0uSS5ULiBTLkkuUC5CLiBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0CisgKiBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2lmZGVmIEhBU19TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbHNlCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisjaW5jbHVkZSAic3NfaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IGNoZWNrX3JlcXVlc3RfdGFibGUgUFJPVE9UWVBFKChzc19yZXF1ZXN0X3RhYmxlICpycXRibCwgaW50IGFyZ2MsCisJCQkJCSAgY2hhciAqYXJndltdLCBpbnQgc2NpX2lkeCkpOworc3RhdGljIGludCByZWFsbHlfZXhlY3V0ZV9jb21tYW5kIFBST1RPVFlQRSgoaW50IHNjaV9pZHgsIGludCBhcmdjLAorCQkJCQkgICAgIGNoYXIgKiphcmd2W10pKTsKKworLyoKKyAqIGdldF9yZXF1ZXN0KHRibCwgaWR4KQorICoKKyAqIEZ1bmN0aW9uOgorICogICAgICBHZXRzIHRoZSBpZHgndGggcmVxdWVzdCBmcm9tIHRoZSByZXF1ZXN0IHRhYmxlIHBvaW50ZWQgdG8KKyAqICAgICAgYnkgdGJsLgorICogQXJndW1lbnRzOgorICogICAgICB0YmwgKHNzX3JlcXVlc3RfdGFibGUgKikKKyAqICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlcXVlc3QgdGFibGUKKyAqICAgICAgaWR4IChpbnQpCisgKiAgICAgICAgICAgICAgaW5kZXggaW50byB0YWJsZQorICogUmV0dXJuczoKKyAqICAgICAgKHNzX3JlcXVlc3RfZW50cnkgKikKKyAqICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlcXVlc3QgdGFibGUgZW50cnkKKyAqIE5vdGVzOgorICogICAgICBIYXMgYmVlbiByZXBsYWNlZCBieSBhIG1hY3JvLgorICovCisKKyNpZmRlZiBfX1NBQkVSX18KKy8qIHNpZ2guICBzYWJlciB3b24ndCBkZWFsIHdpdGggcG9pbnRlci10by1jb25zdC1zdHJ1Y3QgKi8KK3N0YXRpYyBzdHJ1Y3QgX3NzX3JlcXVlc3RfZW50cnkgKiBnZXRfcmVxdWVzdCAodGJsLCBpZHgpCisgICAgc3NfcmVxdWVzdF90YWJsZSAqIHRibDsKKyAgICBpbnQgaWR4OworeworICAgIHN0cnVjdCBfc3NfcmVxdWVzdF90YWJsZSAqdGJsMSA9IChzdHJ1Y3QgX3NzX3JlcXVlc3RfdGFibGUgKikgdGJsOworICAgIHN0cnVjdCBfc3NfcmVxdWVzdF9lbnRyeSAqZSA9IChzdHJ1Y3QgX3NzX3JlcXVlc3RfZW50cnkgKikgdGJsMS0+cmVxdWVzdHM7CisgICAgcmV0dXJuIGUgKyBpZHg7Cit9CisjZWxzZQorI2RlZmluZSBnZXRfcmVxdWVzdCh0YmwsaWR4KSAgICAoKHRibCkgLT4gcmVxdWVzdHMgKyAoaWR4KSkKKyNlbmRpZgorCisvKgorICogY2hlY2tfcmVxdWVzdF90YWJsZShycXRibCwgYXJnYywgYXJndiwgc2NpX2lkeCkKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgICAgSWYgdGhlIGNvbW1hbmQgc3RyaW5nIGluIGFyZ3ZbMF0gaXMgaW4gdGhlIHJlcXVlc3QgdGFibGUsIGV4ZWN1dGUKKyAqICAgICAgdGhlIGNvbW1hbmRzIGFuZCByZXR1cm4gZXJyb3IgY29kZSAwLiAgT3RoZXJ3aXNlLCByZXR1cm4gZXJyb3IKKyAqICAgICAgY29kZSBzc19ldF9jb21tYW5kX25vdF9mb3VuZC4KKyAqIEFyZ3VtZW50czoKKyAqICAgICAgcnF0YmwgKHNzX3JlcXVlc3RfdGFibGUgKikKKyAqICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlcXVlc3QgdGFibGUKKyAqICAgICAgYXJnYyAoaW50KQorICogICAgICAgICAgICAgIG51bWJlciBvZiBlbGVtZW50cyBpbiBhcmd2W10KKyAqICAgICAgYXJndiAoY2hhciAqW10pCisgKiAgICAgICAgICAgICAgYXJndW1lbnQgc3RyaW5nIGFycmF5CisgKiAgICAgIHNjaV9pZHggKGludCkKKyAqICAgICAgICAgICAgICBzcy1pbnRlcm5hbCBpbmRleCBmb3Igc3Vic3lzdGVtIGNvbnRyb2wgaW5mbyBzdHJ1Y3R1cmUKKyAqIFJldHVybnM6CisgKiAgICAgIChpbnQpCisgKiAgICAgICAgICAgICAgemVybyBpZiBjb21tYW5kIGZvdW5kLCBzc19ldF9jb21tYW5kX25vdF9mb3VuZCBvdGhlcndpc2UKKyAqIE5vdGVzOgorICovCisKK3N0YXRpYyBpbnQgY2hlY2tfcmVxdWVzdF90YWJsZSAocnF0YmwsIGFyZ2MsIGFyZ3YsIHNjaV9pZHgpCisgICAgcmVnaXN0ZXIgc3NfcmVxdWVzdF90YWJsZSAqcnF0Ymw7CisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqYXJndltdOworICAgIGludCBzY2lfaWR4OworeworI2lmZGVmIF9fU0FCRVJfXworICAgIHN0cnVjdCBfc3NfcmVxdWVzdF9lbnRyeSAqcmVxdWVzdDsKKyNlbHNlCisgICAgcmVnaXN0ZXIgc3NfcmVxdWVzdF9lbnRyeSAqcmVxdWVzdDsKKyNlbmRpZgorICAgIHJlZ2lzdGVyIHNzX2RhdGEgKmluZm87CisgICAgcmVnaXN0ZXIgY2hhciBjb25zdCAqIGNvbnN0ICogbmFtZTsKKyAgICBjaGFyICpzdHJpbmcgPSBhcmd2WzBdOworICAgIGludCBpOworCisgICAgaW5mbyA9IHNzX2luZm8oc2NpX2lkeCk7CisgICAgaW5mby0+YXJnYyA9IGFyZ2M7CisgICAgaW5mby0+YXJndiA9IGFyZ3Y7CisgICAgZm9yIChpID0gMDsgKHJlcXVlc3QgPSBnZXRfcmVxdWVzdChycXRibCwgaSkpLT5jb21tYW5kX25hbWVzOyBpKyspIHsKKwlmb3IgKG5hbWUgPSByZXF1ZXN0LT5jb21tYW5kX25hbWVzOyAqbmFtZTsgbmFtZSsrKQorCSAgICBpZiAoIXN0cmNtcCgqbmFtZSwgc3RyaW5nKSkgeworCQlpbmZvLT5jdXJyZW50X3JlcXVlc3QgPSByZXF1ZXN0LT5jb21tYW5kX25hbWVzWzBdOworCQkocmVxdWVzdC0+ZnVuY3Rpb24pKGFyZ2MsIChjb25zdCBjaGFyICpjb25zdCAqKSBhcmd2LAorCQkJCSAgICBzY2lfaWR4LGluZm8tPmluZm9fcHRyKTsKKwkJaW5mby0+Y3VycmVudF9yZXF1ZXN0ID0gKGNoYXIgKilOVUxMOworCQlyZXR1cm4oMCk7CisJICAgIH0KKyAgICB9CisgICAgcmV0dXJuKFNTX0VUX0NPTU1BTkRfTk9UX0ZPVU5EKTsKK30KKworLyoKKyAqIHJlYWxseV9leGVjdXRlX2NvbW1hbmQoc2NpX2lkeCwgYXJnYywgYXJndikKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgICAgRmlsbHMgaW4gdGhlIGFyZ2MsIGFyZ3YgdmFsdWVzIGluIHRoZSBzdWJzeXN0ZW0gZW50cnkgYW5kCisgKiAgICAgIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHJvdXRpbmUuCisgKiBBcmd1bWVudHM6CisgKiAgICAgIHNjaV9pZHggKGludCkKKyAqICAgICAgICAgICAgICBzcy1pbnRlcm5hbCBpbmRleCBmb3Igc3Vic3lzdGVtIGNvbnRyb2wgaW5mbyBzdHJ1Y3R1cmUKKyAqICAgICAgYXJnYyAoaW50KQorICogICAgICAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMgaW4gYXJndW1lbnQgbGlzdAorICogICAgICBhcmd2IChjaGFyICoqW10pCisgKiAgICAgICAgICAgICAgcG9pbnRlciB0byBwYXJzZWQgYXJndW1lbnQgbGlzdCAobWF5IGJlIHJlYWxsb2NhdGVkCisgKiAgICAgICAgICAgICAgb24gYWJicmV2IGV4cGFuc2lvbikKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAoaW50KQorICogICAgICAgICAgICAgIFplcm8gaWYgc3VjY2Vzc2Z1bCwgc3NfZXRfY29tbWFuZF9ub3RfZm91bmQgb3RoZXJ3aXNlLgorICogTm90ZXM6CisgKi8KKworc3RhdGljIGludCByZWFsbHlfZXhlY3V0ZV9jb21tYW5kIChzY2lfaWR4LCBhcmdjLCBhcmd2KQorICAgIGludCBzY2lfaWR4OworICAgIGludCBhcmdjOworICAgIGNoYXIgKiphcmd2W107Cit7CisgICAgcmVnaXN0ZXIgc3NfcmVxdWVzdF90YWJsZSAqKnJxdGJsOworICAgIHJlZ2lzdGVyIHNzX2RhdGEgKmluZm87CisKKyAgICBpbmZvID0gc3NfaW5mbyhzY2lfaWR4KTsKKworICAgIGZvciAocnF0YmwgPSBpbmZvLT5ycXRfdGFibGVzOyAqcnF0Ymw7IHJxdGJsKyspIHsKKyAgICAgICAgaWYgKGNoZWNrX3JlcXVlc3RfdGFibGUgKCpycXRibCwgYXJnYywgKmFyZ3YsIHNjaV9pZHgpID09IDApCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIHJldHVybihTU19FVF9DT01NQU5EX05PVF9GT1VORCk7Cit9CisKKy8qCisgKiBzc19leGVjdXRlX2NvbW1hbmQoc2NpX2lkeCwgYXJndikKKyAqCisgKiBGdW5jdGlvbjoKKyAqCUV4ZWN1dGVzIGEgcGFyc2VkIGNvbW1hbmQgbGlzdCB3aXRoaW4gdGhlIHN1YnN5c3RlbS4KKyAqIEFyZ3VtZW50czoKKyAqCXNjaV9pZHggKGludCkKKyAqCQlzcy1pbnRlcm5hbCBpbmRleCBmb3Igc3Vic3lzdGVtIGNvbnRyb2wgaW5mbyBzdHJ1Y3R1cmUKKyAqCWFyZ3YgKGNoYXIgKltdKQorICoJCXBhcnNlZCBhcmd1bWVudCBsaXN0CisgKiBSZXR1cm5zOgorICoJKGludCkKKyAqCQlaZXJvIGlmIHN1Y2Nlc3NmdWwsIHNzX2V0X2NvbW1hbmRfbm90X2ZvdW5kIG90aGVyd2lzZS4KKyAqIE5vdGVzOgorICovCisKK2ludCBzc19leGVjdXRlX2NvbW1hbmQoc2NpX2lkeCwgYXJndikKKwlpbnQgc2NpX2lkeDsKKwlyZWdpc3RlciBjaGFyICphcmd2W107Cit7CisJcmVnaXN0ZXIgaW50IGksIGFyZ2M7CisJY2hhciAqKmFyZ3A7CisKKwlhcmdjID0gMDsKKwlmb3IgKGFyZ3AgPSBhcmd2OyAqYXJncDsgYXJncCsrKQorCQlhcmdjKys7CisJYXJncCA9IChjaGFyICoqKW1hbGxvYygoYXJnYysxKSpzaXplb2YoY2hhciAqKSk7CisJZm9yIChpID0gMDsgaSA8PSBhcmdjOyBpKyspCisJCWFyZ3BbaV0gPSBhcmd2W2ldOworCWkgPSByZWFsbHlfZXhlY3V0ZV9jb21tYW5kKHNjaV9pZHgsIGFyZ2MsICZhcmdwKTsKKwlmcmVlKGFyZ3ApOworCXJldHVybihpKTsKK30KKworLyoKKyAqIHNzX2V4ZWN1dGVfbGluZShzY2lfaWR4LCBsaW5lX3B0cikKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgICAgUGFyc2VzIGFuZCBleGVjdXRlcyBhIGNvbW1hbmQgbGluZSB3aXRoaW4gYSBzdWJzeXN0ZW0uCisgKiBBcmd1bWVudHM6CisgKiAgICAgIHNjaV9pZHggKGludCkKKyAqICAgICAgICAgICAgICBzcy1pbnRlcm5hbCBpbmRleCBmb3Igc3Vic3lzdGVtIGNvbnRyb2wgaW5mbyBzdHJ1Y3R1cmUKKyAqICAgICAgbGluZV9wdHIgKGNoYXIgKikKKyAqICAgICAgICAgICAgICBQb2ludGVyIHRvIGNvbW1hbmQgbGluZSB0byBiZSBwYXJzZWQuCisgKiBSZXR1cm5zOgorICogICAgICAoaW50KQorICogICAgICAJRXJyb3IgY29kZS4KKyAqIE5vdGVzOgorICovCisKK2ludCBzc19leGVjdXRlX2xpbmUgKHNjaV9pZHgsIGxpbmVfcHRyKQorICAgIGludCBzY2lfaWR4OworICAgIGNoYXIgKmxpbmVfcHRyOworeworICAgIGNoYXIgKiphcmd2OworICAgIGludCBhcmdjLCByZXQ7CisKKyAgICAvKiBmbHVzaCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgICB3aGlsZSAobGluZV9wdHJbMF0gPT0gJyAnIHx8IGxpbmVfcHRyWzBdID09ICdcdCcpCisgICAgICAgIGxpbmVfcHRyKys7CisKKyAgICAvKiBjaGVjayBpZiBpdCBzaG91bGQgYmUgc2VudCB0byBvcGVyYXRpbmcgc3lzdGVtIGZvciBleGVjdXRpb24gKi8KKyAgICBpZiAoKmxpbmVfcHRyID09ICchJykgeworICAgICAgICBpZiAoc3NfaW5mbyhzY2lfaWR4KS0+ZmxhZ3MuZXNjYXBlX2Rpc2FibGVkKQorICAgICAgICAgICAgcmV0dXJuIFNTX0VUX0VTQ0FQRV9ESVNBQkxFRDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsaW5lX3B0cisrOworICAgICAgICAgICAgcmV0dXJuIChzeXN0ZW0obGluZV9wdHIpIDwgMCkgPyBlcnJubyA6IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYXJzZSBpdCAqLworICAgIGFyZ3YgPSBzc19wYXJzZShzY2lfaWR4LCBsaW5lX3B0ciwgJmFyZ2MpOworICAgIGlmIChhcmdjID09IDApIHsKKwlmcmVlKGFyZ3YpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBsb29rIGl0IHVwIGluIHRoZSByZXF1ZXN0IHRhYmxlcywgZXhlY3V0ZSBpZiBmb3VuZCAqLworICAgIHJldCA9IHJlYWxseV9leGVjdXRlX2NvbW1hbmQgKHNjaV9pZHgsIGFyZ2MsICZhcmd2KTsKKworICAgIGZyZWUoYXJndik7CisKKyAgICByZXR1cm4ocmV0KTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2dldF9yZWFkbGluZS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvZ2V0X3JlYWRsaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyMTA1MgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2dldF9yZWFkbGluZS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBieSBNSVQgU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIEJvYXJkCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdAorICogdGhlIG5hbWVzIG9mIE0uSS5ULiBhbmQgdGhlIE0uSS5ULiBTLkkuUC5CLiBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIGFuZCB0aGUKKyAqIE0uSS5ULiBTLkkuUC5CLiBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0CisgKiBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2lmZGVmIEhBU19TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAic3NfaW50ZXJuYWwuaCIKKyNkZWZpbmUJc2l6ZQlzaXplb2Yoc3NfZGF0YSAqKQorI2lmZGVmIEhBVkVfRExPUEVOCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzc19yZWxlYXNlX3JlYWRsaW5lKHNzX2RhdGEgKmluZm8pCit7CisjaWZkZWYgSEFWRV9ETE9QRU4KKwlpZiAoIWluZm8tPnJlYWRsaW5lX2hhbmRsZSkKKwkJcmV0dXJuOworCisJaW5mby0+cmVhZGxpbmUgPSAwOworCWluZm8tPmFkZF9oaXN0b3J5ID0gMDsKKwlpbmZvLT5yZWRpc3BsYXkgPSAwOworCWluZm8tPnJsX2NvbXBsZXRpb25fbWF0Y2hlcyA9IDA7CisJZGxjbG9zZShpbmZvLT5yZWFkbGluZV9oYW5kbGUpOworCWluZm8tPnJlYWRsaW5lX2hhbmRsZSA9IDA7CisjZW5kaWYKK30KKworLyogTGlicmFyaWVzIHdlIHdpbGwgdHJ5IHRvIHVzZSBmb3IgcmVhZGxpbmUvZWRpdGxpbmUgZnVuY3Rpb25hbGl0eSAqLworI2RlZmluZSBERUZBVUxUX0xJQlBBVEggImxpYnJlYWRsaW5lLnNvLjY6bGlicmVhZGxpbmUuc28uNTpsaWJyZWFkbGluZS5zby40OmxpYnJlYWRsaW5lLnNvOmxpYmVkaXQuc28uMjpsaWJlZGl0LnNvOmxpYmVkaXRsaW5lLnNvLjA6bGliZWRpdGxpbmUuc28iCisKK3ZvaWQgc3NfZ2V0X3JlYWRsaW5lKGludCBzY2lfaWR4KQoreworI2lmZGVmIEhBVkVfRExPUEVOCisJdm9pZAkqaGFuZGxlID0gTlVMTDsKKwlzc19kYXRhICppbmZvID0gc3NfaW5mbyhzY2lfaWR4KTsKKwljb25zdCBjaGFyICoqdCwgKmxpYnBhdGggPSAwOworCWNoYXIJKnRtcCwgKmNwLCAqbmV4dDsKKwljaGFyICoqKCoqY29tcGxldGlvbl9mdW5jKShjb25zdCBjaGFyICosIGludCwgaW50KTsKKworCWlmIChpbmZvLT5yZWFkbGluZV9oYW5kbGUpCisJCXJldHVybjsKKworCWxpYnBhdGggPSBzc19zYWZlX2dldGVudigiU1NfUkVBRExJTkVfUEFUSCIpOworCWlmICghbGlicGF0aCkKKwkJbGlicGF0aCA9IERFRkFVTFRfTElCUEFUSDsKKwlpZiAoKmxpYnBhdGggPT0gMCB8fCAhc3RyY21wKGxpYnBhdGgsICJub25lIikpCisJCXJldHVybjsKKworCXRtcCA9IG1hbGxvYyhzdHJsZW4obGlicGF0aCkrMSk7CisJaWYgKCF0bXApCisJCXJldHVybjsKKwlzdHJjcHkodG1wLCBsaWJwYXRoKTsKKwlmb3IgKGNwID0gdG1wOyBjcDsgY3AgPSBuZXh0KSB7CisJCW5leHQgPSBzdHJjaHIoY3AsICc6Jyk7CisJCWlmIChuZXh0KQorCQkJKm5leHQrKyA9IDA7CisJCWlmICgqY3AgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGhhbmRsZSA9IGRsb3BlbihjcCwgUlRMRF9OT1cpKSkgeworCQkJLyogcHJpbnRmKCJVc2luZyAlcyBmb3IgcmVhZGxpbmUgbGlicmFyeVxuIiwgY3ApOyAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJZnJlZSh0bXApOworCWlmICghaGFuZGxlKQorCQlyZXR1cm47CisKKwlpbmZvLT5yZWFkbGluZV9oYW5kbGUgPSBoYW5kbGU7CisJaW5mby0+cmVhZGxpbmUgPSAoY2hhciAqKCopKGNvbnN0IGNoYXIgKikpCisJCWRsc3ltKGhhbmRsZSwgInJlYWRsaW5lIik7CisJaW5mby0+YWRkX2hpc3RvcnkgPSAodm9pZCAoKikoY29uc3QgY2hhciAqKSkKKwkJZGxzeW0oaGFuZGxlLCAiYWRkX2hpc3RvcnkiKTsKKwlpbmZvLT5yZWRpc3BsYXkgPSAodm9pZCAoKikodm9pZCkpCisJCWRsc3ltKGhhbmRsZSwgInJsX2ZvcmNlZF91cGRhdGVfZGlzcGxheSIpOworCWluZm8tPnJsX2NvbXBsZXRpb25fbWF0Y2hlcyA9IChjaGFyICoqKCopKGNvbnN0IGNoYXIgKiwKKwkJCQkgICAgY2hhciAqKCopKGNvbnN0IGNoYXIgKiwgaW50KSkpCisJCWRsc3ltKGhhbmRsZSwgInJsX2NvbXBsZXRpb25fbWF0Y2hlcyIpOworCWlmICgodCA9IGRsc3ltKGhhbmRsZSwgInJsX3JlYWRsaW5lX25hbWUiKSkgIT0gTlVMTCkKKwkJKnQgPSBpbmZvLT5zdWJzeXN0ZW1fbmFtZTsKKwlpZiAoKGNvbXBsZXRpb25fZnVuYyA9CisJICAgICBkbHN5bShoYW5kbGUsICJybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbiIpKSAhPSBOVUxMKQorCQkqY29tcGxldGlvbl9mdW5jID0gc3NfcmxfY29tcGxldGlvbjsKKwlpbmZvLT5yZWFkbGluZV9zaHV0ZG93biA9IHNzX3JlbGVhc2VfcmVhZGxpbmU7CisjZW5kaWYKK30KKworCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9oZWxwLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9oZWxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhMTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2hlbHAuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbHNlCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2lmZGVmIE5FRURfU1lTX0ZDTlRMX0gKKy8qIGp1c3QgZm9yIE9fKiAqLworI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfV0FJVF9ICisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNzX2ludGVybmFsLmgiCisKK3ZvaWQgc3NfaGVscCAoYXJnYywgYXJndiwgc2NpX2lkeCwgaW5mb19wdHIpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciBjb25zdCAqIGNvbnN0ICphcmd2OworICAgIGludCBzY2lfaWR4OworICAgIHBvaW50ZXIgaW5mb19wdHI7Cit7CisgICAgY2hhciAqYnVmZmVyOworICAgIGNoYXIgY29uc3QgKnJlcXVlc3RfbmFtZTsKKyAgICBpbnQgY29kZTsKKyAgICBpbnQgZmQsIGNoaWxkOworICAgIHJlZ2lzdGVyIGludCBpZHg7CisgICAgcmVnaXN0ZXIgc3NfZGF0YSAqaW5mbzsKKworICAgIHJlcXVlc3RfbmFtZSA9IHNzX2N1cnJlbnRfcmVxdWVzdChzY2lfaWR4LCAmY29kZSk7CisgICAgaWYgKGNvZGUgIT0gMCkgeworCXNzX3BlcnJvcihzY2lfaWR4LCBjb2RlLCAiIik7CisJcmV0dXJuOwkJLyogbm8gc3NfYWJvcnRfbGluZSwgaWYgaW52YWxpZCBpbnZvY2F0aW9uICovCisgICAgfQorICAgIGlmIChhcmdjID09IDEpIHsKKwlzc19saXN0X3JlcXVlc3RzKGFyZ2MsIGFyZ3YsIHNjaV9pZHgsIGluZm9fcHRyKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKGFyZ2MgIT0gMikgeworCS8qIHNob3VsZCBkbyBzb21ldGhpbmcgYmV0dGVyIHRoYW4gdGhpcyAqLworCWJ1ZmZlciA9IG1hbGxvYyg4MCsyKnN0cmxlbihyZXF1ZXN0X25hbWUpKTsKKwlpZiAoIWJ1ZmZlcikgeworCQlzc19wZXJyb3Ioc2NpX2lkeCwgMCwKKwkJCSAgImNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSB0byBwcmludCB1c2FnZSBtZXNzYWdlIik7CisJCXJldHVybjsKKwl9CisJc3ByaW50ZihidWZmZXIsICJ1c2FnZTpcblx0JXMgW3RvcGljfGNvbW1hbmRdXG5vclx0JXNcbiIsCisJCXJlcXVlc3RfbmFtZSwgcmVxdWVzdF9uYW1lKTsKKwlzc19wZXJyb3Ioc2NpX2lkeCwgMCwgYnVmZmVyKTsKKwlmcmVlKGJ1ZmZlcik7CisJcmV0dXJuOworICAgIH0KKyAgICBpbmZvID0gc3NfaW5mbyhzY2lfaWR4KTsKKyAgICBpZiAoaW5mby0+aW5mb19kaXJzID09IChjaGFyICoqKU5VTEwpIHsKKwlzc19wZXJyb3Ioc2NpX2lkeCwgU1NfRVRfTk9fSU5GT19ESVIsIChjaGFyICopTlVMTCk7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoaW5mby0+aW5mb19kaXJzWzBdID09IChjaGFyICopTlVMTCkgeworCXNzX3BlcnJvcihzY2lfaWR4LCBTU19FVF9OT19JTkZPX0RJUiwgKGNoYXIgKilOVUxMKTsKKwlyZXR1cm47CisgICAgfQorICAgIGZvciAoZmQgPSAtMSwgaWR4ID0gMDsgaW5mby0+aW5mb19kaXJzW2lkeF0gIT0gKGNoYXIgKilOVUxMOyBpZHgrKykgeworICAgICAgICBidWZmZXIgPSBtYWxsb2Moc3RybGVuIChpbmZvLT5pbmZvX2RpcnNbaWR4XSkgKyAxICsKKwkJCXN0cmxlbiAoYXJndlsxXSkgKyA2KTsKKwlpZiAoIWJ1ZmZlcikgeworCSAgICBzc19wZXJyb3Ioc2NpX2lkeCwgMCwKKwkJICAgICAgImNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaGVscCBmaWxlbmFtZSIpOworCSAgICByZXR1cm47CisJfQorCSh2b2lkKSBzdHJjcHkoYnVmZmVyLCBpbmZvLT5pbmZvX2RpcnNbaWR4XSk7CisJKHZvaWQpIHN0cmNhdChidWZmZXIsICIvIik7CisJKHZvaWQpIHN0cmNhdChidWZmZXIsIGFyZ3ZbMV0pOworCSh2b2lkKSBzdHJjYXQoYnVmZmVyLCAiLmluZm8iKTsKKwlmZCA9IG9wZW4oYnVmZmVyLCBPX1JET05MWSk7CisJZnJlZShidWZmZXIpOworCWlmIChmZCA+PSAwKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGZkIDwgMCkgeworI2RlZmluZSBNU0cgIk5vIGluZm8gZm91bmQgZm9yICIKKyAgICAgICAgY2hhciAqYnVmID0gbWFsbG9jKHN0cmxlbiAoTVNHKSArIHN0cmxlbiAoYXJndlsxXSkgKyAxKTsKKwlzdHJjcHkoYnVmLCBNU0cpOworCXN0cmNhdChidWYsIGFyZ3ZbMV0pOworCXNzX3BlcnJvcihzY2lfaWR4LCAwLCBidWYpOworCWZyZWUoYnVmKTsKKwlyZXR1cm47CisgICAgfQorICAgIHN3aXRjaCAoY2hpbGQgPSBmb3JrKCkpIHsKKyAgICBjYXNlIC0xOgorCXNzX3BlcnJvcihzY2lfaWR4LCBlcnJubywgIkNhbid0IGZvcmsgZm9yIHBhZ2VyIik7CisJcmV0dXJuOworICAgIGNhc2UgMDoKKwkodm9pZCkgZHVwMihmZCwgMCk7IC8qIHB1dCBmaWxlIG9uIHN0ZGluICovCisJc3NfcGFnZV9zdGRpbigpOworICAgIGRlZmF1bHQ6CisJKHZvaWQpIGNsb3NlKGZkKTsgLyogd2hhdCBjYW4gd2UgZG8gaWYgaXQgZmFpbHM/ICovCisJd2hpbGUgKHdhaXQoMCkgIT0gY2hpbGQpIHsKKwkgICAgLyogZG8gbm90aGluZyBpZiB3cm9uZyBwaWQgKi8KKwl9OworICAgIH0KK30KKworI2lmbmRlZiBIQVZFX0RJUkVOVF9ICisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2Vsc2UKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNlbmRpZgorCit2b2lkIHNzX2FkZF9pbmZvX2RpcihzY2lfaWR4LCBpbmZvX2RpciwgY29kZV9wdHIpCisgICAgaW50IHNjaV9pZHg7CisgICAgY2hhciAqaW5mb19kaXI7CisgICAgaW50ICpjb2RlX3B0cjsKK3sKKyAgICByZWdpc3RlciBzc19kYXRhICppbmZvOworICAgIERJUiAqZDsKKyAgICBpbnQgbl9kaXJzOworICAgIHJlZ2lzdGVyIGNoYXIgKipkaXJzOworCisgICAgaW5mbyA9IHNzX2luZm8oc2NpX2lkeCk7CisgICAgaWYgKGluZm9fZGlyID09IE5VTEwgfHwgKmluZm9fZGlyID09ICdcMCcpIHsKKwkqY29kZV9wdHIgPSBTU19FVF9OT19JTkZPX0RJUjsKKwlyZXR1cm47CisgICAgfQorICAgIGlmICgoZCA9IG9wZW5kaXIoaW5mb19kaXIpKSA9PSAoRElSICopTlVMTCkgeworCSpjb2RlX3B0ciA9IGVycm5vOworCXJldHVybjsKKyAgICB9CisgICAgY2xvc2VkaXIoZCk7CisgICAgZGlycyA9IGluZm8tPmluZm9fZGlyczsKKyAgICBmb3IgKG5fZGlycyA9IDA7IGRpcnNbbl9kaXJzXSAhPSAoY2hhciAqKU5VTEw7IG5fZGlycysrKQorCTsJCS8qIGdldCBudW1iZXIgb2Ygbm9uLU5VTEwgZGlyIGVudHJpZXMgKi8KKyAgICBkaXJzID0gKGNoYXIgKiopcmVhbGxvYygoY2hhciAqKWRpcnMsCisJCQkgICAgKHVuc2lnbmVkKShuX2RpcnMgKyAyKSpzaXplb2YoY2hhciAqKSk7CisgICAgaWYgKGRpcnMgPT0gKGNoYXIgKiopTlVMTCkgeworCWluZm8tPmluZm9fZGlycyA9IChjaGFyICoqKU5VTEw7CisJKmNvZGVfcHRyID0gZXJybm87CisJcmV0dXJuOworICAgIH0KKyAgICBpbmZvLT5pbmZvX2RpcnMgPSBkaXJzOworICAgIGRpcnNbbl9kaXJzICsgMV0gPSAoY2hhciAqKU5VTEw7CisgICAgZGlyc1tuX2RpcnNdID0gbWFsbG9jKCh1bnNpZ25lZClzdHJsZW4oaW5mb19kaXIpKzEpOworICAgIHN0cmNweShkaXJzW25fZGlyc10sIGluZm9fZGlyKTsKKyAgICAqY29kZV9wdHIgPSAwOworfQorCit2b2lkIHNzX2RlbGV0ZV9pbmZvX2RpcihzY2lfaWR4LCBpbmZvX2RpciwgY29kZV9wdHIpCisgICAgaW50IHNjaV9pZHg7CisgICAgY2hhciAqaW5mb19kaXI7CisgICAgaW50ICpjb2RlX3B0cjsKK3sKKyAgICByZWdpc3RlciBjaGFyICoqaV9kOworICAgIHJlZ2lzdGVyIGNoYXIgKippbmZvX2RpcnM7CisKKyAgICBpbmZvX2RpcnMgPSBzc19pbmZvKHNjaV9pZHgpLT5pbmZvX2RpcnM7CisgICAgZm9yIChpX2QgPSBpbmZvX2RpcnM7ICppX2Q7IGlfZCsrKSB7CisJaWYgKCFzdHJjbXAoKmlfZCwgaW5mb19kaXIpKSB7CisJICAgIHdoaWxlICgqaV9kKSB7CisJCSppX2QgPSAqKGlfZCsxKTsKKwkJaV9kKys7CisJICAgIH0KKwkgICAgKmNvZGVfcHRyID0gMDsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisgICAgKmNvZGVfcHRyID0gU1NfRVRfTk9fSU5GT19ESVI7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9pbnZvY2F0aW9uLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9pbnZvY2F0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmY2IxNAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2ludm9jYXRpb24uYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZkZWYgSEFTX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorI2RlZmluZQlzaXplCXNpemVvZihzc19kYXRhICopCisjaWZkZWYgSEFWRV9ETE9QRU4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKK2ludCBzc19jcmVhdGVfaW52b2NhdGlvbihzdWJzeXN0ZW1fbmFtZSwgdmVyc2lvbl9zdHJpbmcsIGluZm9fcHRyLAorCQkJIHJlcXVlc3RfdGFibGVfcHRyLCBjb2RlX3B0cikKKwljb25zdCBjaGFyICpzdWJzeXN0ZW1fbmFtZSwgKnZlcnNpb25fc3RyaW5nOworCXZvaWQgKmluZm9fcHRyOworCXNzX3JlcXVlc3RfdGFibGUgKnJlcXVlc3RfdGFibGVfcHRyOworCWludCAqY29kZV9wdHI7Cit7CisJcmVnaXN0ZXIgaW50IHNjaV9pZHg7CisJcmVnaXN0ZXIgc3NfZGF0YSAqbmV3X3RhYmxlOworCXJlZ2lzdGVyIHNzX2RhdGEgKip0YWJsZTsKKworCSpjb2RlX3B0ciA9IDA7CisJdGFibGUgPSBfc3NfdGFibGU7CisJbmV3X3RhYmxlID0gKHNzX2RhdGEgKikgbWFsbG9jKHNpemVvZihzc19kYXRhKSk7CisKKwlpZiAodGFibGUgPT0gKHNzX2RhdGEgKiopIE5VTEwpIHsKKwkJdGFibGUgPSAoc3NfZGF0YSAqKikgbWFsbG9jKDIgKiBzaXplKTsKKwkJdGFibGVbMF0gPSB0YWJsZVsxXSA9IChzc19kYXRhICopTlVMTDsKKwl9CisJaW5pdGlhbGl6ZV9zc19lcnJvcl90YWJsZSAoKTsKKworCWZvciAoc2NpX2lkeCA9IDE7IHRhYmxlW3NjaV9pZHhdICE9IChzc19kYXRhICopTlVMTDsgc2NpX2lkeCsrKQorCQk7CisJdGFibGUgPSAoc3NfZGF0YSAqKikgcmVhbGxvYygoY2hhciAqKXRhYmxlLAorCQkJCSAgICAgKCh1bnNpZ25lZClzY2lfaWR4KzIpKnNpemUpOworCXRhYmxlW3NjaV9pZHgrMV0gPSAoc3NfZGF0YSAqKSBOVUxMOworCXRhYmxlW3NjaV9pZHhdID0gbmV3X3RhYmxlOworCisJbmV3X3RhYmxlLT5zdWJzeXN0ZW1fbmFtZSA9IHN1YnN5c3RlbV9uYW1lOworCW5ld190YWJsZS0+c3Vic3lzdGVtX3ZlcnNpb24gPSB2ZXJzaW9uX3N0cmluZzsKKwluZXdfdGFibGUtPmFyZ3YgPSAoY2hhciAqKilOVUxMOworCW5ld190YWJsZS0+Y3VycmVudF9yZXF1ZXN0ID0gKGNoYXIgKilOVUxMOworCW5ld190YWJsZS0+aW5mb19kaXJzID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyICopKTsKKwkqbmV3X3RhYmxlLT5pbmZvX2RpcnMgPSAoY2hhciAqKU5VTEw7CisJbmV3X3RhYmxlLT5pbmZvX3B0ciA9IGluZm9fcHRyOworCW5ld190YWJsZS0+cHJvbXB0ID0gbWFsbG9jKCh1bnNpZ25lZClzdHJsZW4oc3Vic3lzdGVtX25hbWUpKzQpOworCXN0cmNweShuZXdfdGFibGUtPnByb21wdCwgc3Vic3lzdGVtX25hbWUpOworCXN0cmNhdChuZXdfdGFibGUtPnByb21wdCwgIjogICIpOworI2lmZGVmIHNpbGx5CisJbmV3X3RhYmxlLT5hYmJyZXZfaW5mbyA9IHNzX2FiYnJldl9pbml0aWFsaXplKCIvZXRjL3Bhc3N3ZCIsIGNvZGVfcHRyKTsKKyNlbHNlCisJbmV3X3RhYmxlLT5hYmJyZXZfaW5mbyA9IE5VTEw7CisjZW5kaWYKKwluZXdfdGFibGUtPmZsYWdzLmVzY2FwZV9kaXNhYmxlZCA9IDA7CisJbmV3X3RhYmxlLT5mbGFncy5hYmJyZXZzX2Rpc2FibGVkID0gMDsKKwluZXdfdGFibGUtPnJxdF90YWJsZXMgPQorCQkoc3NfcmVxdWVzdF90YWJsZSAqKikgY2FsbG9jKDIsIHNpemVvZihzc19yZXF1ZXN0X3RhYmxlICopKTsKKwkqKG5ld190YWJsZS0+cnF0X3RhYmxlcykgPSByZXF1ZXN0X3RhYmxlX3B0cjsKKwkqKG5ld190YWJsZS0+cnF0X3RhYmxlcysxKSA9IChzc19yZXF1ZXN0X3RhYmxlICopIE5VTEw7CisKKwluZXdfdGFibGUtPnJlYWRsaW5lX2hhbmRsZSA9IDA7CisJbmV3X3RhYmxlLT5yZWFkbGluZV9zaHV0ZG93biA9IDA7CisJbmV3X3RhYmxlLT5yZWFkbGluZSA9IDA7CisJbmV3X3RhYmxlLT5hZGRfaGlzdG9yeSA9IDA7CisJbmV3X3RhYmxlLT5yZWRpc3BsYXkgPSAwOworCW5ld190YWJsZS0+cmxfY29tcGxldGlvbl9tYXRjaGVzID0gMDsKKwlfc3NfdGFibGUgPSB0YWJsZTsKKyNpZiBkZWZpbmVkKEhBVkVfRExPUEVOKSAmJiBkZWZpbmVkKFNIQVJFRF9FTEZfTElCKQorCXNzX2dldF9yZWFkbGluZShzY2lfaWR4KTsKKyNlbmRpZgorCXJldHVybihzY2lfaWR4KTsKK30KKwordm9pZAorc3NfZGVsZXRlX2ludm9jYXRpb24oc2NpX2lkeCkKKwlpbnQgc2NpX2lkeDsKK3sKKwlyZWdpc3RlciBzc19kYXRhICp0OworCWludCBpZ25vcmVkX2NvZGU7CisKKwl0ID0gc3NfaW5mbyhzY2lfaWR4KTsKKwlmcmVlKHQtPnByb21wdCk7CisJZnJlZSh0LT5ycXRfdGFibGVzKTsKKwl3aGlsZSh0LT5pbmZvX2RpcnNbMF0gIT0gKGNoYXIgKilOVUxMKQorCQlzc19kZWxldGVfaW5mb19kaXIoc2NpX2lkeCwgdC0+aW5mb19kaXJzWzBdLCAmaWdub3JlZF9jb2RlKTsKKwlmcmVlKHQtPmluZm9fZGlycyk7CisjaWYgZGVmaW5lZChIQVZFX0RMT1BFTikgJiYgZGVmaW5lZChTSEFSRURfRUxGX0xJQikKKwlpZiAodC0+cmVhZGxpbmVfc2h1dGRvd24pCisJCSgqdC0+cmVhZGxpbmVfc2h1dGRvd24pKHQpOworI2VuZGlmCisJZnJlZSh0KTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2xpc3RfcnFzLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9saXN0X3Jxcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGY1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9saXN0X3Jxcy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk4NywgMTk4OCBieSBNSVQgU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIEJvYXJkCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdAorICogdGhlIG5hbWVzIG9mIE0uSS5ULiBhbmQgdGhlIE0uSS5ULiBTLkkuUC5CLiBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIGFuZCB0aGUKKyAqIE0uSS5ULiBTLkkuUC5CLiBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0CisgKiBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKK3R5cGVkZWYgdm9pZCBzaWdyZXRfdDsKKworc3RhdGljIGNoYXIgY29uc3QgdHdlbnR5Zml2ZV9zcGFjZXNbMjZdID0KKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICI7CitzdGF0aWMgY2hhciBjb25zdCBOTFsyXSA9ICJcbiI7CisKK3ZvaWQgc3NfbGlzdF9yZXF1ZXN0cyhpbnQgYXJnYyBfX1NTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBjb25zdCBjaGFyICogY29uc3QgKmFyZ3YgX19TU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IHNjaV9pZHgsIHZvaWQgKmluZm9wIF9fU1NfQVRUUigodW51c2VkKSkpCit7CisgICAgc3NfcmVxdWVzdF9lbnRyeSAqZW50cnk7CisgICAgY2hhciBjb25zdCAqIGNvbnN0ICpuYW1lOworICAgIGludCBzcGFjaW5nOworICAgIHNzX3JlcXVlc3RfdGFibGUgKip0YWJsZTsKKworICAgIGNoYXIgYnVmZmVyW0JVRlNJWl07CisgICAgRklMRSAqb3V0cHV0OworICAgIGludCBmZDsKKyAgICBzaWdzZXRfdCBvbWFzaywgaWdtYXNrOworICAgIHNpZ3JldF90ICgqZnVuYykoaW50KTsKKyNpZm5kZWYgTk9fRk9SSworICAgIGludCB3YWl0YjsKKyNlbmRpZgorCisgICAgc2lnZW1wdHlzZXQoJmlnbWFzayk7CisgICAgc2lnYWRkc2V0KCZpZ21hc2ssIFNJR0lOVCk7CisgICAgc2lncHJvY21hc2soU0lHX0JMT0NLLCAmaWdtYXNrLCAmb21hc2spOworICAgIGZ1bmMgPSBzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKyAgICBmZCA9IHNzX3BhZ2VyX2NyZWF0ZSgpOworICAgIG91dHB1dCA9IGZkb3BlbihmZCwgInciKTsKKyAgICBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCAoc2lnc2V0X3QgKikgMCk7CisKKyAgICBmcHJpbnRmIChvdXRwdXQsICJBdmFpbGFibGUgJXMgcmVxdWVzdHM6XG5cbiIsCisJICAgICBzc19pbmZvIChzY2lfaWR4KSAtPiBzdWJzeXN0ZW1fbmFtZSk7CisKKyAgICBmb3IgKHRhYmxlID0gc3NfaW5mbyhzY2lfaWR4KS0+cnF0X3RhYmxlczsgKnRhYmxlOyB0YWJsZSsrKSB7CisgICAgICAgIGVudHJ5ID0gKCp0YWJsZSktPnJlcXVlc3RzOworICAgICAgICBmb3IgKDsgZW50cnktPmNvbW1hbmRfbmFtZXM7IGVudHJ5KyspIHsKKyAgICAgICAgICAgIHNwYWNpbmcgPSAtMjsKKyAgICAgICAgICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoZW50cnktPmZsYWdzICYgU1NfT1BUX0RPTlRfTElTVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAobmFtZSA9IGVudHJ5LT5jb21tYW5kX25hbWVzOyAqbmFtZTsgbmFtZSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigqbmFtZSk7CisgICAgICAgICAgICAgICAgc3RybmNhdChidWZmZXIsICpuYW1lLCBsZW4pOworICAgICAgICAgICAgICAgIHNwYWNpbmcgKz0gbGVuICsgMjsKKyAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSkgeworICAgICAgICAgICAgICAgICAgICBzdHJjYXQoYnVmZmVyLCAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3BhY2luZyA+IDIzKSB7CisgICAgICAgICAgICAgICAgc3RyY2F0KGJ1ZmZlciwgTkwpOworICAgICAgICAgICAgICAgIGZwdXRzKGJ1ZmZlciwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICBzcGFjaW5nID0gMDsKKyAgICAgICAgICAgICAgICBidWZmZXJbMF0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybmNhdChidWZmZXIsIHR3ZW50eWZpdmVfc3BhY2VzLCAyNS1zcGFjaW5nKTsKKyAgICAgICAgICAgIHN0cmNhdChidWZmZXIsIGVudHJ5LT5pbmZvX3N0cmluZyk7CisgICAgICAgICAgICBzdHJjYXQoYnVmZmVyLCBOTCk7CisgICAgICAgICAgICBmcHV0cyhidWZmZXIsIG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKG91dHB1dCk7CisjaWZuZGVmIE5PX0ZPUksKKyAgICB3YWl0KCZ3YWl0Yik7CisjZW5kaWYKKyAgICAodm9pZCkgc2lnbmFsKFNJR0lOVCwgZnVuYyk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9saXN0ZW4uYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL2xpc3Rlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2M4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9saXN0ZW4uYwpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIExpc3RlbmVyIGxvb3AgZm9yIHN1YnN5c3RlbSBsaWJyYXJ5IGxpYnNzLmEuCisgKgorICoJJEhlYWRlciQKKyAqCSRMb2NrZXIkCisgKgorICogQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgTUlUIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBCb2FyZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBhbmQgdGhlCisgKiBNLkkuVC4gUy5JLlAuQi4gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK3R5cGVkZWYgdm9pZCBzaWdyZXRfdDsKKworc3RhdGljIHNzX2RhdGEgKmN1cnJlbnRfaW5mbzsKK3N0YXRpYyBqbXBfYnVmIGxpc3Rlbl9qbXBiOworc3RhdGljIHNpZ3JldF90ICgqc2lnX2NvbnQpKGludCk7CisKK3N0YXRpYyBzaWdyZXRfdCBwcmludF9wcm9tcHQoaW50IHNpZyBfX1NTX0FUVFIoKHVudXNlZCkpKQoreworICAgIGlmIChjdXJyZW50X2luZm8tPnJlZGlzcGxheSkKKwkgICAgKCpjdXJyZW50X2luZm8tPnJlZGlzcGxheSkoKTsKKyAgICBlbHNlIHsKKwkgICAgKHZvaWQpIGZwdXRzKGN1cnJlbnRfaW5mby0+cHJvbXB0LCBzdGRvdXQpOworCSAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorfQorCitzdGF0aWMgc2lncmV0X3QgbGlzdGVuX2ludF9oYW5kbGVyKGludCBzaWcgX19TU19BVFRSKCh1bnVzZWQpKSkKK3sKKyAgICBwdXRjKCdcbicsIHN0ZG91dCk7CisgICAgc2lnbmFsKFNJR0lOVCwgbGlzdGVuX2ludF9oYW5kbGVyKTsKKyAgICBsb25nam1wKGxpc3Rlbl9qbXBiLCAxKTsKK30KKworaW50IHNzX2xpc3RlbiAoaW50IHNjaV9pZHgpCit7CisgICAgY2hhciAqY3A7CisgICAgc3NfZGF0YSAqaW5mbzsKKyAgICBzaWdyZXRfdCAoKnNpZ19pbnQpKGludCksICgqb2xkX3NpZ19jb250KShpbnQpOworICAgIGNoYXIgaW5wdXRbQlVGU0laXTsKKyAgICBzaWdzZXRfdCBvbWFzaywgaWdtYXNrOworICAgIGludCBjb2RlOworICAgIGptcF9idWYgb2xkX2ptcGI7CisgICAgc3NfZGF0YSAqb2xkX2luZm8gPSBjdXJyZW50X2luZm87CisgICAgY2hhciAqbGluZTsKKworICAgIGN1cnJlbnRfaW5mbyA9IGluZm8gPSBzc19pbmZvKHNjaV9pZHgpOworICAgIHNpZ19jb250ID0gKHNpZ3JldF90ICgqKShpbnQpKSAwOworICAgIGluZm8tPmFib3J0ID0gMDsKKyAgICBzaWdlbXB0eXNldCgmaWdtYXNrKTsKKyAgICBzaWdhZGRzZXQoJmlnbWFzaywgU0lHSU5UKTsKKyAgICBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZpZ21hc2ssICZvbWFzayk7CisgICAgbWVtY3B5KG9sZF9qbXBiLCBsaXN0ZW5fam1wYiwgc2l6ZW9mKGptcF9idWYpKTsKKyAgICBzaWdfaW50ID0gc2lnbmFsKFNJR0lOVCwgbGlzdGVuX2ludF9oYW5kbGVyKTsKKyAgICBzZXRqbXAobGlzdGVuX2ptcGIpOworICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIChzaWdzZXRfdCAqKSAwKTsKKworICAgIHdoaWxlKCFpbmZvLT5hYm9ydCkgeworCW9sZF9zaWdfY29udCA9IHNpZ19jb250OworCXNpZ19jb250ID0gc2lnbmFsKFNJR0NPTlQsIHByaW50X3Byb21wdCk7CisJaWYgKHNpZ19jb250ID09IHByaW50X3Byb21wdCkKKwkgICAgc2lnX2NvbnQgPSBvbGRfc2lnX2NvbnQ7CisJaWYgKGluZm8tPnJlYWRsaW5lKSB7CisJCWxpbmUgPSAoKmluZm8tPnJlYWRsaW5lKShjdXJyZW50X2luZm8tPnByb21wdCk7CisJfSBlbHNlIHsKKwkJcHJpbnRfcHJvbXB0KDApOworCQlpZiAoZmdldHMoaW5wdXQsIEJVRlNJWiwgc3RkaW4pID09IGlucHV0KQorCQkJbGluZSA9IGlucHV0OworCQllbHNlCisJCQlsaW5lID0gTlVMTDsKKworCQlpbnB1dFtCVUZTSVotMV0gPSAwOworCX0KKwlpZiAobGluZSA9PSBOVUxMKSB7CisJCWNvZGUgPSBTU19FVF9FT0Y7CisJCSh2b2lkKSBzaWduYWwoU0lHQ09OVCwgc2lnX2NvbnQpOworCQlnb3RvIGVncmVzczsKKwl9CisKKwljcCA9IHN0cmNocihsaW5lLCAnXG4nKTsKKwlpZiAoY3ApIHsKKwkgICAgKmNwID0gJ1wwJzsKKwkgICAgaWYgKGNwID09IGxpbmUpCisJCWNvbnRpbnVlOworCX0KKwkodm9pZCkgc2lnbmFsKFNJR0NPTlQsIHNpZ19jb250KTsKKwlpZiAoaW5mby0+YWRkX2hpc3RvcnkpCisJCSgqaW5mby0+YWRkX2hpc3RvcnkpKGxpbmUpOworCisJY29kZSA9IHNzX2V4ZWN1dGVfbGluZSAoc2NpX2lkeCwgbGluZSk7CisJaWYgKGNvZGUgPT0gU1NfRVRfQ09NTUFORF9OT1RfRk9VTkQpIHsKKwkgICAgcmVnaXN0ZXIgY2hhciAqYyA9IGxpbmU7CisJICAgIHdoaWxlICgqYyA9PSAnICcgfHwgKmMgPT0gJ1x0JykKKwkJYysrOworCSAgICBjcCA9IHN0cmNociAoYywgJyAnKTsKKwkgICAgaWYgKGNwKQorCQkqY3AgPSAnXDAnOworCSAgICBjcCA9IHN0cmNociAoYywgJ1x0Jyk7CisJICAgIGlmIChjcCkKKwkJKmNwID0gJ1wwJzsKKwkgICAgc3NfZXJyb3IgKHNjaV9pZHgsIDAsCisJCSAgICAiVW5rbm93biByZXF1ZXN0IFwiJXNcIi4gIFR5cGUgXCI/XCIgZm9yIGEgcmVxdWVzdCBsaXN0LiIsCisJCSAgICAgICBjKTsKKwl9CisJaWYgKGluZm8tPnJlYWRsaW5lKQorCQlmcmVlKGxpbmUpOworICAgIH0KKyAgICBjb2RlID0gMDsKK2VncmVzczoKKyAgICAodm9pZCkgc2lnbmFsKFNJR0lOVCwgc2lnX2ludCk7CisgICAgbWVtY3B5KGxpc3Rlbl9qbXBiLCBvbGRfam1wYiwgc2l6ZW9mKGptcF9idWYpKTsKKyAgICBjdXJyZW50X2luZm8gPSBvbGRfaW5mbzsKKyAgICByZXR1cm4gY29kZTsKK30KKwordm9pZCBzc19hYm9ydF9zdWJzeXN0ZW0oaW50IHNjaV9pZHgsIGludCBjb2RlKQoreworICAgIHNzX2luZm8oc2NpX2lkeCktPmFib3J0ID0gMTsKKyAgICBzc19pbmZvKHNjaV9pZHgpLT5leGl0X3N0YXR1cyA9IGNvZGU7CisKK30KKwordm9pZCBzc19xdWl0KGludCBhcmdjIF9fU1NfQVRUUigodW51c2VkKSksCisJICAgICBjb25zdCBjaGFyICogY29uc3QgKmFyZ3YgX19TU19BVFRSKCh1bnVzZWQpKSwKKwkgICAgIGludCBzY2lfaWR4LCBwb2ludGVyIGluZm9wIF9fU1NfQVRUUigodW51c2VkKSkpCit7CisgICAgc3NfYWJvcnRfc3Vic3lzdGVtKHNjaV9pZHgsIDApOworfQorCisjaWZkZWYgSEFWRV9ETE9QRU4KKyNkZWZpbmUgZ2V0X3JlcXVlc3QodGJsLGlkeCkgICAgKCh0YmwpIC0+IHJlcXVlc3RzICsgKGlkeCkpCisKK3N0YXRpYyBjaGFyICpjbWRfZ2VuZXJhdG9yKGNvbnN0IGNoYXIgKnRleHQsIGludCBzdGF0ZSkKK3sKKwlzdGF0aWMgaW50CWxlbjsKKwlzdGF0aWMgc3NfcmVxdWVzdF90YWJsZSAqKnJxdGJsOworCXN0YXRpYyBpbnQJY3Vycl9ycXQ7CisJc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCAqIG5hbWU7CisJc3NfcmVxdWVzdF9lbnRyeSAqcmVxdWVzdDsKKwljaGFyCQkqcmV0OworCisJaWYgKHN0YXRlID09IDApIHsKKwkJbGVuID0gc3RybGVuKHRleHQpOworCQlycXRibCA9IGN1cnJlbnRfaW5mby0+cnF0X3RhYmxlczsKKwkJaWYgKCFycXRibCB8fCAhKnJxdGJsKQorCQkJcmV0dXJuIDA7CisJCWN1cnJfcnF0ID0gMDsKKwkJbmFtZSA9IDA7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFuYW1lIHx8ICEqbmFtZSkgeworCQkJcmVxdWVzdCA9IGdldF9yZXF1ZXN0KCpycXRibCwgY3Vycl9ycXQrKyk7CisJCQluYW1lID0gcmVxdWVzdC0+Y29tbWFuZF9uYW1lczsKKwkJCWlmICghbmFtZSkgeworCQkJCXJxdGJsKys7CisJCQkJaWYgKCpycXRibCkgeworCQkJCQljdXJyX3JxdCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoc3RybmNtcCgqbmFtZSwgdGV4dCwgbGVuKSA9PSAwKSB7CisJCQlyZXQgPSBtYWxsb2Moc3RybGVuKCpuYW1lKSsxKTsKKwkJCWlmIChyZXQpCisJCQkJc3RyY3B5KHJldCwgKm5hbWUpOworCQkJbmFtZSsrOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQluYW1lKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKipzc19ybF9jb21wbGV0aW9uKGNvbnN0IGNoYXIgKnRleHQsIGludCBzdGFydCwKKwkJCWludCBlbmQgX19TU19BVFRSKCh1bnVzZWQpKSkKK3sKKwlpZiAoKHN0YXJ0ID09IDApICYmIGN1cnJlbnRfaW5mby0+cmxfY29tcGxldGlvbl9tYXRjaGVzKQorCQlyZXR1cm4gKCpjdXJyZW50X2luZm8tPnJsX2NvbXBsZXRpb25fbWF0Y2hlcykKKwkJCSh0ZXh0LCBjbWRfZ2VuZXJhdG9yKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9taXQtc2lwYi1jb3B5cmlnaHQuaCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL21pdC1zaXBiLWNvcHlyaWdodC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmY2ZjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9taXQtc2lwYi1jb3B5cmlnaHQuaApAQCAtMCwwICsxLDE5IEBACisvKgorCitDb3B5cmlnaHQgMTk4NyBieSB0aGUgU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIEJvYXJkCisJb2YgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMKK2hlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCithcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQKK3RoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwKK2FuZCB0aGF0IHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KK00uSS5ULiBhbmQgdGhlIE0uSS5ULiBTLkkuUC5CLiBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dAordGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMKK3Byb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKyovCisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL21rX2NtZHMuMSBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL21rX2NtZHMuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTZlNDgzCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvbWtfY21kcy4xCkBAIC0wLDAgKzEsNTkgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlb2RvcmUgVHMnbworLlwiCisuVEggTUtfQ01EUyAxICIyMDAzIiBFMkZTUFJPR1MKKy5TSCBOQU1FCitta19jbWRzIFwtIGVycm9yIHRhYmxlIGNvbXBpbGVyCisuU0ggU1lOT1BTSVMKKy5CIG1rX2NtZHMKK2ZpbGUKKy5TSCBERVNDUklQVElPTgorLkIgTWtfY21kcworY29udmVydHMgYSB0YWJsZSBsaXN0aW5nIGNvbW1hbmQgbmFtZXMgYW5kIGFzc29jaWF0ZWQgaGVscCBtZXNzYWdlcworaW50byBhIEMgc291cmNlIGZpbGUgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZQorLklSIHNzICgzKQorbGlicmFyeS4KKworVGhlIHNvdXJjZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aCBhIHN1ZmZpeCBvZiBgYC5jdCcnOyB0aGUgZmlsZQorY29uc2lzdHMgb2YgYSBkZWNsYXJhdGlvbiBzdXBwbHlpbmcgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdGFibGU6CisKKy5CIGNvbW1hbmRfdGFibGUKKy5JIG5hbWUKKworZm9sbG93ZWQgYnkgZW50cmllcyBvZiB0aGUgZm9ybToKKworWworLkIgcmVxdWVzdAorfAorLkIgdW5pbXBsZW1lbnRlZAorXSAKKy5JIG5hbWUsCisiCisuSSBzdHJpbmcKKyJbLCBhYmJyZXZdLi4uOworCithbmQgYSBmaW5hbAorCisuQiBlbmQKKwordG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgdGFibGUuCisKK0EgQyBzb3VyY2UgZmlsZSBpcyBnZW5lcmF0ZWQgd2hpY2ggc2hvdWxkIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQKK3dpdGggdGhlIG9iamVjdCBmaWxlcyB1c2UgdGhlIHNzIGxpYnJhcnkuICAgCisKK0EgYGAjJycgaW4gdGhlIHNvdXJjZSBmaWxlIGlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IGNoYXJhY3RlciwgYW5kIGFsbAorcmVtYWluaW5nIHRleHQgdG8gdGhlIGVuZCBvZiB0aGUgc291cmNlIGxpbmUgd2lsbCBiZSBpZ25vcmVkLgorCisuU0ggQlVHUworCitTaW5jZSB0aGUgb3JpZ2luYWwKKy5CIG1rX2NtZHMKK3VzZXMgYSB2ZXJ5IHNpbXBsZSBwYXJzZXIgYmFzZWQgb24KKy5JUiB5YWNjICgxKSwgCithbmQgdGhpcyBjdXJyZW50IHZlcnNpb24gb2YgCisuQiBta19jbWRzCit1c2VzIGFuIGF3ay9zZWQgY29tYmluYXRpb24gb2Ygc2NyaXB0cywgCitpdHMgZXJyb3IgcmVjb3ZlcnkgbGVhdmVzIG11Y2ggdG8gYmUgZGVzaXJlZC4KKworLlNIICJTRUUgQUxTTyIKK3NzICgzKQorCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9ta19jbWRzLnNoLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvbWtfY21kcy5zaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI5NjZjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvbWtfY21kcy5zaC5pbgpAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMKKyMKKworZGF0YXJvb3RkaXI9QGRhdGFyb290ZGlyQAorRElSPSIke0RJUi1AZGF0YWRpckAvc3N9IgorU1NfRElSPSJAU1NfRElSQCIKK0FXSz1AQVdLQAorU0VEPUBTRURACisKK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQorZG8KKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKK2lmIHRlc3QgIngkMSIgPSB4IDsgdGhlbgorICAgIGVjaG8gIlVzYWdlOiBta19jbWRzIGZpbGUiCisgICAgZXhpdCAxCitmaQorCitpZiB0ZXN0IC1uICIkX1NTX0RJUl9PVkVSUklERSIgOyB0aGVuCisgICAgRElSPSIkX1NTX0RJUl9PVkVSUklERSI7CitmaQorCitpZiB0ZXN0ICEgLWYgJERJUi9jdF9jLnNlZCB8fCB0ZXN0ICEgLWYgJERJUi9jdF9jLmF3ayA7IHRoZW4KKyAgICBESVI9IiRTU19ESVIiCisjICAgIGVjaG8gIkZhbGxpbmcgYmFjayB0byAkRElSLi4uIgorICAgIGlmIHRlc3QgISAtZiAiJERJUi9jdF9jLnNlZCIgfHwgdGVzdCAhIC1mICIkRElSL2N0X2MuYXdrIiA7IHRoZW4KKwllY2hvICJta19jbWRzOiBDb3VsZG4ndCBmaW5kIG1rX2NtZHMncyB0ZW1wbGF0ZSBmaWxlcy4iCisJZXhpdCAxCisgICAgZmkKK2ZpCisKK0ZJTEU9IiQxIgorUk9PVD1gZWNobyAkMSB8IHNlZCAtZSBzLy5jdCQvL2AKK0JBU0U9YGJhc2VuYW1lICIkUk9PVCJgCitUTVA9ImN0JCQuYyIKKworaWYgdGVzdCAhIC1mICIkRklMRSIgOyB0aGVuCisgICAgZWNobyAibWtfY21kczogJEZJTEU6IEZpbGUgbm90IGZvdW5kIgorICAgIGV4aXQgMTsKK2ZpCisKKyR7U0VEfSAtZiAiJHtESVJ9L2N0X2Muc2VkIiAgIiR7RklMRX0iIFwKKwl8ICR7QVdLfSAtZiAiJHtESVJ9L2N0X2MuYXdrIiAicm9vdG5hbWU9JHtST09UfSIgIm91dGZpbGU9JHtUTVB9IiAtCisKK2lmIGdyZXAgIl4jX19FUlJPUl9JTl9GSUxFIiAiJHtUTVB9IiA+IC9kZXYvbnVsbDsgdGhlbgorCXJtICIke1RNUH0iCisJZXhpdCAxCitlbHNlCisJcm0gLWYgIiR7QkFTRX0uYyIKKwltdiAtZiAiJHtUTVB9IiAiJHtCQVNFfS5jIgorCWNobW9kIC13ICIke0JBU0V9LmMiCisJZXhpdCAwCitmaQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvcGFnZXIuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3BhZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmYzEwNAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3BhZ2VyLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBQYWdlcjogUm91dGluZXMgdG8gY3JlYXRlIGEgIm1vcmUiIHJ1bm5pbmcgb3V0IG9mIGEgcGFydGljdWxhciBmaWxlCisgKiBkZXNjcmlwdG9yLgorICoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbHNlCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisKKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBIQVZFX1NZU19QUkNUTF9ICisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjZWxzZQorI2RlZmluZSBQUl9HRVRfRFVNUEFCTEUgMworI2VuZGlmCisjaWYgKCFkZWZpbmVkKEhBVkVfUFJDVEwpICYmIGRlZmluZWQobGludXgpKQorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjZW5kaWYKKworc3RhdGljIGNoYXIgTU9SRVtdID0gIm1vcmUiOworZXh0ZXJuIGNoYXIgKl9zc19wYWdlcl9uYW1lOworZXh0ZXJuIGNoYXIgKmdldGVudiBQUk9UT1RZUEUoKGNvbnN0IGNoYXIgKikpOworCitjaGFyICpzc19zYWZlX2dldGVudihjb25zdCBjaGFyICphcmcpCit7CisJaWYgKChnZXR1aWQoKSAhPSBnZXRldWlkKCkpIHx8IChnZXRnaWQoKSAhPSBnZXRlZ2lkKCkpKQorCQlyZXR1cm4gTlVMTDsKKyNpZiBIQVZFX1BSQ1RMCisJaWYgKHByY3RsKFBSX0dFVF9EVU1QQUJMRSwgMCwgMCwgMCwgMCkgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisjZWxzZQorI2lmIChkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKFNZU19wcmN0bCkpCisJaWYgKHN5c2NhbGwoU1lTX3ByY3RsLCBQUl9HRVRfRFVNUEFCTEUsIDAsIDAsIDAsIDApID09IDApCisJCXJldHVybiBOVUxMOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfX19TRUNVUkVfR0VURU5WCisJcmV0dXJuIF9fc2VjdXJlX2dldGVudihhcmcpOworI2Vsc2UKKwlyZXR1cm4gZ2V0ZW52KGFyZyk7CisjZW5kaWYKK30KKworLyoKKyAqIHRoaXMgbmVlZHMgYSAqbG90KiBvZiB3b3JrLi4uLgorICoKKyAqIHJ1biBpbiBzYW1lIHByb2Nlc3MKKyAqIGhhbmRsZSBTSUdJTlQgc2Vuc2libHkKKyAqIGFsbG93IGZpbmVyIGNvbnRyb2wgLS0gcHV0LXBhZ2UtYnJlYWstaGVyZQorICovCisKKyNpZm5kZWYgTk9fRk9SSworaW50IHNzX3BhZ2VyX2NyZWF0ZSh2b2lkKQoreworCWludCBmaWxlZGVzWzJdOworCisJaWYgKHBpcGUoZmlsZWRlcykgIT0gMCkKKwkJcmV0dXJuKC0xKTsKKworCXN3aXRjaChmb3JrKCkpIHsKKwljYXNlIC0xOgorCQlyZXR1cm4oLTEpOworCWNhc2UgMDoKKwkJLyoKKwkJICogQ2hpbGQ7IGR1cCByZWFkIGhhbGYgdG8gMCwgY2xvc2UgYWxsIGJ1dCAwLCAxLCBhbmQgMgorCQkgKi8KKwkJaWYgKGR1cDIoZmlsZWRlc1swXSwgMCkgPT0gLTEpCisJCQlleGl0KDEpOworCQlzc19wYWdlX3N0ZGluKCk7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogUGFyZW50OiAgY2xvc2UgInJlYWQiIHNpZGUgb2YgcGlwZSwgcmV0dXJuCisJCSAqICJ3cml0ZSIgc2lkZS4KKwkJICovCisJCSh2b2lkKSBjbG9zZShmaWxlZGVzWzBdKTsKKwkJcmV0dXJuKGZpbGVkZXNbMV0pOworCX0KK30KKyNlbHNlIC8qIGRvbid0IGZvcmsgKi8KK2ludCBzc19wYWdlcl9jcmVhdGUoKQoreworICAgIGludCBmZDsKKyAgICBmZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19XUk9OTFksIDApOworICAgIHJldHVybiBmZDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHdyaXRlX2FsbChpbnQgZmQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0OworCWludCBjID0gMDsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJcmV0ID0gd3JpdGUoZmQsIGJ1ZiwgY291bnQpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKChlcnJubyA9PSBFQUdBSU4pIHx8IChlcnJubyA9PSBFSU5UUikpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY291bnQgLT0gcmV0OworCQlidWYgKz0gcmV0OworCQljICs9IHJldDsKKwl9CisJcmV0dXJuIGM7Cit9CisKK3ZvaWQgc3NfcGFnZV9zdGRpbigpCit7CisJaW50IGk7CisJc2lnc2V0X3QgbWFzazsKKworCWZvciAoaSA9IDM7IGkgPCAzMjsgaSsrKQorCQkodm9pZCkgY2xvc2UoaSk7CisJKHZvaWQpIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgMCwgJm1hc2spOworCXNpZ2RlbHNldCgmbWFzaywgU0lHSU5UKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm1hc2ssIDApOworCWlmIChfc3NfcGFnZXJfbmFtZSA9PSAoY2hhciAqKU5VTEwpIHsKKwkJaWYgKChfc3NfcGFnZXJfbmFtZSA9IHNzX3NhZmVfZ2V0ZW52KCJQQUdFUiIpKSA9PSAoY2hhciAqKU5VTEwpCisJCQlfc3NfcGFnZXJfbmFtZSA9IE1PUkU7CisJfQorCSh2b2lkKSBleGVjbHAoX3NzX3BhZ2VyX25hbWUsIF9zc19wYWdlcl9uYW1lLCAoY2hhciAqKSBOVUxMKTsKKwl7CisJCS8qIG1pbmltYWwgcmVjb3ZlcnkgaWYgcGFnZXIgcHJvZ3JhbSBpc24ndCBmb3VuZCAqLworCQljaGFyIGJ1Zls4MF07CisJCXJlZ2lzdGVyIGludCBuOworCQl3aGlsZSAoKG4gPSByZWFkKDAsIGJ1ZiwgODApKSA+IDApCisJCQl3cml0ZV9hbGwoMSwgYnVmLCBuKTsKKwl9CisJZXhpdChlcnJubyk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9wYXJzZS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTUwMzBhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvcGFyc2UuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZkZWYgSEFTX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorCitlbnVtIHBhcnNlX21vZGUgeyBXSElURVNQQUNFLCBUT0tFTiwgUVVPVEVEX1NUUklORyB9OworCisvKgorICogcGFyc2UobGluZV9wdHIsIGFyZ2NfcHRyKQorICoKKyAqIEZ1bmN0aW9uOgorICogICAgICBQYXJzZXMgbGluZSwgZGl2aWRpbmcgYXQgd2hpdGVzcGFjZSwgaW50byB0b2tlbnMsIHJldHVybnMKKyAqICAgICAgdGhlICJhcmdjIiBhbmQgImFyZ3YiIHZhbHVlcy4KKyAqIEFyZ3VtZW50czoKKyAqICAgICAgbGluZV9wdHIgKGNoYXIgKikKKyAqICAgICAgICAgICAgICBQb2ludGVyIHRvIHRleHQgc3RyaW5nIHRvIGJlIHBhcnNlZC4KKyAqICAgICAgYXJnY19wdHIgKGludCAqKQorICogICAgICAgICAgICAgIFdoZXJlIHRvIHB1dCB0aGUgImFyZ2MiIChudW1iZXIgb2YgdG9rZW5zKSB2YWx1ZS4KKyAqIFJldHVybnM6CisgKiAgICAgIGFyZ3YgKGNoYXIgKiopCisgKiAgICAgICAgICAgICAgU2VyaWVzIG9mIHBvaW50ZXJzIHRvIHBhcnNlZCB0b2tlbnMuCisgKi8KKworI2RlZmluZSBORVdfQVJHVihvbGQsbikgKGNoYXIgKiopcmVhbGxvYygoY2hhciAqKW9sZCxcCisJCQkJCSAodW5zaWduZWQpKG4rMikqc2l6ZW9mKGNoYXIqKSkKKworY2hhciAqKnNzX3BhcnNlIChzY2lfaWR4LCBsaW5lX3B0ciwgYXJnY19wdHIpCisgICAgaW50IHNjaV9pZHg7CisgICAgcmVnaXN0ZXIgY2hhciAqbGluZV9wdHI7CisgICAgaW50ICphcmdjX3B0cjsKK3sKKyAgICByZWdpc3RlciBjaGFyICoqYXJndiwgKmNwOworICAgIHJlZ2lzdGVyIGludCBhcmdjOworICAgIHJlZ2lzdGVyIGVudW0gcGFyc2VfbW9kZSBwYXJzZV9tb2RlOworCisgICAgYXJndiA9IChjaGFyICoqKSBtYWxsb2MgKHNpemVvZihjaGFyICopKTsKKyAgICBpZiAoYXJndiA9PSAoY2hhciAqKilOVUxMKSB7CisJc3NfZXJyb3Ioc2NpX2lkeCwgZXJybm8sICJDYW4ndCBhbGxvY2F0ZSBzdG9yYWdlIik7CisJKmFyZ2NfcHRyID0gMDsKKwlyZXR1cm4oYXJndik7CisgICAgfQorICAgICphcmd2ID0gKGNoYXIgKilOVUxMOworCisgICAgYXJnYyA9IDA7CisKKyAgICBwYXJzZV9tb2RlID0gV0hJVEVTUEFDRTsJLyogZmx1c2hpbmcgd2hpdGVzcGFjZSAqLworICAgIGNwID0gbGluZV9wdHI7CQkvKiBjcCBpcyBmb3Igb3V0cHV0ICovCisgICAgd2hpbGUgKDEpIHsKKyNpZmRlZiBERUJVRworCXsKKwkgICAgcHJpbnRmICgiY2hhcmFjdGVyIGAlYycsIG1vZGUgJWRcbiIsICpsaW5lX3B0ciwgcGFyc2VfbW9kZSk7CisJfQorI2VuZGlmCisJd2hpbGUgKHBhcnNlX21vZGUgPT0gV0hJVEVTUEFDRSkgeworCSAgICBpZiAoKmxpbmVfcHRyID09ICdcMCcpCisJCWdvdG8gZW5kX29mX2xpbmU7CisJICAgIGlmICgqbGluZV9wdHIgPT0gJyAnIHx8ICpsaW5lX3B0ciA9PSAnXHQnKSB7CisJCWxpbmVfcHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmICgqbGluZV9wdHIgPT0gJyInKSB7CisJCS8qIGdvIHRvIHF1b3RlZC1zdHJpbmcgbW9kZSAqLworCQlwYXJzZV9tb2RlID0gUVVPVEVEX1NUUklORzsKKwkJY3AgPSBsaW5lX3B0cisrOworCQlhcmd2ID0gTkVXX0FSR1YgKGFyZ3YsIGFyZ2MpOworCQlhcmd2W2FyZ2MrK10gPSBjcDsKKwkJYXJndlthcmdjXSA9IE5VTEw7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCS8qIHJhbmRvbS10b2tlbiBtb2RlICovCisJCXBhcnNlX21vZGUgPSBUT0tFTjsKKwkJY3AgPSBsaW5lX3B0cjsKKwkJYXJndiA9IE5FV19BUkdWIChhcmd2LCBhcmdjKTsKKwkJYXJndlthcmdjKytdID0gbGluZV9wdHI7CisJCWFyZ3ZbYXJnY10gPSBOVUxMOworCSAgICB9CisJfQorCXdoaWxlIChwYXJzZV9tb2RlID09IFRPS0VOKSB7CisJICAgIGlmICgqbGluZV9wdHIgPT0gJ1wwJykgeworCQkqY3ArKyA9ICdcMCc7CisJCWdvdG8gZW5kX29mX2xpbmU7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKmxpbmVfcHRyID09ICcgJyB8fCAqbGluZV9wdHIgPT0gJ1x0JykgeworCQkqY3ArKyA9ICdcMCc7CisJCWxpbmVfcHRyKys7CisJCXBhcnNlX21vZGUgPSBXSElURVNQQUNFOworCSAgICB9CisJICAgIGVsc2UgaWYgKCpsaW5lX3B0ciA9PSAnIicpIHsKKwkJbGluZV9wdHIrKzsKKwkJcGFyc2VfbW9kZSA9IFFVT1RFRF9TVFJJTkc7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCSpjcCsrID0gKmxpbmVfcHRyKys7CisJICAgIH0KKwl9CisJd2hpbGUgKHBhcnNlX21vZGUgPT0gUVVPVEVEX1NUUklORykgeworCSAgICBpZiAoKmxpbmVfcHRyID09ICdcMCcpIHsKKwkJc3NfZXJyb3IgKHNjaV9pZHgsIDAsCisJCQkgICJVbmJhbGFuY2VkIHF1b3RlcyBpbiBjb21tYW5kIGxpbmUiKTsKKwkJZnJlZSAoYXJndik7CisJCSphcmdjX3B0ciA9IDA7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJICAgIGVsc2UgaWYgKCpsaW5lX3B0ciA9PSAnIicpIHsKKwkJaWYgKCorK2xpbmVfcHRyID09ICciJykgeworCQkgICAgKmNwKysgPSAnIic7CisJCSAgICBsaW5lX3B0cisrOworCQl9CisJCWVsc2UgeworCQkgICAgcGFyc2VfbW9kZSA9IFRPS0VOOworCQl9CisJICAgIH0KKwkgICAgZWxzZSB7CisJCSpjcCsrID0gKmxpbmVfcHRyKys7CisJICAgIH0KKwl9CisgICAgfQorZW5kX29mX2xpbmU6CisgICAgKmFyZ2NfcHRyID0gYXJnYzsKKyNpZmRlZiBERUJVRworICAgIHsKKwlpbnQgaTsKKwlwcmludGYgKCJhcmdjID0gJWRcbiIsIGFyZ2MpOworCWZvciAoaSA9IDA7IGkgPD0gYXJnYzsgaSsrKQorCSAgICBwcmludGYgKCJcdGFyZ3ZbJTJkXSA9IGAlcydcbiIsIGksCisJCSAgICBhcmd2W2ldID8gYXJndltpXSA6ICI8TlVMTD4iKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4oYXJndik7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9wcm9tcHQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3Byb21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTQyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9wcm9tcHQuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogcHJvbXB0LmM6IFJvdXRpbmVzIGZvciByZXRyaWV2aW5nIGFuZCBzZXR0aW5nIGEgcHJvbXB0LgorICoKKyAqICRIZWFkZXIkCisgKiAkTG9ja2VyJAorICoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorCit2b2lkIHNzX3NldF9wcm9tcHQoaW50IHNjaV9pZHgsIGNoYXIgKm5ld19wcm9tcHQpCit7CisgICAgIHNzX2luZm8oc2NpX2lkeCktPnByb21wdCA9IG5ld19wcm9tcHQ7Cit9CisKK2NoYXIgKnNzX2dldF9wcm9tcHQoaW50IHNjaV9pZHgpCit7CisgICAgIHJldHVybihzc19pbmZvKHNjaV9pZHgpLT5wcm9tcHQpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvcmVxdWVzdF90YmwuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3JlcXVlc3RfdGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzMmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3JlcXVlc3RfdGJsLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3NfaW50ZXJuYWwuaCIKKworI2RlZmluZSBzc3J0IHNzX3JlcXVlc3RfdGFibGUJLyogZm9yIHNvbWUgcmVhZGFibGUgY29kZS4uLiAqLworCit2b2lkIHNzX2FkZF9yZXF1ZXN0X3RhYmxlKHNjaV9pZHgsIHJxdGJsX3B0ciwgcG9zaXRpb24sIGNvZGVfcHRyKQorCWludCBzY2lfaWR4OworCXNzcnQgKnJxdGJsX3B0cjsKKwlpbnQgcG9zaXRpb247CQkvKiAxIC0+IGJlY29tZXMgc2Vjb25kLi4uICovCisJaW50ICpjb2RlX3B0cjsKK3sKKwlyZWdpc3RlciBzc19kYXRhICppbmZvOworCXJlZ2lzdGVyIGludCBpLCBzaXplOworCXNzcnQgKip0OworCisJaW5mbyA9IHNzX2luZm8oc2NpX2lkeCk7CisJZm9yIChzaXplPTA7IGluZm8tPnJxdF90YWJsZXNbc2l6ZV0gIT0gKHNzcnQgKilOVUxMOyBzaXplKyspCisJCTsKKwkvKiBzaXplID09IEMgc3Vic2NyaXB0IG9mIE5VTEwgPT0gI2VsZW1lbnRzICovCisJc2l6ZSArPSAyOwkJLyogbmV3IGVsZW1lbnQsIGFuZCBOVUxMICovCisJdCA9IChzc3J0ICoqKXJlYWxsb2MoaW5mby0+cnF0X3RhYmxlcywgKHVuc2lnbmVkKXNpemUqc2l6ZW9mKHNzcnQpKTsKKwlpZiAodCA9PSAoc3NydCAqKilOVUxMKSB7CisJCSpjb2RlX3B0ciA9IGVycm5vOworCQlyZXR1cm47CisJfQorCWluZm8tPnJxdF90YWJsZXMgPSB0OworCWlmIChwb3NpdGlvbiA+IHNpemUgLSAyKQorCQlwb3NpdGlvbiA9IHNpemUgLSAyOworCisJaWYgKHNpemUgPiAxKQorCQlmb3IgKGkgPSBzaXplIC0gMjsgaSA+PSBwb3NpdGlvbjsgaS0tKQorCQkJaW5mby0+cnF0X3RhYmxlc1tpKzFdID0gaW5mby0+cnF0X3RhYmxlc1tpXTsKKworCWluZm8tPnJxdF90YWJsZXNbcG9zaXRpb25dID0gcnF0YmxfcHRyOworCWluZm8tPnJxdF90YWJsZXNbc2l6ZS0xXSA9IChzc3J0ICopTlVMTDsKKwkqY29kZV9wdHIgPSAwOworfQorCit2b2lkIHNzX2RlbGV0ZV9yZXF1ZXN0X3RhYmxlKHNjaV9pZHgsIHJxdGJsX3B0ciwgY29kZV9wdHIpCisgICAgIGludCBzY2lfaWR4OworICAgICBzc3J0ICpycXRibF9wdHI7CisgICAgIGludCAqY29kZV9wdHI7Cit7CisgICAgIHJlZ2lzdGVyIHNzX2RhdGEgKmluZm87CisgICAgIHJlZ2lzdGVyIHNzcnQgKipydDEsICoqcnQyOworCisgICAgICpjb2RlX3B0ciA9IFNTX0VUX1RBQkxFX05PVF9GT1VORDsKKyAgICAgaW5mbyA9IHNzX2luZm8oc2NpX2lkeCk7CisgICAgIHJ0MSA9IGluZm8tPnJxdF90YWJsZXM7CisgICAgIGZvciAocnQyID0gcnQxOyAqcnQxOyBydDErKykgeworCSAgaWYgKCpydDEgIT0gcnF0YmxfcHRyKSB7CisJICAgICAgICpydDIrKyA9ICpydDE7CisJICAgICAgICpjb2RlX3B0ciA9IDA7CisJICB9CisgICAgIH0KKyAgICAgKnJ0MiA9IChzc3J0ICopTlVMTDsKKyAgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvcmVxdWVzdHMuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3JlcXVlc3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwNjEwMAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3JlcXVlc3RzLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIFZhcmlvdXMgbWlub3Igcm91dGluZXMuLi4KKyAqCisgKiBDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk4OSBieSBNSVQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc19pbnRlcm5hbC5oIgorCisjZGVmaW5lCURFQ0xBUkUobmFtZSkgdm9pZCBuYW1lKGludCBhcmdjLGNvbnN0IGNoYXIgKiBjb25zdCAqYXJndiwgXAorCQkJCWludCBzY2lfaWR4LCB2b2lkICppbmZvcCkKKworLyoKKyAqIHNzX3NlbGZfaWRlbnRpZnkgLS0gYXNzaWduZWQgYnkgZGVmYXVsdCB0byB0aGUgIi4iIHJlcXVlc3QKKyAqLwordm9pZCBzc19zZWxmX2lkZW50aWZ5KGludCBhcmdjIF9fU1NfQVRUUigodW51c2VkKSksCisJCSAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqYXJndiBfX1NTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBpbnQgc2NpX2lkeCwgdm9pZCAqaW5mb3AgX19TU19BVFRSKCh1bnVzZWQpKSkKK3sKKyAgICAgcmVnaXN0ZXIgc3NfZGF0YSAqaW5mbyA9IHNzX2luZm8oc2NpX2lkeCk7CisgICAgIHByaW50ZigiJXMgdmVyc2lvbiAlc1xuIiwgaW5mby0+c3Vic3lzdGVtX25hbWUsCisJICAgIGluZm8tPnN1YnN5c3RlbV92ZXJzaW9uKTsKK30KKworLyoKKyAqIHNzX3N1YnN5c3RlbV9uYW1lIC0tIHByaW50IG5hbWUgb2Ygc3Vic3lzdGVtCisgKi8KK3ZvaWQgc3Nfc3Vic3lzdGVtX25hbWUoaW50IGFyZ2MgX19TU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqYXJndiBfX1NTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgaW50IHNjaV9pZHgsCisJCSAgICAgICB2b2lkICppbmZvcCBfX1NTX0FUVFIoKHVudXNlZCkpKQoreworICAgICBwcmludGYoIiVzXG4iLCBzc19pbmZvKHNjaV9pZHgpLT5zdWJzeXN0ZW1fbmFtZSk7Cit9CisKKy8qCisgKiBzc19zdWJzeXN0ZW1fdmVyc2lvbiAtLSBwcmludCB2ZXJzaW9uIG9mIHN1YnN5c3RlbQorICovCit2b2lkIHNzX3N1YnN5c3RlbV92ZXJzaW9uKGludCBhcmdjIF9fU1NfQVRUUigodW51c2VkKSksCisJCQkgIGNvbnN0IGNoYXIgKiBjb25zdCAqYXJndiBfX1NTX0FUVFIoKHVudXNlZCkpLAorCQkJICBpbnQgc2NpX2lkeCwKKwkJCSAgdm9pZCAqaW5mb3AgX19TU19BVFRSKCh1bnVzZWQpKSkKK3sKKyAgICAgcHJpbnRmKCIlc1xuIiwgc3NfaW5mbyhzY2lfaWR4KS0+c3Vic3lzdGVtX3ZlcnNpb24pOworfQorCisvKgorICogc3NfdW5pbXBsZW1lbnRlZCAtLSByb3V0aW5lIG5vdCBpbXBsZW1lbnRlZCAoc2hvdWxkIGJlCisgKiBzZXQgdXAgYXMgKGRvbnRfbGlzdCxkb250X3N1bW1hcml6ZSkpCisgKi8KK3ZvaWQgc3NfdW5pbXBsZW1lbnRlZChpbnQgYXJnYyBfX1NTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBjb25zdCBjaGFyICogY29uc3QgKmFyZ3YgX19TU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IHNjaV9pZHgsIHZvaWQgKmluZm9wIF9fU1NfQVRUUigodW51c2VkKSkpCit7CisgICAgIHNzX3BlcnJvcihzY2lfaWR4LCBTU19FVF9VTklNUExFTUVOVEVELCAiIik7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9zcy5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3Mvc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2MwNTBiCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3Mvc3MuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgTUlUIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBCb2FyZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBhbmQgdGhlCisgKiBNLkkuVC4gUy5JLlAuQi4gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRoaXMgcXVvdGUgaXMganVzdCB0b28gZ29vZCB0byBub3QgcGFzcyBvbjoKKyAqCisgKiAJIkJUVywgSSB3b3VsZCBoYXZlIHJlamVjdGVkIHRoZSBuYW1lIFN0b3J5IFNlcnZlciBiZWNhdXNlIGl0cworICogCWluaXRpYWxzIGFyZSBTUywgdGhlIG5hbWUgb2YgdGhlIHNlY3JldCBwb2xpY2UgaW4gTmF6aQorICogCUdlcm1hbnksIHByb2JhYmx5IHRoZSBtb3N0IGRlc3Bpc2VkIHBhaXIgb2YgbGV0dGVycyBpbiB3ZXN0ZXJuCisgKiAJY3VsdHVyZS4iICAtLS0gaHR0cDovL3NjcmlwdGluZ25ld3NhcmNoaXZlLnVzZXJsYW5kLmNvbS8xOTk5LzEyLzEzCisgKgorICogTGV0IG5vIG9uZSBzYXkgcG9saXRpY2FsIGNvcnJlY3RuZXNzIGlzbid0IGRlYWQuLi4uCisgKi8KKworI2lmbmRlZiBfc3NfaAorI2RlZmluZSBfc3NfaCBfX0ZJTEVfXworCisjaW5jbHVkZSA8c3Mvc3NfZXJyLmg+CisKKyNkZWZpbmUgX19TU19DT05TVCBjb25zdAorI2RlZmluZSBfX1NTX1BST1RPIChpbnQsIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBpbnQsIHZvaWQgKikKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9fU1NfQVRUUih4KSBfX2F0dHJpYnV0ZV9fKHgpCisjZWxzZQorI2RlZmluZSBfX1NTX0FUVFIoeCkKKyNlbmRpZgorCisKK3R5cGVkZWYgX19TU19DT05TVCBzdHJ1Y3QgX3NzX3JlcXVlc3RfZW50cnkgeworICAgIF9fU1NfQ09OU1QgY2hhciAqIF9fU1NfQ09OU1QgKmNvbW1hbmRfbmFtZXM7IC8qIHdoYXRldmVyICovCisgICAgdm9pZCAoKiBfX1NTX0NPTlNUIGZ1bmN0aW9uKSBfX1NTX1BST1RPOyAvKiBmb28gKi8KKyAgICBfX1NTX0NPTlNUIGNoYXIgKiBfX1NTX0NPTlNUIGluZm9fc3RyaW5nOwkvKiBOVUxMICovCisgICAgaW50IGZsYWdzOwkJCS8qIDAgKi8KK30gc3NfcmVxdWVzdF9lbnRyeTsKKwordHlwZWRlZiBfX1NTX0NPTlNUIHN0cnVjdCBfc3NfcmVxdWVzdF90YWJsZSB7CisgICAgaW50IHZlcnNpb247CisgICAgc3NfcmVxdWVzdF9lbnRyeSAqcmVxdWVzdHM7Cit9IHNzX3JlcXVlc3RfdGFibGU7CisKKyNkZWZpbmUgU1NfUlFUX1RCTF9WMgkyCisKK3R5cGVkZWYgc3RydWN0IF9zc19ycF9vcHRpb25zIHsJLyogREVGQVVMVCBWQUxVRVMgKi8KKyAgICBpbnQgdmVyc2lvbjsJCS8qIFNTX1JQX1YxICovCisgICAgdm9pZCAoKnVua25vd24pIF9fU1NfUFJPVE87CS8qIGNhbGwgZm9yIHVua25vd24gY29tbWFuZCAqLworICAgIGludCBhbGxvd19zdXNwZW5kOworICAgIGludCBjYXRjaF9pbnQ7Cit9IHNzX3JwX29wdGlvbnM7CisKKyNkZWZpbmUgU1NfUlBfVjEgMQorCisjZGVmaW5lIFNTX09QVF9ET05UX0xJU1QJMHgwMDAxCisjZGVmaW5lIFNTX09QVF9ET05UX1NVTU1BUklaRQkweDAwMDIKKwordm9pZCBzc19oZWxwIF9fU1NfUFJPVE87CisjaWYgMAorY2hhciAqc3NfY3VycmVudF9yZXF1ZXN0KCk7CS8qIFRoaXMgaXMgYWN0dWFsbHkgYSBtYWNybyAqLworI2VuZGlmCisKK2NoYXIgKnNzX25hbWUoaW50IHNjaV9pZHgpOwordm9pZCBzc19lcnJvciAoaW50LCBsb25nLCBjaGFyIGNvbnN0ICosIC4uLikKKwlfX1NTX0FUVFIoKGZvcm1hdChwcmludGYsIDMsIDQpKSk7Cit2b2lkIHNzX3BlcnJvciAoaW50LCBsb25nLCBjaGFyIGNvbnN0ICopOworCitpbnQgc3NfY3JlYXRlX2ludm9jYXRpb24oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHZvaWQgKiwKKwkJCSBzc19yZXF1ZXN0X3RhYmxlICosIGludCAqKTsKK3ZvaWQgc3NfZGVsZXRlX2ludm9jYXRpb24oaW50KTsKK2ludCBzc19saXN0ZW4oaW50KTsKK2ludCBzc19leGVjdXRlX2xpbmUoaW50LCBjaGFyICopOwordm9pZCBzc19hZGRfcmVxdWVzdF90YWJsZShpbnQsIHNzX3JlcXVlc3RfdGFibGUgKiwgaW50LCBpbnQgKik7Cit2b2lkIHNzX2RlbGV0ZV9yZXF1ZXN0X3RhYmxlKGludCwgc3NfcmVxdWVzdF90YWJsZSAqLCBpbnQgKik7Cit2b2lkIHNzX2Fib3J0X3N1YnN5c3RlbShpbnQgc2NpX2lkeCwgaW50IGNvZGUpOwordm9pZCBzc19xdWl0KGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgKmFyZ3YsIGludCBzY2lfaWR4LCB2b2lkICppbmZvcCk7Cit2b2lkIHNzX3NlbGZfaWRlbnRpZnkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBjb25zdCAqYXJndiwgaW50IHNjaV9pZHgsIHZvaWQgKmluZm9wKTsKK3ZvaWQgc3Nfc3Vic3lzdGVtX25hbWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBjb25zdCAqYXJndiwKKwkJICAgICAgIGludCBzY2lfaWR4LCB2b2lkICppbmZvcCk7Cit2b2lkIHNzX3N1YnN5c3RlbV92ZXJzaW9uKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgKmFyZ3YsCisJCQkgIGludCBzY2lfaWR4LCB2b2lkICppbmZvcCk7Cit2b2lkIHNzX3VuaW1wbGVtZW50ZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBjb25zdCAqYXJndiwKKwkJICAgICAgaW50IHNjaV9pZHgsIHZvaWQgKmluZm9wKTsKK3ZvaWQgc3Nfc2V0X3Byb21wdChpbnQgc2NpX2lkeCwgY2hhciAqbmV3X3Byb21wdCk7CitjaGFyICpzc19nZXRfcHJvbXB0KGludCBzY2lfaWR4KTsKK3ZvaWQgc3NfZ2V0X3JlYWRsaW5lKGludCBzY2lfaWR4KTsKKworZXh0ZXJuIHNzX3JlcXVlc3RfdGFibGUgc3Nfc3RkX3JlcXVlc3RzOworI2VuZGlmIC8qIF9zc19oICovCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9zcy5wYy5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3NzLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmODkzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9zcy5wYy5pbgpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogc3MKK0Rlc2NyaXB0aW9uOiBTdWJzeXN0ZW0gY29tbWFuZCBwYXJzaW5nIGxpYnJhcnkKK1ZlcnNpb246IEBFMkZTUFJPR1NfVkVSU0lPTkAKK1JlcXVpcmVzLnByaXZhdGU6IGNvbV9lcnIKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9L3NzCitMaWJzOiAtTCR7bGliZGlyfSAtbHNzCitMaWJzLnByaXZhdGU6IEBETE9QRU5fTElCQApkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3Mvc3NfZXJyLmV0IGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3Mvc3NfZXJyLmV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTlkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9zc19lcnIuZXQKQEAgLTAsMCArMSwzOSBAQAorCWVycm9yX3RhYmxlIHNzCisKK2VjCVNTX0VUX1NVQlNZU1RFTV9BQk9SVEVELAorCSJTdWJzeXN0ZW0gYWJvcnRlZCIKKworZWMJU1NfRVRfVkVSU0lPTl9NSVNNQVRDSCwKKwkiVmVyc2lvbiBtaXNtYXRjaCIKKworZWMJU1NfRVRfTlVMTF9JTlYsCisJIk5vIGN1cnJlbnQgaW52b2NhdGlvbiIKKworZWMJU1NfRVRfTk9fSU5GT19ESVIsCisJIk5vIGluZm8gZGlyZWN0b3J5IgorCitlYwlTU19FVF9DT01NQU5EX05PVF9GT1VORCwKKwkiQ29tbWFuZCBub3QgZm91bmQiCisKK2VjCVNTX0VUX0xJTkVfQUJPUlRFRCwKKwkiQ29tbWFuZCBsaW5lIGFib3J0ZWQiCisKK2VjCVNTX0VUX0VPRiwKKwkiRW5kLW9mLWZpbGUgcmVhY2hlZCIKKworZWMJU1NfRVRfUEVSTUlTU0lPTl9ERU5JRUQsCisJIlBlcm1pc3Npb24gZGVuaWVkIgorCitlYwlTU19FVF9UQUJMRV9OT1RfRk9VTkQsCisJIlJlcXVlc3QgdGFibGUgbm90IGZvdW5kIgorCitlYwlTU19FVF9OT19IRUxQX0ZJTEUsCisJIk5vIGluZm8gYXZhaWxhYmxlIgorCitlYwlTU19FVF9FU0NBUEVfRElTQUJMRUQsCisJIlNoZWxsIGVzY2FwZXMgYXJlIGRpc2FibGVkIgorCitlYwlTU19FVF9VTklNUExFTUVOVEVELAorCSJTb3JyeSwgdGhpcyByZXF1ZXN0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiCisKKwllbmQKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3NzX2ludGVybmFsLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9zc19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDYxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy9zc19pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgTUlUIFN0dWRlbnQgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBCb2FyZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBuYW1lcyBvZiBNLkkuVC4gYW5kIHRoZSBNLkkuVC4gUy5JLlAuQi4gbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBhbmQgdGhlCisgKiBNLkkuVC4gUy5JLlAuQi4gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpZm5kZWYgX3NzX3NzX2ludGVybmFsX2gKKyNkZWZpbmUgX3NzX3NzX2ludGVybmFsX2ggX19GSUxFX18KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIFBST1RPVFlQRShwKSBwCit0eXBlZGVmIHZvaWQgKiBwb2ludGVyOworCisjaW5jbHVkZSAic3MuaCIKKwordHlwZWRlZiBjaGFyIEJPT0w7CisKK3R5cGVkZWYgc3RydWN0IF9zc19hYmJyZXZfZW50cnkgeworICAgIGNoYXIgKm5hbWU7CQkJLyogYWJicmV2IG5hbWUgKi8KKyAgICBjaGFyICoqYWJicmV2OwkJLyogbmV3IHRva2VucyB0byBpbnNlcnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgYmVnaW5uaW5nX29mX2xpbmUgOiAxOworfSBzc19hYmJyZXZfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9zc19hYmJyZXZfbGlzdCB7CisgICAgaW50IG5fYWJicmV2czsKKyAgICBzc19hYmJyZXZfZW50cnkgKmZpcnN0X2FiYnJldjsKK30gc3NfYWJicmV2X2xpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKy8qICAgIGNoYXIgKnBhdGg7ICovCisgICAgc3NfYWJicmV2X2xpc3QgYWJicmV2c1sxMjddOworfSBzc19hYmJyZXZfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX3NzX2RhdGEgewkvKiBpbml0IHZhbHVlcyAqLworICAgIC8qIHRoaXMgc3Vic3lzdGVtICovCisgICAgY29uc3QgY2hhciAqc3Vic3lzdGVtX25hbWU7CisgICAgY29uc3QgY2hhciAqc3Vic3lzdGVtX3ZlcnNpb247CisgICAgLyogY3VycmVudCByZXF1ZXN0IGluZm8gKi8KKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICoqYXJndjsJCS8qIGFyZyBsaXN0ICovCisgICAgY2hhciBjb25zdCAqY3VycmVudF9yZXF1ZXN0OyAvKiBwcmltYXJ5IG5hbWUgKi8KKyAgICAvKiBpbmZvIGRpcmVjdG9yeSBmb3IgJ2hlbHAnICovCisgICAgY2hhciAqKmluZm9fZGlyczsKKyAgICAvKiB0byBiZSBleHRyYWN0ZWQgYnkgc3Vicm91dGluZXMgKi8KKyAgICBwb2ludGVyIGluZm9fcHRyOwkJLyogKHZvaWQgKikgTlVMTCAqLworICAgIC8qIGZvciBzc19saXN0ZW4gcHJvY2Vzc2luZyAqLworICAgIGNoYXIgKnByb21wdDsKKyAgICBzc19yZXF1ZXN0X3RhYmxlICoqcnF0X3RhYmxlczsKKyAgICBzc19hYmJyZXZfaW5mbyAqYWJicmV2X2luZm87CisgICAgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgIGVzY2FwZV9kaXNhYmxlZCA6IDEsCisJCSAgICAgIGFiYnJldnNfZGlzYWJsZWQgOiAxOworICAgIH0gZmxhZ3M7CisgICAgLyoKKyAgICAgKiBEeW5hbWljIHVzYWdlIG9mIHJlYWRsaW5lIGxpYnJhcnkgaWYgcHJlc2VudAorICAgICAqLworICAgIHZvaWQgKnJlYWRsaW5lX2hhbmRsZTsKKyAgICB2b2lkICgqcmVhZGxpbmVfc2h1dGRvd24pKHN0cnVjdCBfc3NfZGF0YSAqaW5mbyk7CisgICAgY2hhciAqKCpyZWFkbGluZSkoY29uc3QgY2hhciAqKTsKKyAgICB2b2lkICgqYWRkX2hpc3RvcnkpKGNvbnN0IGNoYXIgKik7CisgICAgdm9pZCAoKnJlZGlzcGxheSkodm9pZCk7CisgICAgY2hhciAqKigqcmxfY29tcGxldGlvbl9tYXRjaGVzKShjb25zdCBjaGFyICosCisJCQkJICAgIGNoYXIgKigqY29tcGxldGVyKShjb25zdCBjaGFyICosIGludCkpOworICAgIC8qIHRvIGdldCBvdXQgKi8KKyAgICBpbnQgYWJvcnQ7CQkJLyogZXhpdCBzdWJzeXN0ZW0gKi8KKyAgICBpbnQgZXhpdF9zdGF0dXM7Cit9IHNzX2RhdGE7CisKKyNkZWZpbmUgQ1VSUkVOVF9TU19WRVJTSU9OIDEKKworI2RlZmluZQlzc19pbmZvKHNjaV9pZHgpCShfc3NfdGFibGVbc2NpX2lkeF0pCisjZGVmaW5lCXNzX2N1cnJlbnRfcmVxdWVzdChzY2lfaWR4LGNvZGVfcHRyKQlcCisgICAgICgqY29kZV9wdHI9MCxzc19pbmZvKHNjaV9pZHgpLT5jdXJyZW50X3JlcXVlc3QpCit2b2lkIHNzX2FkZF9pbmZvX2RpciAoaW50IHNjaV9pZHgsIGNoYXIgKmluZm9fZGlyLCBpbnQgKmNvZGVfcHRyKTsKK3ZvaWQgc3NfZGVsZXRlX2luZm9fZGlyIChpbnQgc2NpX2lkeCwgY2hhciAqaW5mb19kaXIsIGludCAqY29kZV9wdHIpOworaW50IHNzX2V4ZWN1dGVfbGluZShpbnQgc2NpX2lkeCwgY2hhciAqbGluZV9wdHIpOworY2hhciAqKnNzX3BhcnNlKGludCBzY2lfaWR4LCBjaGFyICpsaW5lX3B0ciwgaW50ICphcmdjX3B0cik7Citzc19hYmJyZXZfaW5mbyAqc3NfYWJicmV2X2luaXRpYWxpemUoY2hhciAqLCBpbnQgKik7Cit2b2lkIHNzX3BhZ2Vfc3RkaW4odm9pZCk7Cit2b2lkIHNzX2xpc3RfcmVxdWVzdHMoaW50LCBjaGFyIGNvbnN0ICogY29uc3QgKiwgaW50LCBwb2ludGVyKTsKK2ludCBzc19leGVjdXRlX2NvbW1hbmQoaW50IHNjaV9pZHgsIGNoYXIgKmFyZ3ZbXSk7CitpbnQgc3NfcGFnZXJfY3JlYXRlKHZvaWQpOworY2hhciAqc3Nfc2FmZV9nZXRlbnYoY29uc3QgY2hhciAqYXJnKTsKK2NoYXIgKipzc19ybF9jb21wbGV0aW9uKGNvbnN0IGNoYXIgKnRleHQsIGludCBzdGFydCwgaW50IGVuZCk7CisKK2V4dGVybiBzc19kYXRhICoqX3NzX3RhYmxlOworZXh0ZXJuIGNoYXIgKnNzX2V0X21zZ3NbXTsKKworI2lmZGVmIFVTRV9TSUdQUk9DTUFTSworLyogZmFrZSBzaWdtYXNrLCBzaWdibG9jaywgc2lnc2V0bWFzayAqLworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2RlZmluZSBzaWdtYXNrKHgpICgxTDw8KHgpLTEpCisjZGVmaW5lIHNpZ3NldG1hc2soeCkgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssJngsTlVMTCkKK3N0YXRpYyBpbnQgX2Zha2Vfc2lnc3RvcmU7CisjZGVmaW5lIHNpZ2Jsb2NrKHgpIChfZmFrZV9zaWdzdG9yZT14LHNpZ3Byb2NtYXNrKFNJR19CTE9DSywmX2Zha2Vfc2lnc3RvcmUsMCkpCisjZW5kaWYKKyNlbmRpZiAvKiBfc3NfaW50ZXJuYWxfaCAqLwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3Mvc3RkX3Jxcy5jdCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3N0ZF9ycXMuY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwMjg4YQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3N0ZF9ycXMuY3QKQEAgLTAsMCArMSw0NiBAQAorCWNvbW1hbmRfdGFibGUJc3Nfc3RkX3JlcXVlc3RzOworCisJcmVxdWVzdAlzc19zZWxmX2lkZW50aWZ5LCAiSWRlbnRpZnkgdGhlIHN1YnN5c3RlbS4iLAorCQkiLiIsCisJCShkb250X2xpc3QsIGRvbnRfc3VtbWFyaXplKTsKKworCXJlcXVlc3QJc3NfaGVscCwgIkRpc3BsYXkgaW5mbyBvbiBjb21tYW5kIG9yIHRvcGljLiIsCisJCWhlbHA7CisKKwl1bmltcGxlbWVudGVkCisJCXNzX2xpc3RfaGVscCwKKwkJIkxpc3QgdG9waWNzIGZvciB3aGljaCBoZWxwIGlzIGF2YWlsYWJsZS4iLAorCQlsaXN0X2hlbHAsIGxoOworCisJcmVxdWVzdAlzc19saXN0X3JlcXVlc3RzLCAiTGlzdCBhdmFpbGFibGUgY29tbWFuZHMuIiwKKwkJbGlzdF9yZXF1ZXN0cywgbHIsICI/IjsKKworCXJlcXVlc3QJc3NfcXVpdCwgIkxlYXZlIHRoZSBzdWJzeXN0ZW0uIiwKKwkJcXVpdCwgcTsKKworCXVuaW1wbGVtZW50ZWQKKwkJc3NfYWJicmV2LAorCQkiRW5hYmxlL2Rpc2FibGUgYWJicmV2aWF0aW9uIHByb2Nlc3Npbmcgb2YgcmVxdWVzdCBsaW5lcy4iLAorCQlhYmJyZXYsIGFiOworCisJdW5pbXBsZW1lbnRlZAorCQlzc19leGVjdXRlLAorCQkiRXhlY3V0ZSBhIFVOSVggY29tbWFuZCBsaW5lLiIsCisJCWV4ZWN1dGUsIGU7CisKKwl1bmltcGxlbWVudGVkCisJCXNzX3N1bW1hcml6ZV9yZXF1ZXN0cywKKwkJIlByb2R1Y2UgYSBsaXN0IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgcmVxdWVzdHMuIiwKKwkJIj8iOworCQkKKwlyZXF1ZXN0CXNzX3N1YnN5c3RlbV9uYW1lLAorCQkiUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgc3Vic3lzdGVtLiIsCisJCXN1YnN5c3RlbV9uYW1lLAorCQkoZG9udF9saXN0KTsKKworCXJlcXVlc3QJc3Nfc3Vic3lzdGVtX3ZlcnNpb24sCisJCSJSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhpcyBzdWJzeXN0ZW0uIiwKKwkJc3Vic3lzdGVtX3ZlcnNpb24sCisJCShkb250X2xpc3QpOworCisJZW5kOwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvdGVzdF9jbWQuY3QgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy90ZXN0X2NtZC5jdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQ5Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvdGVzdF9jbWQuY3QKQEAgLTAsMCArMSw2IEBACitjb21tYW5kX3RhYmxlIHRlc3RfY21kczsKKworcmVxdWVzdCB0ZXN0X2NtZCwgIlRlc3QgY29tbWFuZCIsCisJdGVzdF9jbWQsIHRlc3Q7CisKK2VuZDsKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3Rlc3Rfc2NyaXB0IGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvdGVzdF9zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmN2ZkYwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3Rlc3Rfc2NyaXB0CkBAIC0wLDAgKzEsOCBAQAordGVzdAordGVzdCBmb28gYmFyIHF1dXgKK3Rlc3QgYmFyIHF1dXgKK3F1dXggYmFyCitxdXV4Cit0ZXN0IHF1dXgKK3F1aXQKK3Rlc3QgZm9vIGJhcgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvdGVzdF9zY3JpcHRfZXhwZWN0ZWQgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy90ZXN0X3NjcmlwdF9leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNmODI4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvc3MvdGVzdF9zY3JpcHRfZXhwZWN0ZWQKQEAgLTAsMCArMSwyMiBAQAordGVzdF9zcyAxLjAuICBUeXBlICc/JyBmb3IgYSBsaXN0IG9mIGNvbW1hbmRzLgorCit0ZXN0X2ljb3VudDogdGVzdAorSGVsbG8sIHdvcmxkIQorQXJnczogCit0ZXN0X2ljb3VudDogdGVzdCBmb28gYmFyIHF1dXgKK0hlbGxvLCB3b3JsZCEKK0FyZ3M6ICdmb28nLCAnYmFyJywgJ3F1dXgnCit0ZXN0X2ljb3VudDogdGVzdCBiYXIgcXV1eAorSGVsbG8sIHdvcmxkIQorQXJnczogJ2JhcicsICdxdXV4JwordGVzdF9pY291bnQ6IHF1dXggYmFyCit0ZXN0X3NzOiBDb21tYW5kIG5vdCBmb3VuZCBxdXV4Cit0ZXN0X2ljb3VudDogcXV1eAordGVzdF9zczogQ29tbWFuZCBub3QgZm91bmQgcXV1eAordGVzdF9pY291bnQ6IHRlc3QgcXV1eAorSGVsbG8sIHdvcmxkIQorQXJnczogJ3F1dXgnCit0ZXN0X2ljb3VudDogcXVpdAordGVzdF9pY291bnQ6IHRlc3QgZm9vIGJhcgorSGVsbG8sIHdvcmxkIQorQXJnczogJ2ZvbycsICdiYXInCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy90ZXN0X3NzLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi9zcy90ZXN0X3NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkODRlYQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3NzL3Rlc3Rfc3MuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIHRlc3Rfc3MuYworICoKKyAqIENvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IE1JVCBTdHVkZW50IEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgQm9hcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgbmFtZXMgb2YgTS5JLlQuIGFuZCB0aGUgTS5JLlQuIFMuSS5QLkIuIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gYW5kIHRoZQorICogTS5JLlQuIFMuSS5QLkIuIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfR0VUT1BUX0gKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNzLmgiCisKK2V4dGVybiBzc19yZXF1ZXN0X3RhYmxlIHRlc3RfY21kczsKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCitzdGF0aWMgY2hhciBzdWJzeXN0ZW1fbmFtZVtdID0gInRlc3Rfc3MiOworc3RhdGljIGNoYXIgdmVyc2lvbltdID0gIjEuMCI7CisKK3N0YXRpYyBpbnQgc291cmNlX2ZpbGUoY29uc3QgY2hhciAqY21kX2ZpbGUsIGludCBzY2lfaWR4KQoreworCUZJTEUJCSpmOworCWNoYXIJCWJ1ZlsyNTZdOworCWNoYXIJCSpjcDsKKwlpbnQJCWV4aXRfc3RhdHVzID0gMDsKKwlpbnQJCXJldHZhbDsKKwlpbnQgCQlub2VjaG87CisKKwlpZiAoc3RyY21wKGNtZF9maWxlLCAiLSIpID09IDApCisJCWYgPSBzdGRpbjsKKwllbHNlIHsKKwkJZiA9IGZvcGVuKGNtZF9maWxlLCAiciIpOworCQlpZiAoIWYpIHsKKwkJCXBlcnJvcihjbWRfZmlsZSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCWZmbHVzaChzdGRvdXQpOworCWZmbHVzaChzdGRlcnIpOworCXNldGJ1ZihzdGRvdXQsIE5VTEwpOworCXNldGJ1ZihzdGRlcnIsIE5VTEwpOworCXdoaWxlICghZmVvZihmKSkgeworCQlpZiAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoYnVmWzBdID09ICcjJykKKwkJCWNvbnRpbnVlOworCQlub2VjaG8gPSAwOworCQlpZiAoYnVmWzBdID09ICctJykgeworCQkJbm9lY2hvID0gMTsKKwkJCWJ1ZlswXSA9ICcgJzsKKwkJfQorCQljcCA9IHN0cmNocihidWYsICdcbicpOworCQlpZiAoY3ApCisJCQkqY3AgPSAwOworCQljcCA9IHN0cmNocihidWYsICdccicpOworCQlpZiAoY3ApCisJCQkqY3AgPSAwOworCQlpZiAoIW5vZWNobykKKwkJCXByaW50ZigidGVzdF9pY291bnQ6ICVzXG4iLCBidWYpOworCQlyZXR2YWwgPSBzc19leGVjdXRlX2xpbmUoc2NpX2lkeCwgYnVmKTsKKwkJaWYgKHJldHZhbCkgeworCQkJc3NfcGVycm9yKHNjaV9pZHgsIHJldHZhbCwgYnVmKTsKKwkJCWV4aXRfc3RhdHVzKys7CisJCX0KKwl9CisJcmV0dXJuIGV4aXRfc3RhdHVzOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGMsIGNvZGU7CisJY2hhciAqcmVxdWVzdCA9IChjaGFyICopTlVMTDsKKwljaGFyCQkqY21kX2ZpbGUgPSAwOworCWludCBzY2lfaWR4OworCWludCBleGl0X3N0YXR1cyA9IDA7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJ3UjpmOiIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1InOgorCQkJcmVxdWVzdCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWNtZF9maWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb21fZXJyKGFyZ3ZbMF0sIDAsICJVc2FnZTogdGVzdF9zcyBbLVIgcmVxdWVzdF0gIgorCQkJCSJbLWYgY21kX2ZpbGVdIik7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJc2NpX2lkeCA9IHNzX2NyZWF0ZV9pbnZvY2F0aW9uKHN1YnN5c3RlbV9uYW1lLCB2ZXJzaW9uLAorCQkJCSAgICAgICAoY2hhciAqKU5VTEwsICZ0ZXN0X2NtZHMsICZjb2RlKTsKKwlpZiAoY29kZSkgeworCQlzc19wZXJyb3Ioc2NpX2lkeCwgY29kZSwgImNyZWF0aW5nIGludm9jYXRpb24iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkodm9pZCkgc3NfYWRkX3JlcXVlc3RfdGFibGUgKHNjaV9pZHgsICZzc19zdGRfcmVxdWVzdHMsIDEsICZjb2RlKTsKKwlpZiAoY29kZSkgeworCQlzc19wZXJyb3IgKHNjaV9pZHgsIGNvZGUsICJhZGRpbmcgc3RhbmRhcmQgcmVxdWVzdHMiKTsKKwkJZXhpdCAoMSk7CisJfQorCisJcHJpbnRmKCJ0ZXN0X3NzICVzLiAgVHlwZSAnPycgZm9yIGEgbGlzdCBvZiBjb21tYW5kcy5cblxuIiwKKwkgICAgICAgdmVyc2lvbik7CisKKwlpZiAocmVxdWVzdCkgeworCQljb2RlID0gc3NfZXhlY3V0ZV9saW5lKHNjaV9pZHgsIHJlcXVlc3QpOworCQlpZiAoY29kZSkgeworCQkJc3NfcGVycm9yKHNjaV9pZHgsIGNvZGUsIHJlcXVlc3QpOworCQkJZXhpdF9zdGF0dXMrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kX2ZpbGUpIHsKKwkJZXhpdF9zdGF0dXMgPSBzb3VyY2VfZmlsZShjbWRfZmlsZSwgc2NpX2lkeCk7CisJfSBlbHNlIHsKKwkJc3NfbGlzdGVuKHNjaV9pZHgpOworCX0KKworCWV4aXQoZXhpdF9zdGF0dXMpOworfQorCisKK3ZvaWQgdGVzdF9jbWQgKGFyZ2MsIGFyZ3YpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7Cit7CisgICAgcHJpbnRmKCJIZWxsbywgd29ybGQhXG4iKTsKKyAgICBwcmludGYoIkFyZ3M6ICIpOworICAgIHdoaWxlICgrK2FyZ3YsIC0tYXJnYykgeworCXByaW50ZigiJyVzJyIsICphcmd2KTsKKwlpZiAoYXJnYyA+IDEpCisJICAgIGZwdXRzKCIsICIsIHN0ZG91dCk7CisgICAgfQorICAgIHB1dGNoYXIgKCdcbicpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9DT1BZSU5HIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTcwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL0NPUFlJTkcKQEAgLTAsMCArMSwyNSBAQAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgICB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQUxMIE9GCitXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCitMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCitCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCitVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFLgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9NYWtlZmlsZS5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxYjhkYwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyMDQgQEAKKyMgTWFrZWZpbGUgZm9yIHRoZSBVVUlEIGxpYnJhcnkKKyMKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3RvcF9idWlsZGRpciA9IC4uLy4uCitteV9kaXIgPSBsaWIvdXVpZAorSU5TVEFMTCA9IEBJTlNUQUxMQAorCitATUNPTkZJR0AKKworYWxsOjogCisKK1NNQU5QQUdFUz0JdXVpZC4zIHV1aWRfY2xlYXIuMyB1dWlkX2NvbXBhcmUuMyB1dWlkX2NvcHkuMyBcCisJCXV1aWRfZ2VuZXJhdGUuMyB1dWlkX2lzX251bGwuMyB1dWlkX3BhcnNlLjMgXAorCQl1dWlkX3RpbWUuMyB1dWlkX3VucGFyc2UuMworCitPQkpTPQkJY2xlYXIubyBcCisJCWNvbXBhcmUubyBcCisJCWNvcHkubyBcCisJCWdlbl91dWlkLm8gXAorCQlpc251bGwubyBcCisJCXBhY2subyBcCisJCXBhcnNlLm8gXAorCQl1bnBhY2subyBcCisJCXVucGFyc2UubyBcCisJCXV1aWRfdGltZS5vCisKK1NSQ1M9CQkkKHNyY2RpcikvY2xlYXIuYyBcCisJCSQoc3JjZGlyKS9jb21wYXJlLmMgXAorCQkkKHNyY2RpcikvY29weS5jIFwKKwkJJChzcmNkaXIpL2dlbl91dWlkLmMgXAorCQkkKHNyY2RpcikvaXNudWxsLmMgXAorCQkkKHNyY2RpcikvcGFjay5jIFwKKwkJJChzcmNkaXIpL3BhcnNlLmMgXAorCQkkKHNyY2RpcikvdW5wYWNrLmMgXAorCQkkKHNyY2RpcikvdW5wYXJzZS5jIFwKKwkJJChzcmNkaXIpL3V1aWRfdGltZS5jCisKK0xJQlJBUlk9IGxpYnV1aWQKK0xJQkRJUj0gdXVpZAorCitFTEZfVkVSU0lPTiA9IDEuMgorRUxGX1NPX1ZFUlNJT04gPSAxCitFTEZfSU1BR0UgPSBsaWJ1dWlkCitFTEZfTVlESVIgPSB1dWlkCitFTEZfSU5TVEFMTF9ESVIgPSAkKHJvb3RfbGliZGlyKQorRUxGX09USEVSX0xJQlMgPSAKKworQlNETElCX1ZFUlNJT04gPSAxLjEKK0JTRExJQl9JTUFHRSA9IGxpYnV1aWQKK0JTRExJQl9NWURJUiA9IHV1aWQKK0JTRExJQl9JTlNUQUxMX0RJUiA9ICQocm9vdF9saWJkaXIpCisKK0BNQUtFRklMRV9MSUJSQVJZQAorQE1BS0VGSUxFX0VMRkAKK0BNQUtFRklMRV9CU0RMSUJACitATUFLRUZJTEVfUFJPRklMRUAKK0BNQUtFRklMRV9DSEVDS0VSQAorCisuYy5vOgorCSQoRSkgIglDQyAkPCIKKwkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgLWMgJDwgLW8gJEAKK0BQUk9GSUxFX0NNVEAJJChRKSAkKENDKSAkKEFMTF9DRkxBR1MpIC1nIC1wZyAtbyBwcm9maWxlZC8kKi5vIC1jICQ8CitAQ0hFQ0tFUl9DTVRACSQoUSkgJChDQykgJChBTExfQ0ZMQUdTKSAtY2hlY2tlciAtZyAtbyBjaGVja2VyLyQqLm8gLWMgJDwKK0BFTEZfQ01UQAkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgLWZQSUMgLW8gZWxmc2hhcmVkLyQqLm8gLWMgJDwKK0BCU0RMSUJfQ01UQAkkKFEpICQoQ0MpICQoQUxMX0NGTEFHUykgJChCU0RMSUJfUElDX0ZMQUcpIC1vIHBpYy8kKi5vIC1jICQ8CisKK2FsbDo6IHRzdF91dWlkIHV1aWRfdGltZSAkKFNNQU5QQUdFUykgdXVpZC5wYworCit1dWlkLmg6ICQoc3JjZGlyKS91dWlkLmguaW4KKwkkKEUpICIJQ1AgJEAiCisJJChRKSBjcCAkKHNyY2RpcikvdXVpZC5oLmluIHV1aWQuaAorCiskKHRvcF9idWlsZGRpcikvbGliL3V1aWQvdXVpZF90eXBlcy5oOiAkKHNyY2RpcikvdXVpZF90eXBlcy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpOyBDT05GSUdfRklMRVM9JChteV9kaXIpL3V1aWRfdHlwZXMuaCAuL2NvbmZpZy5zdGF0dXMKKwordHN0X3V1aWQubzogJChzcmNkaXIpL3RzdF91dWlkLmMKKwkkKEUpICIJQ0MgJEAiCisJJChRKSAkKENDKSAkKEFMTF9DRkxBR1MpIC1jICQoc3JjZGlyKS90c3RfdXVpZC5jIC1vIHRzdF91dWlkLm8KKwordHN0X3V1aWQ6IHRzdF91dWlkLm8gJChERVBTVEFUSUNfTElCVVVJRCkKKwkkKEUpICIJTEQgJEAiCisJJChRKSAkKENDKSAkKEFMTF9MREZMQUdTKSAtbyB0c3RfdXVpZCB0c3RfdXVpZC5vICQoU1RBVElDX0xJQlVVSUQpCisKK3V1aWRfdGltZTogJChzcmNkaXIpL3V1aWRfdGltZS5jICQoREVQTElCVVVJRCkKKwkkKEUpICIJTEQgJEAiCisJJChRKSAkKENDKSAkKEFMTF9DRkxBR1MpIC1EREVCVUcgLW8gdXVpZF90aW1lICQoc3JjZGlyKS91dWlkX3RpbWUuYyBcCisJCSQoTElCVVVJRCkKKwordXVpZC4zOiAkKERFUF9TVUJTVElUVVRFKSAkKHNyY2RpcikvdXVpZC4zLmluCisJJChFKSAiCVNVQlNUICRAIgorCSQoUSkgJChTVUJTVElUVVRFX1VQVElNRSkgJChzcmNkaXIpL3V1aWQuMy5pbiB1dWlkLjMKKwordXVpZF9jbGVhci4zOiAkKERFUF9TVUJTVElUVVRFKSAkKHNyY2RpcikvdXVpZF9jbGVhci4zLmluCisJJChFKSAiCVNVQlNUICRAIgorCSQoUSkgJChTVUJTVElUVVRFX1VQVElNRSkgJChzcmNkaXIpL3V1aWRfY2xlYXIuMy5pbiB1dWlkX2NsZWFyLjMKKwordXVpZF9jb21wYXJlLjM6ICQoREVQX1NVQlNUSVRVVEUpICQoc3JjZGlyKS91dWlkX2NvbXBhcmUuMy5pbgorCSQoRSkgIglTVUJTVCAkQCIKKwkkKFEpICQoU1VCU1RJVFVURV9VUFRJTUUpICQoc3JjZGlyKS91dWlkX2NvbXBhcmUuMy5pbiB1dWlkX2NvbXBhcmUuMworCit1dWlkX2NvcHkuMzogJChERVBfU1VCU1RJVFVURSkgJChzcmNkaXIpL3V1aWRfY29weS4zLmluCisJJChFKSAiCVNVQlNUICRAIgorCSQoUSkgJChTVUJTVElUVVRFX1VQVElNRSkgJChzcmNkaXIpL3V1aWRfY29weS4zLmluIHV1aWRfY29weS4zCisKK3V1aWRfZ2VuZXJhdGUuMzogJChERVBfU1VCU1RJVFVURSkgJChzcmNkaXIpL3V1aWRfZ2VuZXJhdGUuMy5pbgorCSQoRSkgIglTVUJTVCAkQCIKKwkkKFEpICQoU1VCU1RJVFVURV9VUFRJTUUpICQoc3JjZGlyKS91dWlkX2dlbmVyYXRlLjMuaW4gdXVpZF9nZW5lcmF0ZS4zCisKK3V1aWRfaXNfbnVsbC4zOiAkKERFUF9TVUJTVElUVVRFKSAkKHNyY2RpcikvdXVpZF9pc19udWxsLjMuaW4KKwkkKEUpICIJU1VCU1QgJEAiCisJJChRKSAkKFNVQlNUSVRVVEVfVVBUSU1FKSAkKHNyY2RpcikvdXVpZF9pc19udWxsLjMuaW4gdXVpZF9pc19udWxsLjMKKwordXVpZF9wYXJzZS4zOiAkKERFUF9TVUJTVElUVVRFKSAkKHNyY2RpcikvdXVpZF9wYXJzZS4zLmluCisJJChFKSAiCVNVQlNUICRAIgorCSQoUSkgJChTVUJTVElUVVRFX1VQVElNRSkgJChzcmNkaXIpL3V1aWRfcGFyc2UuMy5pbiB1dWlkX3BhcnNlLjMKKwordXVpZF90aW1lLjM6ICQoREVQX1NVQlNUSVRVVEUpICQoc3JjZGlyKS91dWlkX3RpbWUuMy5pbgorCSQoRSkgIglTVUJTVCAkQCIKKwkkKFEpICQoU1VCU1RJVFVURV9VUFRJTUUpICQoc3JjZGlyKS91dWlkX3RpbWUuMy5pbiB1dWlkX3RpbWUuMworCit1dWlkX3VucGFyc2UuMzogJChERVBfU1VCU1RJVFVURSkgJChzcmNkaXIpL3V1aWRfdW5wYXJzZS4zLmluCisJJChFKSAiCVNVQlNUICRAIgorCSQoUSkgJChTVUJTVElUVVRFX1VQVElNRSkgJChzcmNkaXIpL3V1aWRfdW5wYXJzZS4zLmluIHV1aWRfdW5wYXJzZS4zCisKK3V1aWQucGM6ICQoc3JjZGlyKS91dWlkLnBjLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJJChFKSAiCUNPTkZJRy5TVEFUVVMgJEAiCisJJChRKSBjZCAkKHRvcF9idWlsZGRpcik7IENPTkZJR19GSUxFUz1saWIvdXVpZC91dWlkLnBjIC4vY29uZmlnLnN0YXR1cworCitpbnN0YWxsZGlyczo6CisJJChFKSAiCU1LSU5TVEFMTERJUlMgJChsaWJkaXIpICQoaW5jbHVkZWRpcikvdXVpZCAkKG1hbjNkaXIpIgorCSQoUSkgJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChsaWJkaXIpICBcCisJCSQoREVTVERJUikkKGluY2x1ZGVkaXIpL3V1aWQgJChERVNURElSKSQobWFuM2RpcikgXAorCQkkKERFU1RESVIpJChsaWJkaXIpL3BrZ2NvbmZpZworCitpbnN0YWxsOjogYWxsIGluc3RhbGxkaXJzIAorCSQoRSkgIglJTlNUQUxMX0RBVEEgJChsaWJkaXIpL2xpYnV1aWQuYSIKKwkkKFEpICQoSU5TVEFMTF9EQVRBKSBsaWJ1dWlkLmEgJChERVNURElSKSQobGliZGlyKS9saWJ1dWlkLmEKKwktJChRKSAkKFJBTkxJQikgJChERVNURElSKSQobGliZGlyKS9saWJ1dWlkLmEKKwkkKFEpICQoQ0hNT0QpICQoTElCTU9ERSkgJChERVNURElSKSQobGliZGlyKS9saWJ1dWlkLmEKKwkkKEUpICIJSU5TVEFMTF9EQVRBICQoaW5jbHVkZWRpcikvdXVpZC91dWlkLmgiCisJJChRKSAkKElOU1RBTExfREFUQSkgdXVpZC5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3V1aWQvdXVpZC5oCisJJChRKSBmb3IgaSBpbiAkKFNNQU5QQUdFUyk7IGRvIFwKKwkJJChSTSkgLWYgJChERVNURElSKSQobWFuM2RpcikvJCRpLmd6OyBcCisJCWVjaG8gIglJTlNUQUxMX0RBVEEgJChtYW4zZGlyKS8kJGkiOyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQobWFuM2RpcikvJCRpOyBcCisJZG9uZQorCSQoUSkgJChSTSkgLWYgJChERVNURElSKSQobWFuM2RpcikvdXVpZF9nZW5lcmF0ZV9yYW5kb20uMy5neiBcCisJCSQoREVTVERJUikkKG1hbjNkaXIpL3V1aWRfZ2VuZXJhdGVfdGltZS4zLmd6CisJJChFKSAiCUxJTksgJChtYW4zZGlyKS91dWlkX2dlbmVyYXRlX3JhbmRvbS4zIgorCSQoUSkgKGNkICQoREVTVERJUikkKG1hbjNkaXIpOyBcCisJICAgICQoTE4pICQoTElOS19JTlNUQUxMX0ZMQUdTKSB1dWlkX2dlbmVyYXRlLjMgdXVpZF9nZW5lcmF0ZV9yYW5kb20uMykKKwkkKEUpICIJTElOSyAkKG1hbjNkaXIpL3V1aWRfZ2VuZXJhdGVfdGltZS4zIgorCSQoUSkgKGNkICQoREVTVERJUikkKG1hbjNkaXIpOyBcCisJICAgICQoTE4pICQoTElOS19JTlNUQUxMX0ZMQUdTKSB1dWlkX2dlbmVyYXRlLjMgdXVpZF9nZW5lcmF0ZV90aW1lLjMpCisJJChFKSAiCUlOU1RBTExfREFUQSAkKGxpYmRpcikvcGtnY29uZmlnL3V1aWQucGMiCisJJChRKSAkKElOU1RBTExfREFUQSkgdXVpZC5wYyAkKERFU1RESVIpJChsaWJkaXIpL3BrZ2NvbmZpZy91dWlkLnBjCisKK3VuaW5zdGFsbDo6CisJJChSTSkgLWYgJChERVNURElSKSQobGliZGlyKS9saWJ1dWlkLmEgXAorCQkkKERFU1RESVIpJChsaWJkaXIpL3BrZ2NvbmZpZy91dWlkLnBjCisJZm9yIGkgaW4gJChTTUFOUEFHRVMpOyBkbyBcCisJCSQoUk0pIC1mICQoREVTVERJUikkKG1hbjNkaXIpLyQkaTsgXAorCWRvbmUKKwkkKFJNKSAtZiAkKERFU1RESVIpJChtYW4zZGlyKS91dWlkX2dlbmVyYXRlX3JhbmRvbS4zICQoREVTVERJUikkKG1hbjNkaXIpL3V1aWRfZ2VuZXJhdGVfdGltZS4zCisKK2NsZWFuOjoKKwkkKFJNKSAtZiBcIyogKi5zICoubyAqLmEgKn4gKi5iYWsgY29yZSBwcm9maWxlZC8qIGNoZWNrZXIvKiB1dWlkLmgKKwkkKFJNKSAtZiAuLi9saWJ1dWlkLmEgLi4vbGlidXVpZF9wLmEgdHN0X3V1aWQgdXVpZF90aW1lICQoU01BTlBBR0VTKQorCitjaGVjazo6IHRzdF91dWlkCisJTERfTElCUkFSWV9QQVRIPSQoTElCKSBEWUxEX0xJQlJBUllfUEFUSD0kKExJQikgLi90c3RfdXVpZAorCittb3N0bHljbGVhbjo6IGNsZWFuCitkaXN0Y2xlYW46OiBjbGVhbgorCSQoUk0pIC1mIC5kZXBlbmQgTWFrZWZpbGUgdXVpZC5wYyBcCisJCSQoc3JjZGlyKS9UQUdTICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5vbGQKKworIworIyBIYWNrIHRvIHBhcmFsbGVsIG1ha2VzIHJlY29nbml6ZSBkZXBlbmRlbmNpZXMgY29ycmVjdGx5LgorIworLi4vLi4vbGliL2xpYnV1aWQuYTogbGlidXVpZC5hCisuLi8uLi9saWIvbGlidXVpZC5zbzogaW1hZ2UKKy4uLy4uL2xpYi9saWJ1dWlkLmR5bGliOiBpbWFnZQorCiskKE9CSlMpOiBzdWJkaXJzIHV1aWQuaAorCisjICsrKyBEZXBlbmRlbmN5IGxpbmUgZWF0ZXIgKysrCisjIAorIyBNYWtlZmlsZSBkZXBlbmRlbmNpZXMgZm9sbG93LiAgVGhpcyBtdXN0IGJlIHRoZSBsYXN0IHNlY3Rpb24gaW4KKyMgdGhlIE1ha2VmaWxlLmluIGZpbGUKKyMKK2NsZWFyLm86ICQoc3JjZGlyKS9jbGVhci5jICQoc3JjZGlyKS91dWlkUC5oCitjb21wYXJlLm86ICQoc3JjZGlyKS9jb21wYXJlLmMgJChzcmNkaXIpL3V1aWRQLmgKK2NvcHkubzogJChzcmNkaXIpL2NvcHkuYyAkKHNyY2RpcikvdXVpZFAuaAorZ2VuX3V1aWQubzogJChzcmNkaXIpL2dlbl91dWlkLmMgJChzcmNkaXIpL3V1aWRQLmggJChzcmNkaXIpL3V1aWRkLmgKK2lzbnVsbC5vOiAkKHNyY2RpcikvaXNudWxsLmMgJChzcmNkaXIpL3V1aWRQLmgKK3BhY2subzogJChzcmNkaXIpL3BhY2suYyAkKHNyY2RpcikvdXVpZFAuaAorcGFyc2UubzogJChzcmNkaXIpL3BhcnNlLmMgJChzcmNkaXIpL3V1aWRQLmgKK3VucGFjay5vOiAkKHNyY2RpcikvdW5wYWNrLmMgJChzcmNkaXIpL3V1aWRQLmgKK3VucGFyc2UubzogJChzcmNkaXIpL3VucGFyc2UuYyAkKHNyY2RpcikvdXVpZFAuaAordXVpZF90aW1lLm86ICQoc3JjZGlyKS91dWlkX3RpbWUuYyAkKHNyY2RpcikvdXVpZFAuaApkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9jbGVhci5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9jbGVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTFmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL2NsZWFyLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIGNsZWFyLmMgLS0gQ2xlYXIgYSBVVUlECisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQUxMIE9GCisgKiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgInN0cmluZy5oIgorCisjaW5jbHVkZSAidXVpZFAuaCIKKwordm9pZCB1dWlkX2NsZWFyKHV1aWRfdCB1dSkKK3sKKwltZW1zZXQodXUsIDAsIDE2KTsKK30KKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9jb21wYXJlLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL2NvbXBhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjhhNzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9jb21wYXJlLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGNvbXBhcmUuYyAtLS0gY29tcGFyZSB3aGV0aGVyIG9yIG5vdCB0d28gVVVJRCdzIGFyZSB0aGUgc2FtZQorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgdHdvIFVVSUQncyBhcmUgZGlmZmVyZW50LCBhbmQgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSAidXVpZFAuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBVVUNNUCh1MSx1MikgaWYgKHUxICE9IHUyKSByZXR1cm4oKHUxIDwgdTIpID8gLTEgOiAxKTsKKworaW50IHV1aWRfY29tcGFyZShjb25zdCB1dWlkX3QgdXUxLCBjb25zdCB1dWlkX3QgdXUyKQoreworCXN0cnVjdCB1dWlkCXV1aWQxLCB1dWlkMjsKKworCXV1aWRfdW5wYWNrKHV1MSwgJnV1aWQxKTsKKwl1dWlkX3VucGFjayh1dTIsICZ1dWlkMik7CisKKwlVVUNNUCh1dWlkMS50aW1lX2xvdywgdXVpZDIudGltZV9sb3cpOworCVVVQ01QKHV1aWQxLnRpbWVfbWlkLCB1dWlkMi50aW1lX21pZCk7CisJVVVDTVAodXVpZDEudGltZV9oaV9hbmRfdmVyc2lvbiwgdXVpZDIudGltZV9oaV9hbmRfdmVyc2lvbik7CisJVVVDTVAodXVpZDEuY2xvY2tfc2VxLCB1dWlkMi5jbG9ja19zZXEpOworCXJldHVybiBtZW1jbXAodXVpZDEubm9kZSwgdXVpZDIubm9kZSwgNik7Cit9CisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvY29uZmlndXJlLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5NTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTAgQEAKK2RubAorZG5sICBOb3QgdXNlZCBub3csIGZvciB0aGUgZnV0dXJlIHdoZW4gdXVpZCBpcyBzZXBhcmF0ZWQgb3V0IGludG8gaXRzIAorZG5sIG93biBwYWNrYWdlLgorZG5sCitBQ19JTklUKGdlbl91dWlkLmMpCitBQ19QUkVSRVEoMi4xMikKKworQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCB1bmlzdGQuaCBzeXMvc29ja2lvLmggbmV0L2lmLmggbmV0aW5ldC9pbi5oKQorQUNfQ0hFQ0tfRlVOQ1Moc3JhbmRvbSkKK0FDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvY29weS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9jb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMzNhYQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvY29weS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBjb3B5LmMgLS0tIGNvcHkgVVVJRHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSAidXVpZFAuaCIKKwordm9pZCB1dWlkX2NvcHkodXVpZF90IGRzdCwgY29uc3QgdXVpZF90IHNyYykKK3sKKwl1bnNpZ25lZCBjaGFyCQkqY3AxOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJKmNwMjsKKwlpbnQJCQlpOworCisJZm9yIChpPTAsIGNwMSA9IGRzdCwgY3AyID0gc3JjOyBpIDwgMTY7IGkrKykKKwkJKmNwMSsrID0gKmNwMisrOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9nZW5fdXVpZC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9nZW5fdXVpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGNhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL2dlbl91dWlkLmMKQEAgLTAsMCArMSw2NjggQEAKKy8qCisgKiBnZW5fdXVpZC5jIC0tLSBnZW5lcmF0ZSBhIERDRS1jb21wYXRpYmxlIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisvKgorICogRm9yY2UgaW5jbHVzaW9uIG9mIFNWSUQgc3R1ZmYgc2luY2Ugd2UgbmVlZCBpdCBpZiB3ZSdyZSBjb21waWxpbmcgaW4KKyAqIGdjYy13YWxsIHdhbGwgbW9kZQorICovCisjZGVmaW5lIF9TVklEX1NPVVJDRQorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIFVVSUQgTVlVVUlECisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEhBVkVfU1lTX0ZJTEVfSAorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tJT19ICisjaW5jbHVkZSA8c3lzL3NvY2tpby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRfSUZfSAorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVF9JRl9ETF9ICisjaW5jbHVkZSA8bmV0L2lmX2RsLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChIQVZFX1NZU19TWVNDQUxMX0gpCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidXVpZFAuaCIKKyNpbmNsdWRlICJ1dWlkZC5oIgorCisjaWZkZWYgSEFWRV9TUkFORE9NCisjZGVmaW5lIHNyYW5kKHgpIAlzcmFuZG9tKHgpCisjZGVmaW5lIHJhbmQoKSAJCXJhbmRvbSgpCisjZW5kaWYKKworI2lmZGVmIFRMUworI2RlZmluZSBUSFJFQURfTE9DQUwgc3RhdGljIFRMUworI2Vsc2UKKyNkZWZpbmUgVEhSRUFEX0xPQ0FMIHN0YXRpYworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfX05SX2dldHRpZCkgJiYgZGVmaW5lZChIQVZFX0pSQU5ENDgpCisjZGVmaW5lIERPX0pSQU5EX01JWAorVEhSRUFEX0xPQ0FMIHVuc2lnbmVkIHNob3J0IGpyYW5kX3NlZWRbM107CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorc3RhdGljIHZvaWQgZ2V0dGltZW9mZGF5IChzdHJ1Y3QgdGltZXZhbCAqdHYsIHZvaWQgKmR1bW15KQoreworCUZJTEVUSU1FCWZ0aW1lOworCXVpbnQ2NF90CW47CisKKwlHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSAoJmZ0aW1lKTsKKwluID0gKCgodWludDY0X3QpIGZ0aW1lLmR3SGlnaERhdGVUaW1lIDw8IDMyKQorCSAgICAgKyAodWludDY0X3QpIGZ0aW1lLmR3TG93RGF0ZVRpbWUpOworCWlmIChuKSB7CisJCW4gLz0gMTA7CisJCW4gLT0gKCgzNjkgKiAzNjUgKyA4OSkgKiAodWludDY0X3QpIDg2NDAwKSAqIDEwMDAwMDA7CisJfQorCisJdHYtPnR2X3NlYyA9IG4gLyAxMDAwMDAwOworCXR2LT50dl91c2VjID0gbiAlIDEwMDAwMDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0dWlkICh2b2lkKQoreworCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X3JhbmRvbV9mZCh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsCXR2OworCXN0YXRpYyBpbnQJZmQgPSAtMjsKKwlpbnQJCWk7CisKKwlpZiAoZmQgPT0gLTIpIHsKKwkJZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisjaWZuZGVmIF9XSU4zMgorCQlmZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKwkJaWYgKGZkID09IC0xKQorCQkJZmQgPSBvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZIHwgT19OT05CTE9DSyk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlpID0gZmNudGwoZmQsIEZfR0VURkQpOworCQkJaWYgKGkgPj0gMCkKKwkJCQlmY250bChmZCwgRl9TRVRGRCwgaSB8IEZEX0NMT0VYRUMpOworCQl9CisjZW5kaWYKKwkJc3JhbmQoKGdldHBpZCgpIDw8IDE2KSBeIGdldHVpZCgpIF4gdHYudHZfc2VjIF4gdHYudHZfdXNlYyk7CisjaWZkZWYgRE9fSlJBTkRfTUlYCisJCWpyYW5kX3NlZWRbMF0gPSBnZXRwaWQoKSBeICh0di50dl9zZWMgJiAweEZGRkYpOworCQlqcmFuZF9zZWVkWzFdID0gZ2V0cHBpZCgpIF4gKHR2LnR2X3VzZWMgJiAweEZGRkYpOworCQlqcmFuZF9zZWVkWzJdID0gKHR2LnR2X3NlYyBeIHR2LnR2X3VzZWMpID4+IDE2OworI2VuZGlmCisJfQorCS8qIENyYW5rIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBhIGZldyB0aW1lcyAqLworCWdldHRpbWVvZmRheSgmdHYsIDApOworCWZvciAoaSA9ICh0di50dl9zZWMgXiB0di50dl91c2VjKSAmIDB4MUY7IGkgPiAwOyBpLS0pCisJCXJhbmQoKTsKKwlyZXR1cm4gZmQ7Cit9CisKKworLyoKKyAqIEdlbmVyYXRlIGEgc2VyaWVzIG9mIHJhbmRvbSBieXRlcy4gIFVzZSAvZGV2L3VyYW5kb20gaWYgcG9zc2libGUsCisgKiBhbmQgaWYgbm90LCB1c2Ugc3JhbmRvbS9yYW5kb20uCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yYW5kb21fYnl0ZXModm9pZCAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWludCBpLCBuID0gbmJ5dGVzLCBmZCA9IGdldF9yYW5kb21fZmQoKTsKKwlpbnQgbG9zZV9jb3VudGVyID0gMDsKKwl1bnNpZ25lZCBjaGFyICpjcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKwl1bnNpZ25lZCBzaG9ydCB0bXBfc2VlZFszXTsKKworCWlmIChmZCA+PSAwKSB7CisJCXdoaWxlIChuID4gMCkgeworCQkJaSA9IHJlYWQoZmQsIGNwLCBuKTsKKwkJCWlmIChpIDw9IDApIHsKKwkJCQlpZiAobG9zZV9jb3VudGVyKysgPiAxNikKKwkJCQkJYnJlYWs7CisJCQkJY29udGludWU7CisJCQl9CisJCQluIC09IGk7CisJCQljcCArPSBpOworCQkJbG9zZV9jb3VudGVyID0gMDsKKwkJfQorCX0KKworCS8qCisJICogV2UgZG8gdGhpcyBhbGwgdGhlIHRpbWUsIGJ1dCB0aGlzIGlzIHRoZSBvbmx5IHNvdXJjZSBvZgorCSAqIHJhbmRvbW5lc3MgaWYgL2Rldi9yYW5kb20vdXJhbmRvbSBpcyBvdXQgdG8gbHVuY2guCisJICovCisJZm9yIChjcCA9IGJ1ZiwgaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykKKwkJKmNwKysgXj0gKHJhbmQoKSA+PiA3KSAmIDB4RkY7CisjaWZkZWYgRE9fSlJBTkRfTUlYCisJbWVtY3B5KHRtcF9zZWVkLCBqcmFuZF9zZWVkLCBzaXplb2YodG1wX3NlZWQpKTsKKwlqcmFuZF9zZWVkWzJdID0ganJhbmRfc2VlZFsyXSBeIHN5c2NhbGwoX19OUl9nZXR0aWQpOworCWZvciAoY3AgPSBidWYsIGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisJCSpjcCsrIF49IChqcmFuZDQ4KHRtcF9zZWVkKSA+PiA3KSAmIDB4RkY7CisJbWVtY3B5KGpyYW5kX3NlZWQsIHRtcF9zZWVkLAorCSAgICAgICBzaXplb2YoanJhbmRfc2VlZCktc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisjZW5kaWYKKworCXJldHVybjsKK30KKworLyoKKyAqIEdldCB0aGUgZXRoZXJuZXQgaGFyZHdhcmUgYWRkcmVzcywgaWYgd2UgY2FuIGZpbmQgaXQuLi4KKyAqCisgKiBYWFggZm9yIGEgd2luZG93cyB2ZXJzaW9uLCBwcm9iYWJseSBzaG91bGQgdXNlIEdldEFkYXB0ZXJzSW5mbzoKKyAqIGh0dHA6Ly93d3cuY29kZWd1cnUuY29tL2NwcC9pLW4vbmV0d29yay9uZXR3b3JraW5mb3JtYXRpb24vYXJ0aWNsZS5waHAvYzU0NTEKKyAqIGNvbW1lbnRpbmcgb3V0IGdldF9ub2RlX2lkIGp1c3QgdG8gZ2V0IGdlbl91dWlkIHRvIGNvbXBpbGUgdW5kZXIgd2luZG93cworICogaXMgbm90IHRoZSByaWdodCB3YXkgdG8gZ28hCisgKi8KK3N0YXRpYyBpbnQgZ2V0X25vZGVfaWQodW5zaWduZWQgY2hhciAqbm9kZV9pZCkKK3sKKyNpZmRlZiBIQVZFX05FVF9JRl9ICisJaW50IAkJc2Q7CisJc3RydWN0IGlmcmVxIAlpZnIsICppZnJwOworCXN0cnVjdCBpZmNvbmYgCWlmYzsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQJCW4sIGk7CisJdW5zaWduZWQgY2hhciAJKmE7CisjaWZkZWYgSEFWRV9ORVRfSUZfRExfSAorCXN0cnVjdCBzb2NrYWRkcl9kbCAqc2RscDsKKyNlbmRpZgorCisvKgorICogQlNEIDQuNCBkZWZpbmVzIHRoZSBzaXplIG9mIGFuIGlmcmVxIHRvIGJlCisgKiBtYXgoc2l6ZW9mKGlmcmVxKSwgc2l6ZW9mKGlmcmVxLmlmcl9uYW1lKStpZnJlcS5pZnJfYWRkci5zYV9sZW4KKyAqIEhvd2V2ZXIsIHVuZGVyIGVhcmxpZXIgc3lzdGVtcywgc2FfbGVuIGlzbid0IHByZXNlbnQsIHNvIHRoZSBzaXplIGlzCisgKiBqdXN0IHNpemVvZihzdHJ1Y3QgaWZyZXEpCisgKi8KKyNpZmRlZiBIQVZFX1NBX0xFTgorI2lmbmRlZiBtYXgKKyNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorI2RlZmluZSBpZnJlcV9zaXplKGkpIG1heChzaXplb2Yoc3RydWN0IGlmcmVxKSxcCisgICAgIHNpemVvZigoaSkuaWZyX25hbWUpKyhpKS5pZnJfYWRkci5zYV9sZW4pCisjZWxzZQorI2RlZmluZSBpZnJlcV9zaXplKGkpIHNpemVvZihzdHJ1Y3QgaWZyZXEpCisjZW5kaWYgLyogSEFWRV9TQV9MRU4qLworCisJc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19JUCk7CisJaWYgKHNkIDwgMCkgeworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlpZmMuaWZjX2xlbiA9IHNpemVvZihidWYpOworCWlmYy5pZmNfYnVmID0gYnVmOworCWlmIChpb2N0bCAoc2QsIFNJT0NHSUZDT05GLCAoY2hhciAqKSZpZmMpIDwgMCkgeworCQljbG9zZShzZCk7CisJCXJldHVybiAtMTsKKwl9CisJbiA9IGlmYy5pZmNfbGVuOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKz0gaWZyZXFfc2l6ZSgqaWZycCkgKSB7CisJCWlmcnAgPSAoc3RydWN0IGlmcmVxICopKChjaGFyICopIGlmYy5pZmNfYnVmK2kpOworCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaWZycC0+aWZyX25hbWUsIElGTkFNU0laKTsKKyNpZmRlZiBTSU9DR0lGSFdBRERSCisJCWlmIChpb2N0bChzZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKQorCQkJY29udGludWU7CisJCWEgPSAodW5zaWduZWQgY2hhciAqKSAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YTsKKyNlbHNlCisjaWZkZWYgU0lPQ0dFTkFERFIKKwkJaWYgKGlvY3RsKHNkLCBTSU9DR0VOQUREUiwgJmlmcikgPCAwKQorCQkJY29udGludWU7CisJCWEgPSAodW5zaWduZWQgY2hhciAqKSBpZnIuaWZyX2VuYWRkcjsKKyNlbHNlCisjaWZkZWYgSEFWRV9ORVRfSUZfRExfSAorCQlzZGxwID0gKHN0cnVjdCBzb2NrYWRkcl9kbCAqKSAmaWZycC0+aWZyX2FkZHI7CisJCWlmICgoc2RscC0+c2RsX2ZhbWlseSAhPSBBRl9MSU5LKSB8fCAoc2RscC0+c2RsX2FsZW4gIT0gNikpCisJCQljb250aW51ZTsKKwkJYSA9ICh1bnNpZ25lZCBjaGFyICopICZzZGxwLT5zZGxfZGF0YVtzZGxwLT5zZGxfbmxlbl07CisjZWxzZQorCQkvKgorCQkgKiBYWFggd2UgZG9uJ3QgaGF2ZSBhIHdheSBvZiBnZXR0aW5nIHRoZSBoYXJkd2FyZQorCQkgKiBhZGRyZXNzCisJCSAqLworCQljbG9zZShzZCk7CisJCXJldHVybiAwOworI2VuZGlmIC8qIEhBVkVfTkVUX0lGX0RMX0ggKi8KKyNlbmRpZiAvKiBTSU9DR0VOQUREUiAqLworI2VuZGlmIC8qIFNJT0NHSUZIV0FERFIgKi8KKwkJaWYgKCFhWzBdICYmICFhWzFdICYmICFhWzJdICYmICFhWzNdICYmICFhWzRdICYmICFhWzVdKQorCQkJY29udGludWU7CisJCWlmIChub2RlX2lkKSB7CisJCQltZW1jcHkobm9kZV9pZCwgYSwgNik7CisJCQljbG9zZShzZCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwljbG9zZShzZCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogQXNzdW1lIHRoYXQgdGhlIGdldHRpbWVvZmRheSgpIGhhcyBtaWNyb3NlY29uZCBncmFudWxhcml0eSAqLworI2RlZmluZSBNQVhfQURKVVNUTUVOVCAxMAorCitzdGF0aWMgaW50IGdldF9jbG9jayh1aW50MzJfdCAqY2xvY2tfaGlnaCwgdWludDMyX3QgKmNsb2NrX2xvdywKKwkJICAgICB1aW50MTZfdCAqcmV0X2Nsb2NrX3NlcSwgaW50ICpudW0pCit7CisJVEhSRUFEX0xPQ0FMIGludAkJYWRqdXN0bWVudCA9IDA7CisJVEhSRUFEX0xPQ0FMIHN0cnVjdCB0aW1ldmFsCWxhc3QgPSB7MCwgMH07CisJVEhSRUFEX0xPQ0FMIGludAkJc3RhdGVfZmQgPSAtMjsKKwlUSFJFQURfTE9DQUwgRklMRQkJKnN0YXRlX2Y7CisJVEhSRUFEX0xPQ0FMIHVpbnQxNl90CQljbG9ja19zZXE7CisJc3RydWN0IHRpbWV2YWwgCQkJdHY7CisJc3RydWN0IGZsb2NrCQkJZmw7CisJdWludDY0X3QJCQljbG9ja19yZWc7CisJbW9kZV90CQkJCXNhdmVfdW1hc2s7CisJaW50CQkJCWxlbjsKKworCWlmIChzdGF0ZV9mZCA9PSAtMikgeworCQlzYXZlX3VtYXNrID0gdW1hc2soMCk7CisJCXN0YXRlX2ZkID0gb3BlbigiL3Zhci9saWIvbGlidXVpZC9jbG9jay50eHQiLAorCQkJCU9fUkRXUnxPX0NSRUFULCAwNjYwKTsKKwkJKHZvaWQpIHVtYXNrKHNhdmVfdW1hc2spOworCQlzdGF0ZV9mID0gZmRvcGVuKHN0YXRlX2ZkLCAicisiKTsKKwkJaWYgKCFzdGF0ZV9mKSB7CisJCQljbG9zZShzdGF0ZV9mZCk7CisJCQlzdGF0ZV9mZCA9IC0xOworCQl9CisJfQorCWZsLmxfdHlwZSA9IEZfV1JMQ0s7CisJZmwubF93aGVuY2UgPSBTRUVLX1NFVDsKKwlmbC5sX3N0YXJ0ID0gMDsKKwlmbC5sX2xlbiA9IDA7CisJZmwubF9waWQgPSAwOworCWlmIChzdGF0ZV9mZCA+PSAwKSB7CisJCXJld2luZChzdGF0ZV9mKTsKKwkJd2hpbGUgKGZjbnRsKHN0YXRlX2ZkLCBGX1NFVExLVywgJmZsKSA8IDApIHsKKwkJCWlmICgoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRUlOVFIpKQorCQkJCWNvbnRpbnVlOworCQkJZmNsb3NlKHN0YXRlX2YpOworCQkJY2xvc2Uoc3RhdGVfZmQpOworCQkJc3RhdGVfZmQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChzdGF0ZV9mZCA+PSAwKSB7CisJCXVuc2lnbmVkIGludCBjbDsKKwkJdW5zaWduZWQgbG9uZyB0djEsIHR2MjsKKwkJaW50IGE7CisKKwkJaWYgKGZzY2FuZihzdGF0ZV9mLCAiY2xvY2s6ICUwNHggdHY6ICVsdSAlbHUgYWRqOiAlZFxuIiwKKwkJCSAgICZjbCwgJnR2MSwgJnR2MiwgJmEpID09IDQpIHsKKwkJCWNsb2NrX3NlcSA9IGNsICYgMHgzRkZGOworCQkJbGFzdC50dl9zZWMgPSB0djE7CisJCQlsYXN0LnR2X3VzZWMgPSB0djI7CisJCQlhZGp1c3RtZW50ID0gYTsKKwkJfQorCX0KKworCWlmICgobGFzdC50dl9zZWMgPT0gMCkgJiYgKGxhc3QudHZfdXNlYyA9PSAwKSkgeworCQlnZXRfcmFuZG9tX2J5dGVzKCZjbG9ja19zZXEsIHNpemVvZihjbG9ja19zZXEpKTsKKwkJY2xvY2tfc2VxICY9IDB4M0ZGRjsKKwkJZ2V0dGltZW9mZGF5KCZsYXN0LCAwKTsKKwkJbGFzdC50dl9zZWMtLTsKKwl9CisKK3RyeV9hZ2FpbjoKKwlnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKKwlpZiAoKHR2LnR2X3NlYyA8IGxhc3QudHZfc2VjKSB8fAorCSAgICAoKHR2LnR2X3NlYyA9PSBsYXN0LnR2X3NlYykgJiYKKwkgICAgICh0di50dl91c2VjIDwgbGFzdC50dl91c2VjKSkpIHsKKwkJY2xvY2tfc2VxID0gKGNsb2NrX3NlcSsxKSAmIDB4M0ZGRjsKKwkJYWRqdXN0bWVudCA9IDA7CisJCWxhc3QgPSB0djsKKwl9IGVsc2UgaWYgKCh0di50dl9zZWMgPT0gbGFzdC50dl9zZWMpICYmCisJICAgICh0di50dl91c2VjID09IGxhc3QudHZfdXNlYykpIHsKKwkJaWYgKGFkanVzdG1lbnQgPj0gTUFYX0FESlVTVE1FTlQpCisJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJYWRqdXN0bWVudCsrOworCX0gZWxzZSB7CisJCWFkanVzdG1lbnQgPSAwOworCQlsYXN0ID0gdHY7CisJfQorCisJY2xvY2tfcmVnID0gdHYudHZfdXNlYyoxMCArIGFkanVzdG1lbnQ7CisJY2xvY2tfcmVnICs9ICgodWludDY0X3QpIHR2LnR2X3NlYykqMTAwMDAwMDA7CisJY2xvY2tfcmVnICs9ICgoKHVpbnQ2NF90KSAweDAxQjIxREQyKSA8PCAzMikgKyAweDEzODE0MDAwOworCisJaWYgKG51bSAmJiAoKm51bSA+IDEpKSB7CisJCWFkanVzdG1lbnQgKz0gKm51bSAtIDE7CisJCWxhc3QudHZfdXNlYyArPSBhZGp1c3RtZW50IC8gMTA7CisJCWFkanVzdG1lbnQgPSBhZGp1c3RtZW50ICUgMTA7CisJCWxhc3QudHZfc2VjICs9IGxhc3QudHZfdXNlYyAvIDEwMDAwMDA7CisJCWxhc3QudHZfdXNlYyA9IGxhc3QudHZfdXNlYyAlIDEwMDAwMDA7CisJfQorCisJaWYgKHN0YXRlX2ZkID4gMCkgeworCQlyZXdpbmQoc3RhdGVfZik7CisJCWxlbiA9IGZwcmludGYoc3RhdGVfZiwgCisJCQkgICAgICAiY2xvY2s6ICUwNHggdHY6ICUwMTZsdSAlMDhsdSBhZGo6ICUwOGRcbiIsCisJCQkgICAgICBjbG9ja19zZXEsIGxhc3QudHZfc2VjLCBsYXN0LnR2X3VzZWMsIGFkanVzdG1lbnQpOworCQlmZmx1c2goc3RhdGVfZik7CisJCWlmIChmdHJ1bmNhdGUoc3RhdGVfZmQsIGxlbikgPCAwKSB7CisJCQlmcHJpbnRmKHN0YXRlX2YsICIgICAgICAgICAgICAgICAgICAgXG4iKTsKKwkJCWZmbHVzaChzdGF0ZV9mKTsKKwkJfQorCQlyZXdpbmQoc3RhdGVfZik7CisJCWZsLmxfdHlwZSA9IEZfVU5MQ0s7CisJCWZjbnRsKHN0YXRlX2ZkLCBGX1NFVExLLCAmZmwpOworCX0KKworCSpjbG9ja19oaWdoID0gY2xvY2tfcmVnID4+IDMyOworCSpjbG9ja19sb3cgPSBjbG9ja19yZWc7CisJKnJldF9jbG9ja19zZXEgPSBjbG9ja19zZXE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfYWxsKGludCBmZCwgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXQ7CisJc3NpemVfdCBjID0gMDsKKwlpbnQgdHJpZXMgPSAwOworCisJbWVtc2V0KGJ1ZiwgMCwgY291bnQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJcmV0ID0gcmVhZChmZCwgYnVmLCBjb3VudCk7CisJCWlmIChyZXQgPD0gMCkgeworCQkJaWYgKChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIgfHwgcmV0ID09IDApICYmCisJCQkgICAgKHRyaWVzKysgPCA1KSkKKwkJCQljb250aW51ZTsKKwkJCXJldHVybiBjID8gYyA6IC0xOworCQl9CisJCWlmIChyZXQgPiAwKQorCQkJdHJpZXMgPSAwOworCQljb3VudCAtPSByZXQ7CisJCWJ1ZiArPSByZXQ7CisJCWMgKz0gcmV0OworCX0KKwlyZXR1cm4gYzsKK30KKworLyoKKyAqIENsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzCisgKi8KK3N0YXRpYyB2b2lkIGNsb3NlX2FsbF9mZHModm9pZCkKK3sKKwlpbnQgaSwgbWF4OworCisjaWYgZGVmaW5lZChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQoX1NDX09QRU5fTUFYKQorCW1heCA9IHN5c2NvbmYoX1NDX09QRU5fTUFYKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HRVREVEFCTEVTSVpFKQorCW1heCA9IGdldGR0YWJsZXNpemUoKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRSTElNSVQpICYmIGRlZmluZWQoUkxJTUlUX05PRklMRSkKKwlzdHJ1Y3QgcmxpbWl0IHJsOworCisJZ2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybCk7CisJbWF4ID0gcmwucmxpbV9jdXI7CisjZWxzZQorCW1heCA9IE9QRU5fTUFYOworI2VuZGlmCisKKwlmb3IgKGk9MDsgaSA8IG1heDsgaSsrKSB7CisJCWNsb3NlKGkpOworCQlpZiAoaSA8PSAyKQorCQkJb3BlbigiL2Rldi9udWxsIiwgT19SRFdSKTsKKwl9Cit9CisKKworLyoKKyAqIFRyeSB1c2luZyB0aGUgdXVpZGQgZGFlbW9uIHRvIGdlbmVyYXRlIHRoZSBVVUlECisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3V1aWRfdmlhX2RhZW1vbihpbnQgb3AsIHV1aWRfdCBvdXQsIGludCAqbnVtKQoreworI2lmIGRlZmluZWQoVVNFX1VVSUREKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1VOX0gpCisJY2hhciBvcF9idWZbNjRdOworCWludCBvcF9sZW47CisJaW50IHM7CisJc3NpemVfdCByZXQ7CisJaW50MzJfdCByZXBseV9sZW4gPSAwLCBleHBlY3RlZCA9IDE2OworCXN0cnVjdCBzb2NrYWRkcl91biBzcnZfYWRkcjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlwaWRfdCBwaWQ7CisJc3RhdGljIGNvbnN0IGNoYXIgKnV1aWRkX3BhdGggPSBVVUlERF9QQVRIOworCXN0YXRpYyBpbnQgYWNjZXNzX3JldCA9IC0yOworCXN0YXRpYyBpbnQgc3RhcnRfYXR0ZW1wdHMgPSAwOworCisJaWYgKChzID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlzcnZfYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwlzdHJjcHkoc3J2X2FkZHIuc3VuX3BhdGgsIFVVSUREX1NPQ0tFVF9QQVRIKTsKKworCWlmIChjb25uZWN0KHMsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikgJnNydl9hZGRyLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikpIDwgMCkgeworCQlpZiAoYWNjZXNzX3JldCA9PSAtMikKKwkJCWFjY2Vzc19yZXQgPSBhY2Nlc3ModXVpZGRfcGF0aCwgWF9PSyk7CisJCWlmIChhY2Nlc3NfcmV0ID09IDApCisJCQlhY2Nlc3NfcmV0ID0gc3RhdCh1dWlkZF9wYXRoLCAmc3QpOworCQlpZiAoYWNjZXNzX3JldCA9PSAwICYmIChzdC5zdF9tb2RlICYgKFNfSVNVSUQgfCBTX0lTR0lEKSkgPT0gMCkKKwkJCWFjY2Vzc19yZXQgPSBhY2Nlc3MoVVVJRERfRElSLCBXX09LKTsKKwkJaWYgKGFjY2Vzc19yZXQgPT0gMCAmJiBzdGFydF9hdHRlbXB0cysrIDwgNSkgeworCQkJaWYgKChwaWQgPSBmb3JrKCkpID09IDApIHsKKwkJCQljbG9zZV9hbGxfZmRzKCk7CisJCQkJZXhlY2wodXVpZGRfcGF0aCwgInV1aWRkIiwgIi1xVCIsICIzMDAiLAorCQkJCSAgICAgIChjaGFyICopIE5VTEwpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQkodm9pZCkgd2FpdHBpZChwaWQsIDAsIDApOworCQkJaWYgKGNvbm5lY3QocywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAmc3J2X2FkZHIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKSA8IDApCisJCQkJZ290byBmYWlsOworCQl9IGVsc2UKKwkJCWdvdG8gZmFpbDsKKwl9CisJb3BfYnVmWzBdID0gb3A7CisJb3BfbGVuID0gMTsKKwlpZiAob3AgPT0gVVVJRERfT1BfQlVMS19USU1FX1VVSUQpIHsKKwkJbWVtY3B5KG9wX2J1ZisxLCBudW0sIHNpemVvZigqbnVtKSk7CisJCW9wX2xlbiArPSBzaXplb2YoKm51bSk7CisJCWV4cGVjdGVkICs9IHNpemVvZigqbnVtKTsKKwl9CisKKwlyZXQgPSB3cml0ZShzLCBvcF9idWYsIG9wX2xlbik7CisJaWYgKHJldCA8IDEpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IHJlYWRfYWxsKHMsIChjaGFyICopICZyZXBseV9sZW4sIHNpemVvZihyZXBseV9sZW4pKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJaWYgKHJlcGx5X2xlbiAhPSBleHBlY3RlZCkKKwkJZ290byBmYWlsOworCisJcmV0ID0gcmVhZF9hbGwocywgb3BfYnVmLCByZXBseV9sZW4pOworCisJaWYgKG9wID09IFVVSUREX09QX0JVTEtfVElNRV9VVUlEKQorCQltZW1jcHkob3BfYnVmKzE2LCBudW0sIHNpemVvZihpbnQpKTsKKworCW1lbWNweShvdXQsIG9wX2J1ZiwgMTYpOworCisJY2xvc2Uocyk7CisJcmV0dXJuICgocmV0ID09IGV4cGVjdGVkKSA/IDAgOiAtMSk7CisKK2ZhaWw6CisJY2xvc2Uocyk7CisjZW5kaWYKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgdXVpZF9fZ2VuZXJhdGVfdGltZSh1dWlkX3Qgb3V0LCBpbnQgKm51bSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBub2RlX2lkWzZdOworCXN0YXRpYyBpbnQgaGFzX2luaXQgPSAwOworCXN0cnVjdCB1dWlkIHV1OworCXVpbnQzMl90CWNsb2NrX21pZDsKKworCWlmICghaGFzX2luaXQpIHsKKwkJaWYgKGdldF9ub2RlX2lkKG5vZGVfaWQpIDw9IDApIHsKKwkJCWdldF9yYW5kb21fYnl0ZXMobm9kZV9pZCwgNik7CisJCQkvKgorCQkJICogU2V0IG11bHRpY2FzdCBiaXQsIHRvIHByZXZlbnQgY29uZmxpY3RzCisJCQkgKiB3aXRoIElFRUUgODAyIGFkZHJlc3NlcyBvYnRhaW5lZCBmcm9tCisJCQkgKiBuZXR3b3JrIGNhcmRzCisJCQkgKi8KKwkJCW5vZGVfaWRbMF0gfD0gMHgwMTsKKwkJfQorCQloYXNfaW5pdCA9IDE7CisJfQorCWdldF9jbG9jaygmY2xvY2tfbWlkLCAmdXUudGltZV9sb3csICZ1dS5jbG9ja19zZXEsIG51bSk7CisJdXUuY2xvY2tfc2VxIHw9IDB4ODAwMDsKKwl1dS50aW1lX21pZCA9ICh1aW50MTZfdCkgY2xvY2tfbWlkOworCXV1LnRpbWVfaGlfYW5kX3ZlcnNpb24gPSAoKGNsb2NrX21pZCA+PiAxNikgJiAweDBGRkYpIHwgMHgxMDAwOworCW1lbWNweSh1dS5ub2RlLCBub2RlX2lkLCA2KTsKKwl1dWlkX3BhY2soJnV1LCBvdXQpOworfQorCit2b2lkIHV1aWRfZ2VuZXJhdGVfdGltZSh1dWlkX3Qgb3V0KQoreworI2lmZGVmIFRMUworCVRIUkVBRF9MT0NBTCBpbnQJCW51bSA9IDA7CisJVEhSRUFEX0xPQ0FMIHN0cnVjdCB1dWlkCXV1OworCVRIUkVBRF9MT0NBTCB0aW1lX3QJCWxhc3RfdGltZSA9IDA7CisJdGltZV90CQkJCW5vdzsKKworCWlmIChudW0gPiAwKSB7CisJCW5vdyA9IHRpbWUoMCk7CisJCWlmIChub3cgPiBsYXN0X3RpbWUrMSkKKwkJCW51bSA9IDA7CisJfQorCWlmIChudW0gPD0gMCkgeworCQludW0gPSAxMDAwOworCQlpZiAoZ2V0X3V1aWRfdmlhX2RhZW1vbihVVUlERF9PUF9CVUxLX1RJTUVfVVVJRCwKKwkJCQkJb3V0LCAmbnVtKSA9PSAwKSB7CisJCQlsYXN0X3RpbWUgPSB0aW1lKDApOworCQkJdXVpZF91bnBhY2sob3V0LCAmdXUpOworCQkJbnVtLS07CisJCQlyZXR1cm47CisJCX0KKwkJbnVtID0gMDsKKwl9CisJaWYgKG51bSA+IDApIHsKKwkJdXUudGltZV9sb3crKzsKKwkJaWYgKHV1LnRpbWVfbG93ID09IDApIHsKKwkJCXV1LnRpbWVfbWlkKys7CisJCQlpZiAodXUudGltZV9taWQgPT0gMCkKKwkJCQl1dS50aW1lX2hpX2FuZF92ZXJzaW9uKys7CisJCX0KKwkJbnVtLS07CisJCXV1aWRfcGFjaygmdXUsIG91dCk7CisJCXJldHVybjsKKwl9CisjZWxzZQorCWlmIChnZXRfdXVpZF92aWFfZGFlbW9uKFVVSUREX09QX1RJTUVfVVVJRCwgb3V0LCAwKSA9PSAwKQorCQlyZXR1cm47CisjZW5kaWYKKworCXV1aWRfX2dlbmVyYXRlX3RpbWUob3V0LCAwKTsKK30KKworCit2b2lkIHV1aWRfX2dlbmVyYXRlX3JhbmRvbSh1dWlkX3Qgb3V0LCBpbnQgKm51bSkKK3sKKwl1dWlkX3QJYnVmOworCXN0cnVjdCB1dWlkIHV1OworCWludCBpLCBuOworCisJaWYgKCFudW0gfHwgISpudW0pCisJCW4gPSAxOworCWVsc2UKKwkJbiA9ICpudW07CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWdldF9yYW5kb21fYnl0ZXMoYnVmLCBzaXplb2YoYnVmKSk7CisJCXV1aWRfdW5wYWNrKGJ1ZiwgJnV1KTsKKworCQl1dS5jbG9ja19zZXEgPSAodXUuY2xvY2tfc2VxICYgMHgzRkZGKSB8IDB4ODAwMDsKKwkJdXUudGltZV9oaV9hbmRfdmVyc2lvbiA9ICh1dS50aW1lX2hpX2FuZF92ZXJzaW9uICYgMHgwRkZGKQorCQkJfCAweDQwMDA7CisJCXV1aWRfcGFjaygmdXUsIG91dCk7CisJCW91dCArPSBzaXplb2YodXVpZF90KTsKKwl9Cit9CisKK3ZvaWQgdXVpZF9nZW5lcmF0ZV9yYW5kb20odXVpZF90IG91dCkKK3sKKwlpbnQJbnVtID0gMTsKKwkvKiBObyByZWFsIHJlYXNvbiB0byB1c2UgdGhlIGRhZW1vbiBmb3IgcmFuZG9tIHV1aWQncyAtLSB5ZXQgKi8KKworCXV1aWRfX2dlbmVyYXRlX3JhbmRvbShvdXQsICZudW0pOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBnZW5lcmljIGZyb250LWVuZCB0byB1dWlkX2dlbmVyYXRlX3JhbmRvbSBhbmQKKyAqIHV1aWRfZ2VuZXJhdGVfdGltZS4gIEl0IHVzZXMgdXVpZF9nZW5lcmF0ZV9yYW5kb20gb25seSBpZgorICogL2Rldi91cmFuZG9tIGlzIGF2YWlsYWJsZSwgc2luY2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGhhdmUKKyAqIGhpZ2gtcXVhbGl0eSByYW5kb21uZXNzLgorICovCit2b2lkIHV1aWRfZ2VuZXJhdGUodXVpZF90IG91dCkKK3sKKwlpZiAoZ2V0X3JhbmRvbV9mZCgpID49IDApCisJCXV1aWRfZ2VuZXJhdGVfcmFuZG9tKG91dCk7CisJZWxzZQorCQl1dWlkX2dlbmVyYXRlX3RpbWUob3V0KTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvZ2VuX3V1aWRfbnQuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvZ2VuX3V1aWRfbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ0YmZkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9nZW5fdXVpZF9udC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBnZW5fdXVpZF9udC5jIC0tIFVzZSBOVCBhcGkgdG8gZ2VuZXJhdGUgdXVpZAorICoKKyAqIFdyaXR0ZW4gYnkgQW5kcmV5IFNoZWRlbCAoYW5kcmV5c0Bucy5jci5jeWNvLmNvbSkKKyAqLworCisKKyNpbmNsdWRlICJ1dWlkUC5oIgorCisjcHJhZ21hIHdhcm5pbmcocHVzaCw0KQorCisjcHJhZ21hIGNvbW1lbnQobGliLCAibnRkbGwubGliIikKKworLy8KKy8vIEhlcmUgaXMgYSBuaWNlIGV4YW1wbGUgd2h5IGl0J3Mgbm90IGEgZ29vZCBpZGVhCisvLyB0byB1c2UgbmF0aXZlIEFQSSBpbiBvcmRpbmFyeSBhcHBsaWNhdGlvbnMuCisvLyBOdW1iZXIgb2YgcGFyYW1ldGVycyBpbiBmdW5jdGlvbiBiZWxvdyB3YXMgY2hhbmdlZCBmcm9tIDMgdG8gNAorLy8gZm9yIE5UNS4KKy8vCisvLworLy8gTlRTWVNBUEkKKy8vIE5UU1RBVFVTCisvLyBOVEFQSQorLy8gTnRBbGxvY2F0ZVV1aWRzKAorLy8gICAgIE9VVCBQVUxPTkcgcDEsCisvLyAgICAgT1VUIFBVTE9ORyBwMiwKKy8vICAgICBPVVQgUFVMT05HIHAzLAorLy8gICAgIE9VVCBQVUNIQVIgU2VlZCAvLyA2IGJ5dGVzCisvLyAgICk7CisvLworLy8KKwordW5zaWduZWQgbG9uZworX19zdGRjYWxsCitOdEFsbG9jYXRlVXVpZHMoCisgICB2b2lkKiBwMSwgIC8vIDggYnl0ZXMKKyAgIHZvaWQqIHAyLCAgLy8gNCBieXRlcworICAgdm9pZCogcDMgICAvLyA0IGJ5dGVzCisgICApOworCit0eXBlZGVmCit1bnNpZ25lZCBsb25nCisoX19zdGRjYWxsKgorTnRBbGxvY2F0ZVV1aWRzXzIwMDApKAorICAgdm9pZCogcDEsICAvLyA4IGJ5dGVzCisgICB2b2lkKiBwMiwgIC8vIDQgYnl0ZXMKKyAgIHZvaWQqIHAzLCAgLy8gNCBieXRlcworICAgdm9pZCogc2VlZCAvLyA2IGJ5dGVzCisgICApOworCisKKworLy8KKy8vIE5pY2UsIGJ1dCBpbnN0ZWFkIG9mIGluY2x1ZGluZyBudGRkay5oIG90IHdpbm50LmgKKy8vIEkgc2hvdWxkIGRlZmluZSBpdCBoZXJlIGJlY2F1c2UgdGhleSBNSVNTRUQgX19zdGRjYWxsIGluIHRob3NlIGhlYWRlcnMuCisvLworCitfX2RlY2xzcGVjKGRsbGltcG9ydCkKK3N0cnVjdCBfVEVCKgorX19zdGRjYWxsCitOdEN1cnJlbnRUZWIodm9pZCk7CisKKworLy8KKy8vIFRoZSBvbmx5IHdheSB0byBnZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzeXN0ZW0gaXMgdG8gZXhhbWluZQorLy8gb25lIHN0b3JlZCBpbiBQRUIuIEJ1dCBpdCdzIHByZXR0eSBkYW5nZXJvdXNlIGJlY2F1c2UgdGhpcyB2YWx1ZSBjb3VsZAorLy8gYmUgYWx0ZXJlZCBpbiBpbWFnZSBoZWFkZXIuCisvLworCitzdGF0aWMKK2ludAorTnQ1KHZvaWQpCit7CisJLy9yZXR1cm4gTnRDdXR0ZW50VGViKCktPlBlYi0+T1NNYWpvclZlcnNpb24gPj0gNTsKKwlyZXR1cm4gKGludCkqKGludCopKChjaGFyKikoaW50KSgqKGludCopKChjaGFyKilOdEN1cnJlbnRUZWIoKSArIDB4MzApKSArIDB4QTQpID49IDU7Cit9CisKKworCisKK3ZvaWQgdXVpZF9nZW5lcmF0ZSh1dWlkX3Qgb3V0KQoreworCWlmKE50NSgpKQorCXsKKwkJdW5zaWduZWQgY2hhciBzZWVkWzZdOworCQkoKE50QWxsb2NhdGVVdWlkc18yMDAwKU50QWxsb2NhdGVVdWlkcykob3V0LCAoKGNoYXIqKW91dCkrOCwgKChjaGFyKilvdXQpKzEyLCAmc2VlZFswXSApOworCX0KKwllbHNlCisJeworCQlOdEFsbG9jYXRlVXVpZHMob3V0LCAoKGNoYXIqKW91dCkrOCwgKChjaGFyKilvdXQpKzEyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL2lzbnVsbC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9pc251bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzFlN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9pc251bGwuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogaXNudWxsLmMgLS0tIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBVVUlEIGlzIG51bGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSAidXVpZFAuaCIKKworLyogUmV0dXJucyAxIGlmIHRoZSB1dWlkIGlzIHRoZSBOVUxMIHV1aWQgKi8KK2ludCB1dWlkX2lzX251bGwoY29uc3QgdXVpZF90IHV1KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgCSpjcDsKKwlpbnQJCQlpOworCisJZm9yIChpPTAsIGNwID0gdXU7IGkgPCAxNjsgaSsrKQorCQlpZiAoKmNwKyspCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9wYWNrLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3BhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTc1MTZkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9wYWNrLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIEludGVybmFsIHJvdXRpbmUgZm9yIHBhY2tpbmcgVVVJRCdzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQUxMIE9GCisgKiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInV1aWRQLmgiCisKK3ZvaWQgdXVpZF9wYWNrKGNvbnN0IHN0cnVjdCB1dWlkICp1dSwgdXVpZF90IHB0cikKK3sKKwl1aW50MzJfdAl0bXA7CisJdW5zaWduZWQgY2hhcgkqb3V0ID0gcHRyOworCisJdG1wID0gdXUtPnRpbWVfbG93OworCW91dFszXSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisJdG1wID4+PSA4OworCW91dFsyXSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisJdG1wID4+PSA4OworCW91dFsxXSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisJdG1wID4+PSA4OworCW91dFswXSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisKKwl0bXAgPSB1dS0+dGltZV9taWQ7CisJb3V0WzVdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKwl0bXAgPj49IDg7CisJb3V0WzRdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKworCXRtcCA9IHV1LT50aW1lX2hpX2FuZF92ZXJzaW9uOworCW91dFs3XSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisJdG1wID4+PSA4OworCW91dFs2XSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisKKwl0bXAgPSB1dS0+Y2xvY2tfc2VxOworCW91dFs5XSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisJdG1wID4+PSA4OworCW91dFs4XSA9ICh1bnNpZ25lZCBjaGFyKSB0bXA7CisKKwltZW1jcHkob3V0KzEwLCB1dS0+bm9kZSwgNik7Cit9CisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvcGFyc2UuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQzODNlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC9wYXJzZS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBwYXJzZS5jIC0tLSBVVUlEIHBhcnNpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidXVpZFAuaCIKKworaW50IHV1aWRfcGFyc2UoY29uc3QgY2hhciAqaW4sIHV1aWRfdCB1dSkKK3sKKwlzdHJ1Y3QgdXVpZAl1dWlkOworCWludCAJCWk7CisJY29uc3QgY2hhcgkqY3A7CisJY2hhcgkJYnVmWzNdOworCisJaWYgKHN0cmxlbihpbikgIT0gMzYpCisJCXJldHVybiAtMTsKKwlmb3IgKGk9MCwgY3AgPSBpbjsgaSA8PSAzNjsgaSsrLGNwKyspIHsKKwkJaWYgKChpID09IDgpIHx8IChpID09IDEzKSB8fCAoaSA9PSAxOCkgfHwKKwkJICAgIChpID09IDIzKSkgeworCQkJaWYgKCpjcCA9PSAnLScpCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChpPT0gMzYpCisJCQlpZiAoKmNwID09IDApCisJCQkJY29udGludWU7CisJCWlmICghaXN4ZGlnaXQoKmNwKSkKKwkJCXJldHVybiAtMTsKKwl9CisJdXVpZC50aW1lX2xvdyA9IHN0cnRvdWwoaW4sIE5VTEwsIDE2KTsKKwl1dWlkLnRpbWVfbWlkID0gc3RydG91bChpbis5LCBOVUxMLCAxNik7CisJdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uID0gc3RydG91bChpbisxNCwgTlVMTCwgMTYpOworCXV1aWQuY2xvY2tfc2VxID0gc3RydG91bChpbisxOSwgTlVMTCwgMTYpOworCWNwID0gaW4rMjQ7CisJYnVmWzJdID0gMDsKKwlmb3IgKGk9MDsgaSA8IDY7IGkrKykgeworCQlidWZbMF0gPSAqY3ArKzsKKwkJYnVmWzFdID0gKmNwKys7CisJCXV1aWQubm9kZVtpXSA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxNik7CisJfQorCisJdXVpZF9wYWNrKCZ1dWlkLCB1dSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3RzdF91dWlkLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3RzdF91dWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjMDIwNwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdHN0X3V1aWQuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIHRzdF91dWlkLmMgLS0tIHRlc3QgcHJvZ3JhbSBmcm9tIHRoZSBVVUlEIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIFVVSUQgTVlVVUlECisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDx1dWlkL3V1aWQuaD4KKworc3RhdGljIGludCB0ZXN0X3V1aWQoY29uc3QgY2hhciAqIHV1aWQsIGludCBpc1ZhbGlkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICogdmFsaWRTdHJbMl0gPSB7ImludmFsaWQiLCAidmFsaWQifTsKKwl1dWlkX3QgdXVpZEJpdHM7CisJaW50IHBhcnNlZE9rOworCisJcGFyc2VkT2sgPSB1dWlkX3BhcnNlKHV1aWQsIHV1aWRCaXRzKSA9PSAwOworCisJcHJpbnRmKCIlcyBpcyAlcyIsIHV1aWQsIHZhbGlkU3RyW2lzVmFsaWRdKTsKKwlpZiAocGFyc2VkT2sgIT0gaXNWYWxpZCkgeworCQlwcmludGYoIiBidXQgdXVpZF9wYXJzZSBzYXlzICVzXG4iLCB2YWxpZFN0cltwYXJzZWRPa10pOworCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRmKCIsIE9LXG4iKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIEFUVFIoeCkgX19hdHRyaWJ1dGVfXyh4KQorI2Vsc2UKKyNkZWZpbmUgQVRUUih4KQorI2VuZGlmCisKK2ludAorbWFpbihpbnQgYXJnYyBBVFRSKCh1bnVzZWQpKSAsIGNoYXIgKiphcmd2IEFUVFIoKHVudXNlZCkpKQoreworCXV1aWRfdAkJYnVmLCB0c3Q7CisJY2hhcgkJc3RyWzEwMF07CisJc3RydWN0IHRpbWV2YWwJdHY7CisJdGltZV90CQl0aW1lX3JlZzsKKwl1bnNpZ25lZCBjaGFyCSpjcDsKKwlpbnQgaTsKKwlpbnQgZmFpbGVkID0gMDsKKwlpbnQgdHlwZSwgdmFyaWFudDsKKworCXV1aWRfZ2VuZXJhdGUoYnVmKTsKKwl1dWlkX3VucGFyc2UoYnVmLCBzdHIpOworCXByaW50ZigiVVVJRCBnZW5lcmF0ZSA9ICVzXG4iLCBzdHIpOworCXByaW50ZigiVVVJRDogIik7CisJZm9yIChpPTAsIGNwID0gKHVuc2lnbmVkIGNoYXIgKikgJmJ1ZjsgaSA8IDE2OyBpKyspIHsKKwkJcHJpbnRmKCIlMDJ4IiwgKmNwKyspOworCX0KKwlwcmludGYoIlxuIik7CisJdHlwZSA9IHV1aWRfdHlwZShidWYpOyAJdmFyaWFudCA9IHV1aWRfdmFyaWFudChidWYpOworCXByaW50ZigiVVVJRCB0eXBlID0gJWQsIFVVSUQgdmFyaWFudCA9ICVkXG4iLCB0eXBlLCB2YXJpYW50KTsKKwlpZiAodmFyaWFudCAhPSBVVUlEX1ZBUklBTlRfRENFKSB7CisJCXByaW50ZigiSW5jb3JyZWN0IFVVSUQgVmFyaWFudDsgd2FzIGV4cGVjdGluZyBEQ0UhXG4iKTsKKwkJZmFpbGVkKys7CisJfQorCXByaW50ZigiXG4iKTsKKworCXV1aWRfZ2VuZXJhdGVfcmFuZG9tKGJ1Zik7CisJdXVpZF91bnBhcnNlKGJ1Ziwgc3RyKTsKKwlwcmludGYoIlVVSUQgcmFuZG9tIHN0cmluZyA9ICVzXG4iLCBzdHIpOworCXByaW50ZigiVVVJRDogIik7CisJZm9yIChpPTAsIGNwID0gKHVuc2lnbmVkIGNoYXIgKikgJmJ1ZjsgaSA8IDE2OyBpKyspIHsKKwkJcHJpbnRmKCIlMDJ4IiwgKmNwKyspOworCX0KKwlwcmludGYoIlxuIik7CisJdHlwZSA9IHV1aWRfdHlwZShidWYpOyAJdmFyaWFudCA9IHV1aWRfdmFyaWFudChidWYpOworCXByaW50ZigiVVVJRCB0eXBlID0gJWQsIFVVSUQgdmFyaWFudCA9ICVkXG4iLCB0eXBlLCB2YXJpYW50KTsKKwlpZiAodmFyaWFudCAhPSBVVUlEX1ZBUklBTlRfRENFKSB7CisJCXByaW50ZigiSW5jb3JyZWN0IFVVSUQgVmFyaWFudDsgd2FzIGV4cGVjdGluZyBEQ0UhXG4iKTsKKwkJZmFpbGVkKys7CisJfQorCWlmICh0eXBlICE9IDQpIHsKKwkJcHJpbnRmKCJJbmNvcnJlY3QgVVVJRCB0eXBlOyB3YXMgZXhwZWN0aW5nICIKKwkJICAgICAgICI0IChyYW5kb20gdHlwZSkhXG4iKTsKKwkJZmFpbGVkKys7CisJfQorCXByaW50ZigiXG4iKTsKKworCXV1aWRfZ2VuZXJhdGVfdGltZShidWYpOworCXV1aWRfdW5wYXJzZShidWYsIHN0cik7CisJcHJpbnRmKCJVVUlEIHN0cmluZyA9ICVzXG4iLCBzdHIpOworCXByaW50ZigiVVVJRCB0aW1lOiAiKTsKKwlmb3IgKGk9MCwgY3AgPSAodW5zaWduZWQgY2hhciAqKSAmYnVmOyBpIDwgMTY7IGkrKykgeworCQlwcmludGYoIiUwMngiLCAqY3ArKyk7CisJfQorCXByaW50ZigiXG4iKTsKKwl0eXBlID0gdXVpZF90eXBlKGJ1Zik7IAl2YXJpYW50ID0gdXVpZF92YXJpYW50KGJ1Zik7CisJcHJpbnRmKCJVVUlEIHR5cGUgPSAlZCwgVVVJRCB2YXJpYW50ID0gJWRcbiIsIHR5cGUsIHZhcmlhbnQpOworCWlmICh2YXJpYW50ICE9IFVVSURfVkFSSUFOVF9EQ0UpIHsKKwkJcHJpbnRmKCJJbmNvcnJlY3QgVVVJRCBWYXJpYW50OyB3YXMgZXhwZWN0aW5nIERDRSFcbiIpOworCQlmYWlsZWQrKzsKKwl9CisJaWYgKHR5cGUgIT0gMSkgeworCQlwcmludGYoIkluY29ycmVjdCBVVUlEIHR5cGU7IHdhcyBleHBlY3RpbmcgIgorCQkgICAgICAgIjEgKHRpbWUtYmFzZWQgdHlwZSkhXFxuIik7CisJCWZhaWxlZCsrOworCX0KKwl0di50dl9zZWMgPSAwOworCXR2LnR2X3VzZWMgPSAwOworCXRpbWVfcmVnID0gdXVpZF90aW1lKGJ1ZiwgJnR2KTsKKwlwcmludGYoIlVVSUQgdGltZSBpczogKCVsZCwgJWxkKTogJXNcbiIsIHR2LnR2X3NlYywgdHYudHZfdXNlYywKKwkgICAgICAgY3RpbWUoJnRpbWVfcmVnKSk7CisJdXVpZF9wYXJzZShzdHIsIHRzdCk7CisJaWYgKCF1dWlkX2NvbXBhcmUoYnVmLCB0c3QpKQorCQlwcmludGYoIlVVSUQgcGFyc2UgYW5kIGNvbXBhcmUgc3VjY2VlZGVkLlxuIik7CisJZWxzZSB7CisJCXByaW50ZigiVVVJRCBwYXJzZSBhbmQgY29tcGFyZSBmYWlsZWQhXG4iKTsKKwkJZmFpbGVkKys7CisJfQorCXV1aWRfY2xlYXIodHN0KTsKKwlpZiAodXVpZF9pc19udWxsKHRzdCkpCisJCXByaW50ZigiVVVJRCBjbGVhciBhbmQgaXMgbnVsbCBzdWNjZWVkZWQuXG4iKTsKKwllbHNlIHsKKwkJcHJpbnRmKCJVVUlEIGNsZWFyIGFuZCBpcyBudWxsIGZhaWxlZCFcbiIpOworCQlmYWlsZWQrKzsKKwl9CisJdXVpZF9jb3B5KGJ1ZiwgdHN0KTsKKwlpZiAoIXV1aWRfY29tcGFyZShidWYsIHRzdCkpCisJCXByaW50ZigiVVVJRCBjb3B5IGFuZCBjb21wYXJlIHN1Y2NlZWRlZC5cbiIpOworCWVsc2UgeworCQlwcmludGYoIlVVSUQgY29weSBhbmQgY29tcGFyZSBmYWlsZWQhXG4iKTsKKwkJZmFpbGVkKys7CisJfQorCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1LTQ3MDEtNGE4NC04OTViLTM1NGM1ODRhOTgxYiIsIDEpOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Q0M1LTQ3MDEtNEE4NC04OTVCLTM1NEM1ODRBOTgxQiIsIDEpOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1LTQ3MDEtNGE4NC04OTViLTM1NGM1ODRhOTgxYmMiLCAwKTsKKwlmYWlsZWQgKz0gdGVzdF91dWlkKCI4NDk0OWNjNS00NzAxLTRhODQtODk1Yi0zNTRjNTg0YTk4MSIsIDApOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1eDQ3MDEtNGE4NC04OTViLTM1NGM1ODRhOTgxYiIsIDApOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1MDQ3MDEtNGE4NC04OTViLTM1NGM1ODRhOTgxYiIsIDApOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1LTQ3MDEwNGE4NC04OTViLTM1NGM1ODRhOTgxYiIsIDApOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1LTQ3MDEtNGE4NDA4OTViLTM1NGM1ODRhOTgxYiIsIDApOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1LTQ3MDEtNGE4NC04OTViMDM1NGM1ODRhOTgxYiIsIDApOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoImc0OTQ5Y2M1LTQ3MDEtNGE4NC04OTViLTM1NGM1ODRhOTgxYiIsIDApOworCWZhaWxlZCArPSB0ZXN0X3V1aWQoIjg0OTQ5Y2M1LTQ3MDEtNGE4NC04OTViLTM1NGM1ODRhOTgxZyIsIDApOworCisJaWYgKGZhaWxlZCkgeworCQlwcmludGYoIiVkIGZhaWx1cmVzLlxuIiwgZmFpbGVkKTsKKwkJZXhpdCgxKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3VucGFjay5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91bnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWFhZmYzCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91bnBhY2suYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogSW50ZXJuYWwgcm91dGluZSBmb3IgdW5wYWNraW5nIFVVSUQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXVpZFAuaCIKKwordm9pZCB1dWlkX3VucGFjayhjb25zdCB1dWlkX3QgaW4sIHN0cnVjdCB1dWlkICp1dSkKK3sKKwljb25zdCB1aW50OF90CSpwdHIgPSBpbjsKKwl1aW50MzJfdAkJdG1wOworCisJdG1wID0gKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT50aW1lX2xvdyA9IHRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT50aW1lX21pZCA9IHRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT50aW1lX2hpX2FuZF92ZXJzaW9uID0gdG1wOworCisJdG1wID0gKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdXUtPmNsb2NrX3NlcSA9IHRtcDsKKworCW1lbWNweSh1dS0+bm9kZSwgcHRyLCA2KTsKK30KKwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91bnBhcnNlLmMgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3VucGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTViYmIwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91bnBhcnNlLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIHVucGFyc2UuYyAtLSBjb252ZXJ0IGEgVVVJRCB0byBzdHJpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInV1aWRQLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpmbXRfbG93ZXIgPQorCSIlMDh4LSUwNHgtJTA0eC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiOworCitzdGF0aWMgY29uc3QgY2hhciAqZm10X3VwcGVyID0KKwkiJTA4WC0lMDRYLSUwNFgtJTAyWCUwMlgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYIjsKKworI2lmZGVmIFVVSURfVU5QQVJTRV9ERUZBVUxUX1VQUEVSCisjZGVmaW5lIEZNVF9ERUZBVUxUIGZtdF91cHBlcgorI2Vsc2UKKyNkZWZpbmUgRk1UX0RFRkFVTFQgZm10X2xvd2VyCisjZW5kaWYKKworc3RhdGljIHZvaWQgdXVpZF91bnBhcnNlX3goY29uc3QgdXVpZF90IHV1LCBjaGFyICpvdXQsIGNvbnN0IGNoYXIgKmZtdCkKK3sKKwlzdHJ1Y3QgdXVpZCB1dWlkOworCisJdXVpZF91bnBhY2sodXUsICZ1dWlkKTsKKwlzcHJpbnRmKG91dCwgZm10LAorCQl1dWlkLnRpbWVfbG93LCB1dWlkLnRpbWVfbWlkLCB1dWlkLnRpbWVfaGlfYW5kX3ZlcnNpb24sCisJCXV1aWQuY2xvY2tfc2VxID4+IDgsIHV1aWQuY2xvY2tfc2VxICYgMHhGRiwKKwkJdXVpZC5ub2RlWzBdLCB1dWlkLm5vZGVbMV0sIHV1aWQubm9kZVsyXSwKKwkJdXVpZC5ub2RlWzNdLCB1dWlkLm5vZGVbNF0sIHV1aWQubm9kZVs1XSk7Cit9CisKK3ZvaWQgdXVpZF91bnBhcnNlX2xvd2VyKGNvbnN0IHV1aWRfdCB1dSwgY2hhciAqb3V0KQoreworCXV1aWRfdW5wYXJzZV94KHV1LCBvdXQsCWZtdF9sb3dlcik7Cit9CisKK3ZvaWQgdXVpZF91bnBhcnNlX3VwcGVyKGNvbnN0IHV1aWRfdCB1dSwgY2hhciAqb3V0KQoreworCXV1aWRfdW5wYXJzZV94KHV1LCBvdXQsCWZtdF91cHBlcik7Cit9CisKK3ZvaWQgdXVpZF91bnBhcnNlKGNvbnN0IHV1aWRfdCB1dSwgY2hhciAqb3V0KQoreworCXV1aWRfdW5wYXJzZV94KHV1LCBvdXQsIEZNVF9ERUZBVUxUKTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZC4zLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkLjMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NjBmZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZC4zLmluCkBAIC0wLDAgKzEsNjYgQEAKKy5cIiBDb3B5cmlnaHQgMTk5OSBBbmRyZWFzIERpbGdlciAoYWRpbGdlckBlbmVsLnVjYWxnYXJ5LmNhKQorLlwiCisuXCIgJUJlZ2luLUhlYWRlciUKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisuXCIgICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKy5cIiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIAorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKy5cIiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisuXCIgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorLlwiIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisuXCIgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisuXCIgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorLlwiIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisuXCIgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKy5cIiBEQU1BR0UuCisuXCIgJUVuZC1IZWFkZXIlCisuXCIgCisuXCIgQ3JlYXRlZCAgV2VkIE1hciAxMCAxNzo0MjoxMiAxOTk5LCBBbmRyZWFzIERpbGdlcgorLlRIIFVVSUQgMyAiQEUyRlNQUk9HU19NT05USEAgQEUyRlNQUk9HU19ZRUFSQCIgIkUyZnNwcm9ncyB2ZXJzaW9uIEBFMkZTUFJPR1NfVkVSU0lPTkAiCisuU0ggTkFNRQordXVpZCBcLSBEQ0UgY29tcGF0aWJsZSBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciBsaWJyYXJ5CisuU0ggU1lOT1BTSVMKKy5CICNpbmNsdWRlIDx1dWlkL3V1aWQuaD4KKy5TSCBERVNDUklQVElPTgorVGhlIFVVSUQgbGlicmFyeSBpcyB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBpZGVudGlmaWVycyBmb3Igb2JqZWN0cyAKK3RoYXQgbWF5IGJlIGFjY2Vzc2libGUgYmV5b25kIHRoZSBsb2NhbCBzeXN0ZW0uICBUaGlzIGxpYnJhcnkKK2dlbmVyYXRlcyBVVUlEcyBjb21wYXRpYmxlIHdpdGggdGhvc2UgY3JlYXRlZCBieSB0aGUgT3BlbiBTb2Z0d2FyZQorRm91bmRhdGlvbiAoT1NGKSBEaXN0cmlidXRlZCBDb21wdXRpbmcgRW52aXJvbm1lbnQgKERDRSkgdXRpbGl0eSAKKy5CUiB1dWlkZ2VuIC4KKy5zcAorVGhlIFVVSURzIGdlbmVyYXRlZCBieSB0aGlzIGxpYnJhcnkgY2FuIGJlIHJlYXNvbmFibHkgZXhwZWN0ZWQgdG8gYmUKK3VuaXF1ZSB3aXRoaW4gYSBzeXN0ZW0sIGFuZCB1bmlxdWUgYWNyb3NzIGFsbCBzeXN0ZW1zLiAgVGhleSBjb3VsZAorYmUgdXNlZCwgZm9yIGluc3RhbmNlLCB0byBnZW5lcmF0ZSB1bmlxdWUgSFRUUCBjb29raWVzIGFjcm9zcyBtdWx0aXBsZQord2ViIHNlcnZlcnMgd2l0aG91dCBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHNlcnZlcnMsIGFuZCB3aXRob3V0IGZlYXIKK29mIGEgbmFtZSBjbGFzaC4KKy5TSCAiQ09ORk9STUlORyBUTyIKK09TRiBEQ0UgMS4xCisuU0ggQVVUSE9SCitUaGVvZG9yZSBZLiBUcydvCisuU0ggQVZBSUxBQklMSVRZCitUaGUgVVVJRCBsaWJyYXJ5IGlzIHBhcnQgb2YgdGhlIGUyZnNwcm9ncyBwYWNrYWdlIGFuZCBpcyBhdmFpbGFibGUgZnJvbQorLlVSIGh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworaHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQvCisuVUUKKy5TSCAiU0VFIEFMU08iCisuQlIgdXVpZF9jbGVhciAoMyksCisuQlIgdXVpZF9jb21wYXJlICgzKSwKKy5CUiB1dWlkX2NvcHkgKDMpLAorLkJSIHV1aWRfZ2VuZXJhdGUgKDMpLAorLkJSIHV1aWRfaXNfbnVsbCAoMyksCisuQlIgdXVpZF9wYXJzZSAoMyksCisuQlIgdXVpZF90aW1lICgzKSwKKy5CUiB1dWlkX3VucGFyc2UgKDMpCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWQuaC5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZC5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWQuaC5pbgpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIFB1YmxpYyBpbmNsdWRlIGZpbGUgZm9yIHRoZSBVVUlEIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaWZuZGVmIF9VVUlEX1VVSURfSAorI2RlZmluZSBfVVVJRF9VVUlEX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGltZS5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdXVpZF90WzE2XTsKKworLyogVVVJRCBWYXJpYW50IGRlZmluaXRpb25zICovCisjZGVmaW5lIFVVSURfVkFSSUFOVF9OQ1MgCTAKKyNkZWZpbmUgVVVJRF9WQVJJQU5UX0RDRSAJMQorI2RlZmluZSBVVUlEX1ZBUklBTlRfTUlDUk9TT0ZUCTIKKyNkZWZpbmUgVVVJRF9WQVJJQU5UX09USEVSCTMKKworLyogVVVJRCBUeXBlIGRlZmluaXRpb25zICovCisjZGVmaW5lIFVVSURfVFlQRV9EQ0VfVElNRSAgIDEKKyNkZWZpbmUgVVVJRF9UWVBFX0RDRV9SQU5ET00gNAorCisvKiBBbGxvdyBVVUlEIGNvbnN0YW50cyB0byBiZSBkZWZpbmVkICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVVVJRF9ERUZJTkUobmFtZSx1MCx1MSx1Mix1Myx1NCx1NSx1Nix1Nyx1OCx1OSx1MTAsdTExLHUxMix1MTMsdTE0LHUxNSkgXAorCXN0YXRpYyBjb25zdCB1dWlkX3QgbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgPSB7dTAsdTEsdTIsdTMsdTQsdTUsdTYsdTcsdTgsdTksdTEwLHUxMSx1MTIsdTEzLHUxNCx1MTV9CisjZWxzZQorI2RlZmluZSBVVUlEX0RFRklORShuYW1lLHUwLHUxLHUyLHUzLHU0LHU1LHU2LHU3LHU4LHU5LHUxMCx1MTEsdTEyLHUxMyx1MTQsdTE1KSBcCisJc3RhdGljIGNvbnN0IHV1aWRfdCBuYW1lID0ge3UwLHUxLHUyLHUzLHU0LHU1LHU2LHU3LHU4LHU5LHUxMCx1MTEsdTEyLHUxMyx1MTQsdTE1fQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogY2xlYXIuYyAqLwordm9pZCB1dWlkX2NsZWFyKHV1aWRfdCB1dSk7CisKKy8qIGNvbXBhcmUuYyAqLworaW50IHV1aWRfY29tcGFyZShjb25zdCB1dWlkX3QgdXUxLCBjb25zdCB1dWlkX3QgdXUyKTsKKworLyogY29weS5jICovCit2b2lkIHV1aWRfY29weSh1dWlkX3QgZHN0LCBjb25zdCB1dWlkX3Qgc3JjKTsKKworLyogZ2VuX3V1aWQuYyAqLwordm9pZCB1dWlkX2dlbmVyYXRlKHV1aWRfdCBvdXQpOwordm9pZCB1dWlkX2dlbmVyYXRlX3JhbmRvbSh1dWlkX3Qgb3V0KTsKK3ZvaWQgdXVpZF9nZW5lcmF0ZV90aW1lKHV1aWRfdCBvdXQpOworCisvKiBpc251bGwuYyAqLworaW50IHV1aWRfaXNfbnVsbChjb25zdCB1dWlkX3QgdXUpOworCisvKiBwYXJzZS5jICovCitpbnQgdXVpZF9wYXJzZShjb25zdCBjaGFyICppbiwgdXVpZF90IHV1KTsKKworLyogdW5wYXJzZS5jICovCit2b2lkIHV1aWRfdW5wYXJzZShjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCk7Cit2b2lkIHV1aWRfdW5wYXJzZV9sb3dlcihjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCk7Cit2b2lkIHV1aWRfdW5wYXJzZV91cHBlcihjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCk7CisKKy8qIHV1aWRfdGltZS5jICovCit0aW1lX3QgdXVpZF90aW1lKGNvbnN0IHV1aWRfdCB1dSwgc3RydWN0IHRpbWV2YWwgKnJldF90dik7CitpbnQgdXVpZF90eXBlKGNvbnN0IHV1aWRfdCB1dSk7CitpbnQgdXVpZF92YXJpYW50KGNvbnN0IHV1aWRfdCB1dSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVVVJRF9VVUlEX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZC5wYy5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTM4YTMyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiB1dWlkCitEZXNjcmlwdGlvbjogVW5pdmVyc2FsbHkgdW5pcXVlIGlkIGxpYnJhcnkKK1ZlcnNpb246IEBFMkZTUFJPR1NfVkVSU0lPTkAKK1JlcXVpcmVzOiAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9L3V1aWQKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdXVpZApkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkUC5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTdiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRQLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIHV1aWQuaCAtLSBwcml2YXRlIGhlYWRlciBmaWxlIGZvciB1dWlkcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1dWlkL3V1aWRfdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXVpZC91dWlkLmg+CisKKy8qCisgKiBPZmZzZXQgYmV0d2VlbiAxNS1PY3QtMTU4MiBhbmQgMS1KYW4tNzAKKyAqLworI2RlZmluZSBUSU1FX09GRlNFVF9ISUdIIDB4MDFCMjFERDIKKyNkZWZpbmUgVElNRV9PRkZTRVRfTE9XICAweDEzODE0MDAwCisKK3N0cnVjdCB1dWlkIHsKKwl1aW50MzJfdAl0aW1lX2xvdzsKKwl1aW50MTZfdAl0aW1lX21pZDsKKwl1aW50MTZfdAl0aW1lX2hpX2FuZF92ZXJzaW9uOworCXVpbnQxNl90CWNsb2NrX3NlcTsKKwl1aW50OF90CW5vZGVbNl07Cit9OworCisKKy8qCisgKiBwcm90b3R5cGVzCisgKi8KK3ZvaWQgdXVpZF9wYWNrKGNvbnN0IHN0cnVjdCB1dWlkICp1dSwgdXVpZF90IHB0cik7Cit2b2lkIHV1aWRfdW5wYWNrKGNvbnN0IHV1aWRfdCBpbiwgc3RydWN0IHV1aWQgKnV1KTsKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9jbGVhci4zLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX2NsZWFyLjMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkMmJmMgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9jbGVhci4zLmluCkBAIC0wLDAgKzEsNjAgQEAKKy5cIiBDb3B5cmlnaHQgMTk5OSBBbmRyZWFzIERpbGdlciAoYWRpbGdlckBlbmVsLnVjYWxnYXJ5LmNhKQorLlwiCisuXCIgJUJlZ2luLUhlYWRlciUKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisuXCIgICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKy5cIiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIAorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKy5cIiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisuXCIgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorLlwiIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisuXCIgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisuXCIgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorLlwiIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisuXCIgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKy5cIiBEQU1BR0UuCisuXCIgJUVuZC1IZWFkZXIlCisuXCIgCisuXCIgQ3JlYXRlZCAgV2VkIE1hciAxMCAxNzo0MjoxMiAxOTk5LCBBbmRyZWFzIERpbGdlcgorLlRIIFVVSURfQ0xFQVIgMyAiQEUyRlNQUk9HU19NT05USEAgQEUyRlNQUk9HU19ZRUFSQCIgIkUyZnNwcm9ncyB2ZXJzaW9uIEBFMkZTUFJPR1NfVkVSU0lPTkAiCisuU0ggTkFNRQordXVpZF9jbGVhciBcLSByZXNldCB2YWx1ZSBvZiBVVUlEIHZhcmlhYmxlIHRvIHRoZSBOVUxMIHZhbHVlCisuU0ggU1lOT1BTSVMKKy5uZgorLkIgI2luY2x1ZGUgPHV1aWQvdXVpZC5oPgorLnNwCisuQkkgInZvaWQgdXVpZF9jbGVhcih1dWlkX3QgIiB1dSApOworLmZpCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkIgdXVpZF9jbGVhcgorZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN1cHBsaWVkIHV1aWQgdmFyaWFibGUKKy5JIHV1Cit0byB0aGUgTlVMTCB2YWx1ZS4KKy5TSCBBVVRIT1IKK1RoZW9kb3JlIFkuIFRzJ28KKy5TSCBBVkFJTEFCSUxJVFkKKy5VUiBodHRwOi8vZTJmc3Byb2dzLnNvdXJjZWZvcmdlLm5ldC8KK2h0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworLlVFCisuU0ggIlNFRSBBTFNPIgorLkJSIHV1aWQgKDMpLAorLkJSIHV1aWRfY29tcGFyZSAoMyksCisuQlIgdXVpZF9jb3B5ICgzKSwKKy5CUiB1dWlkX2dlbmVyYXRlICgzKSwKKy5CUiB1dWlkX2lzX251bGwgKDMpLAorLkJSIHV1aWRfcGFyc2UgKDMpLAorLkJSIHV1aWRfdW5wYXJzZSAoMykKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9jb21wYXJlLjMuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRfY29tcGFyZS4zLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzI5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRfY29tcGFyZS4zLmluCkBAIC0wLDAgKzEsNjYgQEAKKy5cIiBDb3B5cmlnaHQgMTk5OSBBbmRyZWFzIERpbGdlciAoYWRpbGdlckBlbmVsLnVjYWxnYXJ5LmNhKQorLlwiCisuXCIgJUJlZ2luLUhlYWRlciUKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisuXCIgICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKy5cIiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIAorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKy5cIiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisuXCIgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorLlwiIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisuXCIgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisuXCIgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorLlwiIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisuXCIgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKy5cIiBEQU1BR0UuCisuXCIgJUVuZC1IZWFkZXIlCisuXCIgCisuXCIgQ3JlYXRlZCAgV2VkIE1hciAxMCAxNzo0MjoxMiAxOTk5LCBBbmRyZWFzIERpbGdlcgorLlRIIFVVSURfQ09NUEFSRSAzICJARTJGU1BST0dTX01PTlRIQCBARTJGU1BST0dTX1lFQVJAIiAiRTJmc3Byb2dzIHZlcnNpb24gQEUyRlNQUk9HU19WRVJTSU9OQCIKKy5TSCBOQU1FCit1dWlkX2NvbXBhcmUgXC0gY29tcGFyZSB3aGV0aGVyIHR3byBVVUlEcyBhcmUgdGhlIHNhbWUKKy5TSCBTWU5PUFNJUworLm5mCisuQiAjaW5jbHVkZSA8dXVpZC91dWlkLmg+Cisuc3AKKy5CSSAiaW50IHV1aWRfY29tcGFyZSh1dWlkX3QgIiB1dTEgIiwgdXVpZF90ICIgdXUyKQorLmZpCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkIgdXVpZF9jb21wYXJlCitmdW5jdGlvbiBjb21wYXJlcyB0aGUgdHdvIHN1cHBsaWVkIHV1aWQgdmFyaWFibGVzCisuSVIgdXUxICIgYW5kICIgdXUyCit0byBlYWNoIG90aGVyLgorLlNIIFJFVFVSTiBWQUxVRQorUmV0dXJucyBhbiBpbnRlZ2VyIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIAorLkkgdXUxCitpcyBmb3VuZCwgIHJlc3BlY3RpdmVseSwgdG8gYmUgbGV4aWdyYXBoaWNhbGx5IGxlc3MgdGhhbiwgZXF1YWwsIG9yIAorZ3JlYXRlciB0aGFuIAorLklSIHV1MiAuCisuU0ggQVVUSE9SCitUaGVvZG9yZSBZLiBUcydvCisuU0ggQVZBSUxBQklMSVRZCisuVVIgaHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQvCitodHRwOi8vZTJmc3Byb2dzLnNvdXJjZWZvcmdlLm5ldC8KKy5VRQorLlNIICJTRUUgQUxTTyIKKy5CUiB1dWlkICgzKSwKKy5CUiB1dWlkX2NsZWFyICgzKSwKKy5CUiB1dWlkX2NvcHkgKDMpLAorLkJSIHV1aWRfZ2VuZXJhdGUgKDMpLAorLkJSIHV1aWRfaXNfbnVsbCAoMyksCisuQlIgdXVpZF9wYXJzZSAoMyksCisuQlIgdXVpZF91bnBhcnNlICgzKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX2NvcHkuMy5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9jb3B5LjMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1ZThjNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9jb3B5LjMuaW4KQEAgLTAsMCArMSw2MiBAQAorLlwiIENvcHlyaWdodCAxOTk5IEFuZHJlYXMgRGlsZ2VyIChhZGlsZ2VyQGVuZWwudWNhbGdhcnkuY2EpCisuXCIKKy5cIiAlQmVnaW4tSGVhZGVyJQorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKy5cIiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorLlwiICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorLlwiIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKy5cIiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisuXCIgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKy5cIiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKy5cIiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisuXCIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKy5cIiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorLlwiIERBTUFHRS4KKy5cIiAlRW5kLUhlYWRlciUKKy5cIiAKKy5cIiBDcmVhdGVkICBXZWQgTWFyIDEwIDE3OjQyOjEyIDE5OTksIEFuZHJlYXMgRGlsZ2VyCisuVEggVVVJRF9DT1BZIDMgIkBFMkZTUFJPR1NfTU9OVEhAIEBFMkZTUFJPR1NfWUVBUkAiICJFMmZzcHJvZ3MgdmVyc2lvbiBARTJGU1BST0dTX1ZFUlNJT05AIgorLlNIIE5BTUUKK3V1aWRfY29weSBcLSBjb3B5IGEgVVVJRCB2YWx1ZQorLlNIIFNZTk9QU0lTCisubmYKKy5CICNpbmNsdWRlIDx1dWlkL3V1aWQuaD4KKy5zcAorLkJJICJ2b2lkIHV1aWRfY29weSh1dWlkX3QgIiBkc3QgIiwgdXVpZF90ICIgc3JjKTsKKy5maQorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIHV1aWRfY29weQorZnVuY3Rpb24gY29waWVzIHRoZSBVVUlEIHZhcmlhYmxlCisuSVIgc3JjICIgdG8gIiBkc3QgLgorLlNIIFJFVFVSTiBWQUxVRQorVGhlIGNvcGllZCBVVUlEIGlzIHJldHVybmVkIGluIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5CisuSVIgZHN0IC4KKy5TSCBBVVRIT1IKK1RoZW9kb3JlIFkuIFRzJ28KKy5TSCBBVkFJTEFCSUxJVFkKKy5VUiBodHRwOi8vZTJmc3Byb2dzLnNvdXJjZWZvcmdlLm5ldC8KK2h0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworLlVFCisuU0ggIlNFRSBBTFNPIgorLkJSIHV1aWQgKDMpLAorLkJSIHV1aWRfY2xlYXIgKDMpLAorLkJSIHV1aWRfY29tcGFyZSAoMyksCisuQlIgdXVpZF9nZW5lcmF0ZSAoMyksCisuQlIgdXVpZF9pc19udWxsICgzKSwKKy5CUiB1dWlkX3BhcnNlICgzKSwKKy5CUiB1dWlkX3VucGFyc2UgKDMpCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRfZ2VuZXJhdGUuMy5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9nZW5lcmF0ZS4zLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OGUwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRfZ2VuZXJhdGUuMy5pbgpAQCAtMCwwICsxLDEwNCBAQAorLlwiIENvcHlyaWdodCAxOTk5IEFuZHJlYXMgRGlsZ2VyIChhZGlsZ2VyQGVuZWwudWNhbGdhcnkuY2EpCisuXCIKKy5cIiAlQmVnaW4tSGVhZGVyJQorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKy5cIiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorLlwiICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorLlwiIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKy5cIiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisuXCIgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKy5cIiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKy5cIiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisuXCIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKy5cIiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorLlwiIERBTUFHRS4KKy5cIiAlRW5kLUhlYWRlciUKKy5cIiAKKy5cIiBDcmVhdGVkICBXZWQgTWFyIDEwIDE3OjQyOjEyIDE5OTksIEFuZHJlYXMgRGlsZ2VyCisuVEggVVVJRF9HRU5FUkFURSAzICJARTJGU1BST0dTX01PTlRIQCBARTJGU1BST0dTX1lFQVJAIiAiRTJmc3Byb2dzIHZlcnNpb24gQEUyRlNQUk9HU19WRVJTSU9OQCIKKy5TSCBOQU1FCit1dWlkX2dlbmVyYXRlLCB1dWlkX2dlbmVyYXRlX3JhbmRvbSwgdXVpZF9nZW5lcmF0ZV90aW1lIFwtIGNyZWF0ZSBhIG5ldyB1bmlxdWUgVVVJRCB2YWx1ZQorLlNIIFNZTk9QU0lTCisubmYKKy5CICNpbmNsdWRlIDx1dWlkL3V1aWQuaD4KKy5zcAorLkJJICJ2b2lkIHV1aWRfZ2VuZXJhdGUodXVpZF90ICIgb3V0ICk7CisuQkkgInZvaWQgdXVpZF9nZW5lcmF0ZV9yYW5kb20odXVpZF90ICIgb3V0ICk7CisuQkkgInZvaWQgdXVpZF9nZW5lcmF0ZV90aW1lKHV1aWRfdCAiIG91dCApOworLmZpCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkIgdXVpZF9nZW5lcmF0ZQorZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciAoVVVJRCkuICBUaGUgdXVpZCB3aWxsCitiZSBnZW5lcmF0ZWQgYmFzZWQgb24gaGlnaC1xdWFsaXR5IHJhbmRvbW5lc3MgZnJvbSAKKy5JUiAvZGV2L3VyYW5kb20gLCAKK2lmIGF2YWlsYWJsZS4gIElmIGl0IGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gCisuQiB1dWlkX2dlbmVyYXRlIAord2lsbCB1c2UgYW4gYWx0ZXJuYXRpdmUgYWxnb3JpdGhtIHdoaWNoIHVzZXMgdGhlIGN1cnJlbnQgdGltZSwgdGhlCitsb2NhbCBldGhlcm5ldCBNQUMgYWRkcmVzcyAoaWYgYXZhaWxhYmxlKSwgYW5kIHJhbmRvbSBkYXRhIGdlbmVyYXRlZAordXNpbmcgYSBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRvci4KKy5zcAorVGhlIAorLkIgdXVpZF9nZW5lcmF0ZV9yYW5kb20KK2Z1bmN0aW9uIGZvcmNlcyB0aGUgdXNlIG9mIHRoZSBhbGwtcmFuZG9tIFVVSUQgZm9ybWF0LCBldmVuIGlmCithIGhpZ2gtcXVhbGl0eSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoaS5lLiwgCisuSVIgL2Rldi91cmFuZG9tICkKK2lzIG5vdCBhdmFpbGFibGUsIGluIHdoaWNoIGNhc2UgYSBwc2V1ZG8tcmFuZG9tCitnZW5lcmF0b3Igd2lsbCBiZSBzdWJzaXR1dGVkLiAgTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYSBwc2V1ZG8tcmFuZG9tCitnZW5lcmF0b3IgbWF5IGNvbXByb21pc2UgdGhlIHVuaXF1ZW5lc3Mgb2YgVVVJRCdzCitnZW5lcmF0ZWQgaW4gdGhpcyBmYXNoaW9uLgorLnNwCitUaGUKKy5CIHV1aWRfZ2VuZXJhdGVfdGltZSAKK2Z1bmN0aW9uIGZvcmNlcyB0aGUgdXNlIG9mIHRoZSBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gd2hpY2ggdXNlcyB0aGUKK2N1cnJlbnQgdGltZSBhbmQgdGhlIGxvY2FsIGV0aGVybmV0IE1BQyBhZGRyZXNzIChpZiBhdmFpbGFibGUpLgorVGhpcyBhbGdvcml0aG0gdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBvbmUgdXNlZCB0byBnZW5lcmF0ZSBVVUlELCBidXQKK2JlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgZXRoZXJuZXQgTUFDIGFkZHJlc3MsIGl0IGNhbiBsZWFrCitpbmZvcm1hdGlvbiBhYm91dCB3aGVuIGFuZCB3aGVyZSB0aGUgVVVJRCB3YXMgZ2VuZXJhdGVkLiAgVGhpcyBjYW4gY2F1c2UKK3ByaXZhY3kgcHJvYmxlbXMgaW4gc29tZSBhcHBsaWNhdGlvbnMsIHNvIHRoZQorLkIgdXVpZF9nZW5lcmF0ZQorZnVuY3Rpb24gb25seSB1c2VzIHRoaXMgYWxnb3JpdGhtIGlmIGEgaGlnaC1xdWFsaXR5IHNvdXJjZSBvZgorcmFuZG9tbmVzcyBpcyBub3QgYXZhaWxhYmxlLiAgCisuc3AKK1RoZSBVVUlEIGlzIDE2IGJ5dGVzICgxMjggYml0cykgbG9uZywgd2hpY2ggZ2l2ZXMgYXBwcm94aW1hdGVseSAzLjR4MTBeMzgKK3VuaXF1ZSB2YWx1ZXMgKHRoZXJlIGFyZSBhcHByb3hpbWF0ZWx5IDEwXjgwIGVsZW1udGFyeSBwYXJ0aWNsZXMgaW4KK3RoZSB1bml2ZXJzZSBhY2NvcmRpbmcgdG8gQ2FybCBTYWdhbidzCisuSVIgQ29zbW9zICkuCitUaGUgbmV3IFVVSUQgY2FuIHJlYXNvbmFibHkgYmUgY29uc2lkZXJlZCB1bmlxdWUgYW1vbmcgYWxsIFVVSURzIGNyZWF0ZWQKK29uIHRoZSBsb2NhbCBzeXN0ZW0sIGFuZCBhbW9uZyBVVUlEcyBjcmVhdGVkIG9uIG90aGVyIHN5c3RlbXMgaW4gdGhlIHBhc3QKK2FuZCBpbiB0aGUgZnV0dXJlLgorLlNIIFJFVFVSTiBWQUxVRQorVGhlIG5ld2x5IGNyZWF0ZWQgVVVJRCBpcyByZXR1cm5lZCBpbiB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkKKy5JUiBvdXQgLgorLlNIICJDT05GT1JNSU5HIFRPIgorT1NGIERDRSAxLjEKKy5TSCBBVVRIT1IKK1RoZW9kb3JlIFkuIFRzJ28KKy5TSCBBVkFJTEFCSUxJVFkKKy5VUiBodHRwOi8vZTJmc3Byb2dzLnNvdXJjZWZvcmdlLm5ldC8KK2h0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworLlVFCisuU0ggIlNFRSBBTFNPIgorLkJSIHV1aWQgKDMpLAorLkJSIHV1aWRnZW4gKDEpLAorLkJSIHV1aWRfY2xlYXIgKDMpLAorLkJSIHV1aWRfY29tcGFyZSAoMyksCisuQlIgdXVpZF9jb3B5ICgzKSwKKy5CUiB1dWlkX2lzX251bGwgKDMpLAorLkJSIHV1aWRfcGFyc2UgKDMpLAorLkJSIHV1aWRfdGltZSAoMyksCisuQlIgdXVpZF91bnBhcnNlICgzKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX2lzX251bGwuMy5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9pc19udWxsLjMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0Mjg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9pc19udWxsLjMuaW4KQEAgLTAsMCArMSw2MiBAQAorLlwiIENvcHlyaWdodCAxOTk5IEFuZHJlYXMgRGlsZ2VyIChhZGlsZ2VyQGVuZWwudWNhbGdhcnkuY2EpCisuXCIKKy5cIiAlQmVnaW4tSGVhZGVyJQorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKy5cIiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorLlwiICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorLlwiIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKy5cIiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisuXCIgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKy5cIiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKy5cIiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisuXCIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKy5cIiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorLlwiIERBTUFHRS4KKy5cIiAlRW5kLUhlYWRlciUKKy5cIiAKKy5cIiBDcmVhdGVkICBXZWQgTWFyIDEwIDE3OjQyOjEyIDE5OTksIEFuZHJlYXMgRGlsZ2VyCisuVEggVVVJRF9JU19OVUxMIDMgIkBFMkZTUFJPR1NfTU9OVEhAIEBFMkZTUFJPR1NfWUVBUkAiICJFMmZzcHJvZ3MgdmVyc2lvbiBARTJGU1BST0dTX1ZFUlNJT05AIgorLlNIIE5BTUUKK3V1aWRfaXNfbnVsbCBcLSBjb21wYXJlIHRoZSB2YWx1ZSBvZiB0aGUgVVVJRCB0byB0aGUgTlVMTCB2YWx1ZQorLlNIIFNZTk9QU0lTCisubmYKKy5CICNpbmNsdWRlIDx1dWlkL3V1aWQuaD4KKy5zcAorLkJJICJpbnQgdXVpZF9pc19udWxsKHV1aWRfdCAiIHV1ICk7CisuZmkKKy5TSCBERVNDUklQVElPTgorVGhlCisuQiB1dWlkX2lzX251bGwKK2Z1bmN0aW9uIGNvbXBhcmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3VwcGxpZWQgVVVJRCB2YXJpYWJsZQorLkkgdXUKK3RvIHRoZSBOVUxMIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBOVUxMIFVVSUQsIDEgaXMgcmV0dXJuZWQsCitvdGhlcndpc2UgMCBpcyByZXR1cm5lZC4KKy5TSCBBVVRIT1IKK1RoZW9kb3JlIFkuIFRzJ28KKy5TSCBBVkFJTEFCSUxJVFkKKy5VUiBodHRwOi8vZTJmc3Byb2dzLnNvdXJjZWZvcmdlLm5ldC8KK2h0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworLlVFCisuU0ggIlNFRSBBTFNPIgorLkJSIHV1aWQgKDMpLAorLkJSIHV1aWRfY2xlYXIgKDMpLAorLkJSIHV1aWRfY29tcGFyZSAoMyksCisuQlIgdXVpZF9jb3B5ICgzKSwKKy5CUiB1dWlkX2dlbmVyYXRlICgzKSwKKy5CUiB1dWlkX3RpbWUgKDMpLAorLkJSIHV1aWRfcGFyc2UgKDMpLAorLkJSIHV1aWRfdW5wYXJzZSAoMykKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9wYXJzZS4zLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX3BhcnNlLjMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1YWNmYQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF9wYXJzZS4zLmluCkBAIC0wLDAgKzEsNzEgQEAKKy5cIiBDb3B5cmlnaHQgMTk5OSBBbmRyZWFzIERpbGdlciAoYWRpbGdlckBlbmVsLnVjYWxnYXJ5LmNhKQorLlwiCisuXCIgJUJlZ2luLUhlYWRlciUKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisuXCIgICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKy5cIiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIAorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKy5cIiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisuXCIgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorLlwiIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisuXCIgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisuXCIgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorLlwiIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisuXCIgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKy5cIiBEQU1BR0UuCisuXCIgJUVuZC1IZWFkZXIlCisuXCIgCisuXCIgQ3JlYXRlZCAgV2VkIE1hciAxMCAxNzo0MjoxMiAxOTk5LCBBbmRyZWFzIERpbGdlcgorLlRIIFVVSURfUEFSU0UgMyAiQEUyRlNQUk9HU19NT05USEAgQEUyRlNQUk9HU19ZRUFSQCIgIkUyZnNwcm9ncyB2ZXJzaW9uIEBFMkZTUFJPR1NfVkVSU0lPTkAiCisuU0ggTkFNRQordXVpZF9wYXJzZSBcLSBjb252ZXJ0IGFuIGlucHV0IFVVSUQgc3RyaW5nIGludG8gYmluYXJ5IHJlcHJlc2VudGF0aW9uCisuU0ggU1lOT1BTSVMKKy5uZgorLkIgI2luY2x1ZGUgPHV1aWQvdXVpZC5oPgorLnNwCisuQkkgImludCB1dWlkX3BhcnNlKCBjaGFyICoiIGluICIsIHV1aWRfdCAiIHV1ICk7CisuZmkKKy5TSCBERVNDUklQVElPTgorVGhlCisuQiB1dWlkX3BhcnNlCitmdW5jdGlvbiBjb252ZXJ0cyB0aGUgVVVJRCBzdHJpbmcgZ2l2ZW4gYnkKKy5JIGluCitpbnRvIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24uICBUaGUgaW5wdXQgVVVJRCBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybQorMWI0ZTI4YmFcLTJmYTFcLTExZDJcLTg4M2ZcLWI5YTc2MWJkZTNmYiAoaW4KKy5CUiBwcmludGYgKDMpCitmb3JtYXQgIiUwOHhcLSUwNHhcLSUwNHhcLSUwNHhcLSUwMTJ4IiwgMzYgYnl0ZXMgcGx1cyB0aGUgdHJhaWxpbmcgJ1xcMCcpLgorLlNIIFJFVFVSTiBWQUxVRQorVXBvbiBzdWNjZXNzZnVsbHkgcGFyc2luZyB0aGUgaW5wdXQgc3RyaW5nLCAwIGlzIHJldHVybmVkLCBhbmQgdGhlIFVVSUQgaXMKK3N0b3JlZCBpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieQorLklSIHV1ICwKK290aGVyd2lzZSBcLTEgaXMgcmV0dXJuZWQuCisuU0ggIkNPTkZPUk1JTkcgVE8iCitPU0YgRENFIDEuMQorLlNIIEFVVEhPUgorVGhlb2RvcmUgWS4gVHMnbworLlNIIEFWQUlMQUJJTElUWQorLlVSIGh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworaHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQvCisuVUUKKy5TSCAiU0VFIEFMU08iCisuQlIgdXVpZCAoMyksCisuQlIgdXVpZF9jbGVhciAoMyksCisuQlIgdXVpZF9jb21wYXJlICgzKSwKKy5CUiB1dWlkX2NvcHkgKDMpLAorLkJSIHV1aWRfZ2VuZXJhdGUgKDMpLAorLkJSIHV1aWRfaXNfbnVsbCAoMyksCisuQlIgdXVpZF90aW1lICgzKSwKKy5CUiB1dWlkX3VucGFyc2UgKDMpCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRfdGltZS4zLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX3RpbWUuMy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTRjNzAwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX3RpbWUuMy5pbgpAQCAtMCwwICsxLDc0IEBACisuXCIgQ29weXJpZ2h0IDE5OTkgQW5kcmVhcyBEaWxnZXIgKGFkaWxnZXJAZW5lbC51Y2FsZ2FyeS5jYSkKKy5cIgorLlwiICVCZWdpbi1IZWFkZXIlCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorLlwiICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisuXCIgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiAKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisuXCIgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQUxMIE9GCisuXCIgV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorLlwiIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKy5cIiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorLlwiIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorLlwiIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKy5cIiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy5cIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorLlwiIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisuXCIgREFNQUdFLgorLlwiICVFbmQtSGVhZGVyJQorLlwiIAorLlwiIENyZWF0ZWQgIFdlZCBNYXIgMTAgMTc6NDI6MTIgMTk5OSwgQW5kcmVhcyBEaWxnZXIKKy5USCBVVUlEX1RJTUUgMyAiQEUyRlNQUk9HU19NT05USEAgQEUyRlNQUk9HU19ZRUFSQCIgIkUyZnNwcm9ncyB2ZXJzaW9uIEBFMkZTUFJPR1NfVkVSU0lPTkAiCisuU0ggTkFNRQordXVpZF90aW1lIFwtIGV4dHJhY3QgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIFVVSUQgd2FzIGNyZWF0ZWQKKy5TSCBTWU5PUFNJUworLm5mCisuQiAjaW5jbHVkZSA8dXVpZC91dWlkLmg+Cisuc3AKKy5CSSAidGltZV90IHV1aWRfdGltZSh1dWlkX3QgIiB1dSAiLCBzdHJ1Y3QgdGltZXZhbCAqIiByZXRfdHYgKQorLmZpCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkIgdXVpZF90aW1lCitmdW5jdGlvbiBleHRyYWN0cyB0aGUgdGltZSBhdCB3aGljaCB0aGUgc3VwcGxpZWQgdGltZS1iYXNlZCBVVUlECisuSSB1dQord2FzIGNyZWF0ZWQuICBOb3RlIHRoYXQgdGhlIFVVSUQgY3JlYXRpb24gdGltZSBpcyBvbmx5IGVuY29kZWQgd2l0aGluIAorY2VydGFpbiB0eXBlcyBvZiBVVUlEcy4gIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgcmVhc29uYWJseSBleHBlY3QgdG8gCitleHRyYWN0IHRoZSBjcmVhdGlvbiB0aW1lIGZvciBVVUlEcyBjcmVhdGVkIHdpdGggdGhlIAorLkJSIHV1aWRfZ2VuZXJhdGVfdGltZSAoMykKK2Z1bmN0aW9uLiAgSXQgbWF5IG9yIG1heSBub3Qgd29yayB3aXRoIFVVSURzIGNyZWF0ZWQgYnkgb3RoZXIgbWVjaGFuaXNtcy4KKy5TSCAiUkVUVVJOIFZBTFVFUyIKK1RoZSB0aW1lIGF0IHdoaWNoIHRoZSBVVUlEIHdhcyBjcmVhdGVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCBHTVQKKyh0aGUgZXBvY2gpLCBpcyByZXR1cm5lZCAoc2VlCisuQlIgdGltZSAiKDIpKS4iCitUaGUgdGltZSBhdCB3aGljaCB0aGUgVVVJRCB3YXMgY3JlYXRlZCwgaW4gc2Vjb25kcyBhbmQgbWljcm9zZWNvbmRzIHNpbmNlCit0aGUgZXBvY2gsIGlzIGFsc28gc3RvcmVkIGluIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5CisuSSByZXRfdHYKKyhzZWUKKy5CUiBnZXR0aW1lb2ZkYXkgIigyKSkuIgorLlNIIEFVVEhPUgorVGhlb2RvcmUgWS4gVHMnbworLlNIIEFWQUlMQUJJTElUWQorLlVSIGh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworaHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQvCisuVUUKKy5TSCAiU0VFIEFMU08iCisuQlIgdXVpZCAoMyksCisuQlIgdXVpZF9jbGVhciAoMyksCisuQlIgdXVpZF9jb21wYXJlICgzKSwKKy5CUiB1dWlkX2NvcHkgKDMpLAorLkJSIHV1aWRfZ2VuZXJhdGUgKDMpLAorLkJSIHV1aWRfaXNfbnVsbCAoMyksCisuQlIgdXVpZF9wYXJzZSAoMyksCisuQlIgdXVpZF91bnBhcnNlICgzKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX3RpbWUuYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ZjVjOQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF90aW1lLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiB1dWlkX3RpbWUuYyAtLS0gSW50ZXJwcmV0IHRoZSB0aW1lIGZpZWxkIGZyb20gYSB1dWlkLiAgVGhpcyBwcm9ncmFtCisgKiAJdmlvbGF0ZXMgdGhlIFVVSUQgYWJzdHJhY3Rpb24gYmFycmllciBieSByZWFjaGluZyBpbnRvIHRoZSBndXRzCisgKglvZiBhIFVVSUQgYW5kIGludGVycHJldGluZyBpdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIFVVSUQgTVlVVUlECisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInV1aWRQLmgiCisKK3RpbWVfdCB1dWlkX3RpbWUoY29uc3QgdXVpZF90IHV1LCBzdHJ1Y3QgdGltZXZhbCAqcmV0X3R2KQoreworCXN0cnVjdCB0aW1ldmFsCQl0djsKKwlzdHJ1Y3QgdXVpZAkJdXVpZDsKKwl1aW50MzJfdAkJaGlnaDsKKwl1aW50NjRfdAkJY2xvY2tfcmVnOworCisJdXVpZF91bnBhY2sodXUsICZ1dWlkKTsKKworCWhpZ2ggPSB1dWlkLnRpbWVfbWlkIHwgKCh1dWlkLnRpbWVfaGlfYW5kX3ZlcnNpb24gJiAweEZGRikgPDwgMTYpOworCWNsb2NrX3JlZyA9IHV1aWQudGltZV9sb3cgfCAoKHVpbnQ2NF90KSBoaWdoIDw8IDMyKTsKKworCWNsb2NrX3JlZyAtPSAoKCh1aW50NjRfdCkgMHgwMUIyMUREMikgPDwgMzIpICsgMHgxMzgxNDAwMDsKKwl0di50dl9zZWMgPSBjbG9ja19yZWcgLyAxMDAwMDAwMDsKKwl0di50dl91c2VjID0gKGNsb2NrX3JlZyAlIDEwMDAwMDAwKSAvIDEwOworCisJaWYgKHJldF90dikKKwkJKnJldF90diA9IHR2OworCisJcmV0dXJuIHR2LnR2X3NlYzsKK30KKworaW50IHV1aWRfdHlwZShjb25zdCB1dWlkX3QgdXUpCit7CisJc3RydWN0IHV1aWQJCXV1aWQ7CisKKwl1dWlkX3VucGFjayh1dSwgJnV1aWQpOworCXJldHVybiAoKHV1aWQudGltZV9oaV9hbmRfdmVyc2lvbiA+PiAxMikgJiAweEYpOworfQorCitpbnQgdXVpZF92YXJpYW50KGNvbnN0IHV1aWRfdCB1dSkKK3sKKwlzdHJ1Y3QgdXVpZAkJdXVpZDsKKwlpbnQJCQl2YXI7CisKKwl1dWlkX3VucGFjayh1dSwgJnV1aWQpOworCXZhciA9IHV1aWQuY2xvY2tfc2VxOworCisJaWYgKCh2YXIgJiAweDgwMDApID09IDApCisJCXJldHVybiBVVUlEX1ZBUklBTlRfTkNTOworCWlmICgodmFyICYgMHg0MDAwKSA9PSAwKQorCQlyZXR1cm4gVVVJRF9WQVJJQU5UX0RDRTsKKwlpZiAoKHZhciAmIDB4MjAwMCkgPT0gMCkKKwkJcmV0dXJuIFVVSURfVkFSSUFOVF9NSUNST1NPRlQ7CisJcmV0dXJuIFVVSURfVkFSSUFOVF9PVEhFUjsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqdmFyaWFudF9zdHJpbmcoaW50IHZhcmlhbnQpCit7CisJc3dpdGNoICh2YXJpYW50KSB7CisJY2FzZSBVVUlEX1ZBUklBTlRfTkNTOgorCQlyZXR1cm4gIk5DUyI7CisJY2FzZSBVVUlEX1ZBUklBTlRfRENFOgorCQlyZXR1cm4gIkRDRSI7CisJY2FzZSBVVUlEX1ZBUklBTlRfTUlDUk9TT0ZUOgorCQlyZXR1cm4gIk1pY3Jvc29mdCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJPdGhlciI7CisJfQorfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdXVpZF90CQlidWY7CisJdGltZV90CQl0aW1lX3JlZzsKKwlzdHJ1Y3QgdGltZXZhbAl0djsKKwlpbnQJCXR5cGUsIHZhcmlhbnQ7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIHV1aWRcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAodXVpZF9wYXJzZShhcmd2WzFdLCBidWYpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBVVUlEOiAlc1xuIiwgYXJndlsxXSk7CisJCWV4aXQoMSk7CisJfQorCXZhcmlhbnQgPSB1dWlkX3ZhcmlhbnQoYnVmKTsKKwl0eXBlID0gdXVpZF90eXBlKGJ1Zik7CisJdGltZV9yZWcgPSB1dWlkX3RpbWUoYnVmLCAmdHYpOworCisJcHJpbnRmKCJVVUlEIHZhcmlhbnQgaXMgJWQgKCVzKVxuIiwgdmFyaWFudCwgdmFyaWFudF9zdHJpbmcodmFyaWFudCkpOworCWlmICh2YXJpYW50ICE9IFVVSURfVkFSSUFOVF9EQ0UpIHsKKwkJcHJpbnRmKCJXYXJuaW5nOiBUaGlzIHByb2dyYW0gb25seSBrbm93cyBob3cgdG8gaW50ZXJwcmV0ICIKKwkJICAgICAgICJEQ0UgVVVJRHMuXG5cdFRoZSByZXN0IG9mIHRoZSBvdXRwdXQgaXMgbGlrZWx5ICIKKwkJICAgICAgICJ0byBiZSBpbmNvcnJlY3QhIVxuIik7CisJfQorCXByaW50ZigiVVVJRCB0eXBlIGlzICVkIiwgdHlwZSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAxOgorCQlwcmludGYoIiAodGltZSBiYXNlZClcbiIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXByaW50ZigiIChEQ0UpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwcmludGYoIiAobmFtZS1iYXNlZClcbiIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXByaW50ZigiIChyYW5kb20pXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJcbiIpOworCX0KKwlpZiAodHlwZSAhPSAxKSB7CisJCXByaW50ZigiV2FybmluZzogbm90IGEgdGltZS1iYXNlZCBVVUlELCBzbyBVVUlEIHRpbWUgIgorCQkgICAgICAgImRlY29kaW5nIHdpbGwgbGlrZWx5IG5vdCB3b3JrIVxuIik7CisJfQorCXByaW50ZigiVVVJRCB0aW1lIGlzOiAoJWxkLCAlbGQpOiAlc1xuIiwgdHYudHZfc2VjLCB0di50dl91c2VjLAorCSAgICAgICBjdGltZSgmdGltZV9yZWcpKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRfdHlwZXMuaC5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF90eXBlcy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMWZmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRfdHlwZXMuaC5pbgpAQCAtMCwwICsxLDUwIEBACisvKiAKKyAqIElmIGxpbnV4L3R5cGVzLmggaXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLCBhc3N1bWUgaXQgaGFzIGRlZmluZWQKKyAqIGV2ZXJ5dGhpbmcgd2UgbmVlZC4gIChjcm9zcyBmaW5nZXJzKSAgT3RoZXIgaGVhZGVyIGZpbGVzIG1heSBoYXZlIAorICogYWxzbyBkZWZpbmVkIHRoZSB0eXBlcyB0aGF0IHdlIG5lZWQuCisgKi8KKyNpZiAoIWRlZmluZWQoX1NURElOVF9IKSAmJiAhZGVmaW5lZChfVVVJRF9TVERJTlRfSCkpCisjZGVmaW5lIF9VVUlEX1NURElOVF9ICisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7CisKKyNpZiAoQFNJWkVPRl9JTlRAID09IDgpCit0eXBlZGVmIGludAkJaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXVpbnQ2NF90OworI2VsaWYgKEBTSVpFT0ZfTE9OR0AgPT0gOCkKK3R5cGVkZWYgbG9uZwkJaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwl1aW50NjRfdDsKKyNlbGlmIChAU0laRU9GX0xPTkdfTE9OR0AgPT0gOCkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQordHlwZWRlZiBfX3NpZ25lZF9fIGxvbmcgbG9uZyAJaW50NjRfdDsKKyNlbHNlCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgCWludDY0X3Q7CisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCXVpbnQ2NF90OworI2VuZGlmCisKKyNpZiAoQFNJWkVPRl9JTlRAID09IDIpCit0eXBlZGVmCWludAkJaW50MTZfdDsKK3R5cGVkZWYJdW5zaWduZWQgaW50CXVpbnQxNl90OworI2VsaWYgKEBTSVpFT0ZfU0hPUlRAID09IDIpCit0eXBlZGVmCXNob3J0CQlpbnQxNl90OwordHlwZWRlZgl1bnNpZ25lZCBzaG9ydAl1aW50MTZfdDsKKyNlbHNlCisgID89PWVycm9yOiB1bmRlZmluZWQgMTYgYml0IHR5cGUKKyNlbmRpZgorCisjaWYgKEBTSVpFT0ZfSU5UQCA9PSA0KQordHlwZWRlZglpbnQJCWludDMyX3Q7Cit0eXBlZGVmCXVuc2lnbmVkIGludAl1aW50MzJfdDsKKyNlbGlmIChAU0laRU9GX0xPTkdAID09IDQpCit0eXBlZGVmCWxvbmcJCWludDMyX3Q7Cit0eXBlZGVmCXVuc2lnbmVkIGxvbmcJdWludDMyX3Q7CisjZWxpZiAoQFNJWkVPRl9TSE9SVEAgPT0gNCkKK3R5cGVkZWYJc2hvcnQJCWludDMyX3Q7Cit0eXBlZGVmCXVuc2lnbmVkIHNob3J0CXVpbnQzMl90OworI2Vsc2UKKyA/PT0gZXJyb3I6IHVuZGVmaW5lZCAzMiBiaXQgdHlwZQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkX3VucGFyc2UuMy5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF91bnBhcnNlLjMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4Mzg0NQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvbGliL3V1aWQvdXVpZF91bnBhcnNlLjMuaW4KQEAgLTAsMCArMSw3OSBAQAorLlwiIENvcHlyaWdodCAxOTk5IEFuZHJlYXMgRGlsZ2VyIChhZGlsZ2VyQGVuZWwudWNhbGdhcnkuY2EpCisuXCIKKy5cIiAlQmVnaW4tSGVhZGVyJQorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKy5cIiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorLlwiICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorLlwiIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKy5cIiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisuXCIgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKy5cIiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKy5cIiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisuXCIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisuXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKy5cIiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorLlwiIERBTUFHRS4KKy5cIiAlRW5kLUhlYWRlciUKKy5cIiAKKy5cIiBDcmVhdGVkICBXZWQgTWFyIDEwIDE3OjQyOjEyIDE5OTksIEFuZHJlYXMgRGlsZ2VyCisuVEggVVVJRF9VTlBBUlNFIDMgIkBFMkZTUFJPR1NfTU9OVEhAIEBFMkZTUFJPR1NfWUVBUkAiICJFMmZzcHJvZ3MgdmVyc2lvbiBARTJGU1BST0dTX1ZFUlNJT05AIgorLlNIIE5BTUUKK3V1aWRfdW5wYXJzZSBcLSBjb252ZXJ0IGFuIFVVSUQgZnJvbSBiaW5hcnkgcmVwcmVzZW50YXRpb24gdG8gYSBzdHJpbmcKKy5TSCBTWU5PUFNJUworLm5mCisuQiAjaW5jbHVkZSA8dXVpZC91dWlkLmg+Cisuc3AKKy5CSSAidm9pZCB1dWlkX3VucGFyc2UodXVpZF90ICIgdXUgIiwgY2hhciAqIiBvdXQgKTsKKy5CSSAidm9pZCB1dWlkX3VucGFyc2VfdXBwZXIodXVpZF90ICIgdXUgIiwgY2hhciAqIiBvdXQgKTsKKy5CSSAidm9pZCB1dWlkX3VucGFyc2VfbG93ZXIodXVpZF90ICIgdXUgIiwgY2hhciAqIiBvdXQgKTsKKy5maQorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIHV1aWRfdW5wYXJzZQorZnVuY3Rpb24gY29udmVydHMgdGhlIHN1cHBsaWVkIFVVSUQKKy5JIHV1Citmcm9tIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaW50byBhIDM2XC1ieXRlIHN0cmluZyAocGx1cyB0YWlsaW5nICdcXDAnKQorb2YgdGhlIGZvcm0gMWI0ZTI4YmFcLTJmYTFcLTExZDJcLTg4M2ZcLTAwMTZkM2NjYTQyNyBhbmQgc3RvcmVzIHRoaXMgCit2YWx1ZSBpbiB0aGUgY2hhcmFjdGVyIHN0cmluZyBwb2ludGVkIHRvIGJ5CisuSVIgb3V0IC4gIAorVGhlIGNhc2Ugb2YgdGhlIGhleCBkaWdpdHMgcmV0dXJuZWQgYnkgCisuQiB1dWlkX3VucGFyc2UKK21heSBiZSB1cHBlciBvciBsb3dlciBjYXNlLCBhbmQgaXMKK2RlcGVuZGVudCBvbiB0aGUgc3lzdGVtLWRlcGVuZGVudCBsb2NhbCBkZWZhdWx0LiAgCisuUFAKK0lmIHRoZSBjYXNlIG9mIHRoZQoraGV4IGRpZ2l0cyBpcyBpbXBvcnRhbnQgdGhlbiB0aGUgZnVuY3Rpb25zCisuQiB1dWlkX3VucGFyc2VfdXBwZXIKK2FuZCAKKy5CIHV1aWRfdW5wYXJzZV9sb3dlcgorbWF5IGJlIHVzZWQuCisuU0ggIkNPTkZPUk1JTkcgVE8iCitPU0YgRENFIDEuMQorLlNIIEFVVEhPUgorVGhlb2RvcmUgWS4gVHMnbworLlNIIEFWQUlMQUJJTElUWQorLlVSIGh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworaHR0cDovL2UyZnNwcm9ncy5zb3VyY2Vmb3JnZS5uZXQvCisuVUUKKy5TSCAiU0VFIEFMU08iCisuQlIgdXVpZCAoMyksCisuQlIgdXVpZF9jbGVhciAoMyksCisuQlIgdXVpZF9jb21wYXJlICgzKSwKKy5CUiB1dWlkX2NvcHkgKDMpLAorLkJSIHV1aWRfZ2VuZXJhdGUgKDMpLAorLkJSIHV1aWRfdGltZSAoMyksCisuQlIgdXVpZF9pc19udWxsICgzKSwKKy5CUiB1dWlkX3BhcnNlICgzKQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkZC5oIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi9saWIvdXVpZC91dWlkZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MWY0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL2xpYi91dWlkL3V1aWRkLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIERlZmluaXRpb25zIHVzZWQgYnkgdGhlIHV1aWRkIGRhZW1vbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpZm5kZWYgX1VVSURfVVVJRERfSAorI2RlZmluZSBfVVVJRF9VVUlERF9ICisKKyNkZWZpbmUgVVVJRERfRElSCQkiL3Zhci9saWIvbGlidXVpZCIKKyNkZWZpbmUgVVVJRERfU09DS0VUX1BBVEgJVVVJRERfRElSICIvcmVxdWVzdCIKKyNkZWZpbmUgVVVJRERfUElERklMRV9QQVRICVVVSUREX0RJUiAiL3V1aWRkLnBpZCIKKyNkZWZpbmUgVVVJRERfUEFUSAkJIi91c3Ivc2Jpbi91dWlkZCIKKworI2RlZmluZSBVVUlERF9PUF9HRVRQSUQJCQkwCisjZGVmaW5lIFVVSUREX09QX0dFVF9NQVhPUAkJMQorI2RlZmluZSBVVUlERF9PUF9USU1FX1VVSUQJCTIKKyNkZWZpbmUgVVVJRERfT1BfUkFORE9NX1VVSUQJCTMKKyNkZWZpbmUgVVVJRERfT1BfQlVMS19USU1FX1VVSUQJCTQKKyNkZWZpbmUgVVVJRERfT1BfQlVMS19SQU5ET01fVVVJRAk1CisjZGVmaW5lIFVVSUREX01BWF9PUAkJCVVVSUREX09QX0JVTEtfUkFORE9NX1VVSUQKKworZXh0ZXJuIHZvaWQgdXVpZF9fZ2VuZXJhdGVfdGltZSh1dWlkX3Qgb3V0LCBpbnQgKm51bSk7CitleHRlcm4gdm9pZCB1dWlkX19nZW5lcmF0ZV9yYW5kb20odXVpZF90IG91dCwgaW50ICpudW0pOworCisjZW5kaWYgLyogX1VVSURfVVVJRF9IICovCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3V0aWwvTWFrZWZpbGUuaW4gYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3V0aWwvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkNzY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDU2IEBACisjCisjIFN0YW5kYXJkIGUyZnNwcm9ncyBwcm9sb2d1ZS4uLi4KKyMKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3RvcF9idWlsZGRpciA9IC4uCitteV9kaXIgPSB1dGlsCitJTlNUQUxMID0gQElOU1RBTExACisKK1NSQ1MgPSAkKHNyY2Rpcikvc3Vic3QuYworCitATUNPTkZJR0AKKworLmMubzoKKwkkKEUpICIJQ0MgJDwiCisJJChRKSAkKEJVSUxEX0NDKSAtYyAkKEJVSUxEX0NGTEFHUykgJDwgLW8gJEAKKworUFJPR1M9CQlzdWJzdAorCithbGw6OiAkKFBST0dTKSBnZW4tdGFyYmFsbAorCitzdWJzdDogc3Vic3QubworCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQlVJTERfQ0MpICQoQlVJTERfTERGTEFHUykgLW8gc3Vic3Qgc3Vic3QubworCitjb3B5X3NwYXJzZTogY29weV9zcGFyc2UubworCSQoRSkgIglMRCAkQCIKKwkkKFEpICQoQlVJTERfQ0MpICQoQlVJTERfTERGTEFHUykgLW8gY29weV9zcGFyc2UgY29weV9zcGFyc2UubworCitnZW4tdGFyYmFsbDogJChzcmNkaXIpL2dlbi10YXJiYWxsLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJJChFKSAiCUNPTkZJRy5TVEFUVVMgJEAiCisJJChRKSBjZCAkKHRvcF9idWlsZGRpcik7IENPTkZJR19GSUxFUz11dGlsL2dlbi10YXJiYWxsIC4vY29uZmlnLnN0YXR1cworCSQoUSkgY2htb2QgK3ggZ2VuLXRhcmJhbGwKKwordGFyYmFsbHM6IGdlbi10YXJiYWxsCisJc2ggZ2VuLXRhcmJhbGwgZGViaWFuCisJc2ggZ2VuLXRhcmJhbGwgYWxsCisJc2ggZ2VuLXRhcmJhbGwgc3Vic2V0CisKK2NsZWFuOgorCSQoUk0pIC1mICQoUFJPR1MpIFwjKiAqLnMgKi5vICouYSAqfiBjb3JlICoudGFyLmd6IGdlbi10YXJiYWxsIFwKKwkJY29weS1zcGFyc2UKKworbW9zdGx5Y2xlYW46IGNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwkkKFJNKSAtZiAuZGVwZW5kIE1ha2VmaWxlICQoc3JjZGlyKS9UQUdTICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5vbGQKKworIyArKysgRGVwZW5kZW5jeSBsaW5lIGVhdGVyICsrKworIyAKKyMgTWFrZWZpbGUgZGVwZW5kZW5jaWVzIGZvbGxvdy4gIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBzZWN0aW9uIGluCisjIHRoZSBNYWtlZmlsZS5pbiBmaWxlCisjCitzdWJzdC5vOiAkKHNyY2Rpcikvc3Vic3QuYwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL2FsbC5leGNsdWRlIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL2FsbC5leGNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDdmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3V0aWwvYWxsLmV4Y2x1ZGUKQEAgLTAsMCArMSwxNSBAQAorLmdpdAorLmhnCisuaGdpZ25vcmUKKy5wYworcGF0Y2hlcworUkVBRE1FLnN1YnNldAorYnVpbGQKK2J1aWxkLnN0YXRpYworcnBtLmxvZworVE9ETworcG93ZXJxdWVzdAorLmV4Y2x1ZGUtZmlsZQorcG8vc3RhbXAtY2F0LWlkCitwby9jYXQtaWQtdGJsLmMKK01ldGEKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9jb3B5X3NwYXJzZS5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL2NvcHlfc3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhYjI3MwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9jb3B5X3NwYXJzZS5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogY29weV9zcGFyc2UuYyAtLSBjb3B5IGEgdmVyeSBsYXJnZSBzcGFyc2UgZmlsZXMgZWZmaWNpZW50bHkKKyAqIAkocmVxdWlyZXMgcm9vdCBwcml2aWxlZ2VzKQorICoKKyAqIENvcHlyaWdodCAyMDAzLCAyMDA0IGJ5IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaWZuZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKHZvaWQpIHsKKyAgICBmcHV0cygiVGhpcyBwcm9ncmFtIGlzIG9ubHkgc3VwcG9ydGVkIG9uIExpbnV4IVxuIiwgc3RkZXJyKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisjZWxzZQorI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWZkZWYgSEFWRV9HRVRPUFRfSAorI2luY2x1ZGUgPGdldG9wdC5oPgorI2Vsc2UKK2V4dGVybiBjaGFyICpvcHRhcmc7CitleHRlcm4gaW50IG9wdGluZDsKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkLmg+CisKK2ludCB2ZXJib3NlID0gMDsKKworI2RlZmluZSBGSUJNQVAJICAgX0lPKDB4MDAsMSkJLyogYm1hcCBhY2Nlc3MgKi8KKyNkZWZpbmUgRklHRVRCU1ogICBfSU8oMHgwMCwyKQkvKiBnZXQgdGhlIGJsb2NrIHNpemUgdXNlZCBmb3IgYm1hcCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfYm1hcChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgYmxvY2spCit7CisJaW50CXJldDsKKwl1bnNpZ25lZCBsb25nIGI7CisKKwliID0gYmxvY2s7CisJcmV0ID0gaW9jdGwoZmQsIEZJQk1BUCwgJmIpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUEVSTSkgeworCQkJZnByaW50ZihzdGRlcnIsICJObyBwZXJtaXNzaW9uIHRvIHVzZSBGSUJNQVAgaW9jdGw7IG11c3QgaGF2ZSByb290IHByaXZpbGVnZXNcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlwZXJyb3IoIkZJQk1BUCIpOworCX0KKwlyZXR1cm4gYjsKK30KKworc3RhdGljIGludCBmdWxsX3JlYWQoaW50IGZkLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgZ290LCB0b3RhbCA9IDA7CisJaW50IHBhc3MgPSAwOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlnb3QgPSByZWFkKGZkLCBidWYsIGNvdW50KTsKKwkJaWYgKGdvdCA9PSAtMSkgeworCQkJaWYgKChlcnJubyA9PSBFSU5UUikgfHwgKGVycm5vID09IEVBR0FJTikpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gdG90YWwgPyB0b3RhbCA6IC0xOworCQl9CisJCWlmIChnb3QgPT0gMCkgeworCQkJaWYgKHBhc3MrKyA+PSAzKQorCQkJCXJldHVybiB0b3RhbDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBhc3MgPSAwOworCQlidWYgKz0gZ290OworCQl0b3RhbCArPSBnb3Q7CisJCWNvdW50IC09IGdvdDsKKwl9CisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3NwYXJzZV9maWxlKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc3RhdDY0CWZpbGVpbmZvOworCWxvbmcJCWxiLCBpLCBmZCwgb2ZkLCBicywgYmxvY2ssIG51bWJsb2NrczsKKwlzc2l6ZV90CQlnb3QsIGdvdDI7CisJb2ZmNjRfdAkJb2Zmc2V0ID0gMCwgc2hvdWxkX2JlOworCWNoYXIJCSpidWY7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKCJDb3B5aW5nIHNwYXJzZSBmaWxlIGZyb20gJXMgdG8gJXNcbiIsIHNyYywgZGVzdCk7CisKKwlpZiAoc3RyY21wKHNyYywgIi0iKSkgeworCQlpZiAoc3RhdDY0KHNyYywgJmZpbGVpbmZvKSA8IDApIHsKKwkJCXBlcnJvcigic3RhdCIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoIVNfSVNSRUcoZmlsZWluZm8uc3RfbW9kZSkpIHsKKwkJCXByaW50ZigiJXM6IE5vdCBhIHJlZ3VsYXIgZmlsZVxuIiwgc3JjKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJZmQgPSBvcGVuKHNyYywgT19SRE9OTFkgfCBPX0xBUkdFRklMRSk7CisJCWlmIChmZCA8IDApIHsKKwkJCXBlcnJvcigib3BlbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoaW9jdGwoZmQsIEZJR0VUQlNaLCAmYnMpIDwgMCkgeworCQkJcGVycm9yKCJGSUdFVEJTWiIpOworCQkJY2xvc2UoZmQpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoYnMgPCAwKSB7CisJCQlwcmludGYoIiVzOiBJbnZhbGlkIGJsb2NrIHNpemU6ICVsZFxuIiwgc3JjLCBicyk7CisJCQlleGl0KDEpOworCQl9CisJCWlmICh2ZXJib3NlKQorCQkJcHJpbnRmKCJCbG9ja3NpemUgb2YgZmlsZSAlcyBpcyAlbGRcbiIsIHNyYywgYnMpOworCQludW1ibG9ja3MgPSAoZmlsZWluZm8uc3Rfc2l6ZSArIChicy0xKSkgLyBiczsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoIkZpbGUgc2l6ZSBvZiAlcyBpcyAlbGxkICglbGQgYmxvY2tzKVxuIiwgc3JjLAorCQkJICAgICAgIChsb25nIGxvbmcpIGZpbGVpbmZvLnN0X3NpemUsIG51bWJsb2Nrcyk7CisJfSBlbHNlIHsKKwkJZmQgPSAwOworCQlicyA9IDEwMjQ7CisJfQorCisJb2ZkID0gb3BlbihkZXN0LCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkN8T19MQVJHRUZJTEUsIDA3NzcpOworCWlmIChvZmQgPCAwKSB7CisJCXBlcnJvcihkZXN0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlidWYgPSBtYWxsb2MoYnMpOworCWlmICghYnVmKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVyIik7CisJCWV4aXQoMSk7CisJfQorCisJZm9yIChsYiA9IDA7ICFmZCB8fCBsYiA8IG51bWJsb2NrczsgbGIrKykgeworCQlpZiAoZmQpIHsKKwkJCWJsb2NrID0gZ2V0X2JtYXAoZmQsIGxiKTsKKwkJCWlmICghYmxvY2spCisJCQkJY29udGludWU7CisJCQlzaG91bGRfYmUgPSAoKG9mZjY0X3QpIGxiKSAqIGJzOworCQkJaWYgKG9mZnNldCAhPSBzaG91bGRfYmUpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJpbnRmKCJTZWVraW5nIHRvICVsbGRcbiIsIHNob3VsZF9iZSk7CisJCQkJaWYgKGxzZWVrNjQoZmQsIHNob3VsZF9iZSwgU0VFS19TRVQpID09IChvZmZfdCkgLTEpIHsKKwkJCQkJcGVycm9yKCJsc2VlayBzcmMiKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQkJaWYgKGxzZWVrNjQob2ZkLCBzaG91bGRfYmUsIFNFRUtfU0VUKSA9PSAob2ZmX3QpIC0xKSB7CisJCQkJCXBlcnJvcigibHNlZWsgZGVzdCIpOworCQkJCQlleGl0KDEpOworCQkJCX0KKwkJCQlvZmZzZXQgPSBzaG91bGRfYmU7CisJCQl9CisJCX0KKwkJZ290ID0gZnVsbF9yZWFkKGZkLCBidWYsIGJzKTsKKworCQlpZiAoZmQgPT0gMCAmJiBnb3QgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChnb3QgPT0gYnMpIHsKKwkJCWZvciAoaT0wOyBpIDwgYnM7IGkrKykKKwkJCQlpZiAoYnVmW2ldKQorCQkJCQlicmVhazsKKwkJCWlmIChpID09IGJzKSB7CisJCQkJbHNlZWsob2ZkLCBicywgU0VFS19DVVIpOworCQkJCW9mZnNldCArPSBiczsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlnb3QyID0gd3JpdGUob2ZkLCBidWYsIGdvdCk7CisJCWlmIChnb3QgIT0gZ290MikgeworCQkJcHJpbnRmKCJzaG9ydCB3cml0ZVxuIik7CisJCQlleGl0KDEpOworCQl9CisJCW9mZnNldCArPSBnb3Q7CisJfQorCW9mZnNldCA9IGZpbGVpbmZvLnN0X3NpemU7CisJaWYgKGZzdGF0NjQob2ZkLCAmZmlsZWluZm8pIDwgMCkgeworCQlwZXJyb3IoImZzdGF0Iik7CisJCWV4aXQoMSk7CisJfQorCWlmIChmaWxlaW5mby5zdF9zaXplICE9IG9mZnNldCkgeworCQlsc2VlazY0KG9mZCwgb2Zmc2V0LTEsIFNFRUtfQ1VSKTsKKwkJYnVmWzBdID0gMDsKKwkJd3JpdGUob2ZkLCBidWYsIDEpOworCX0KKwljbG9zZShmZCk7CisJY2xvc2Uob2ZkKTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy12XSBzb3VyY2VfZmlsZSBkZXN0aW5hdGlvbl9maWxlXG4iLCBwcm9nbmFtZSk7CisJZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKmFyZ3YpCit7CisJaW50IGM7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgInYiKSkgIT0gRU9GKQorCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndic6CisJCQl2ZXJib3NlKys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJYnJlYWs7CisJCX0KKwlpZiAob3B0aW5kKzIgIT0gYXJnYykKKwkJdXNhZ2UoYXJndlswXSk7CisJY29weV9zcGFyc2VfZmlsZShhcmd2W29wdGluZF0sIGFyZ3Zbb3B0aW5kKzFdKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3V0aWwvZ2NjLXdhbGwtY2xlYW51cCBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9nY2Mtd2FsbC1jbGVhbnVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDhlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3V0aWwvZ2NjLXdhbGwtY2xlYW51cApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2VkIC1mCisjCisjIFRoaXMgc2NyaXB0IGZpbHRlcnMgb3V0IGdjYy13YWxsIGNydWQgdGhhdCB3ZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBzZWVpbmcuCisjCisvXmNjIC9kCisvXmtjYyAvZAorL15nY2MgL2QKKy9kb2VzIG5vdCBzdXBwb3J0IGBsb25nIGxvbmcnL2QKKy9mb3JiaWRzIGxvbmcgbG9uZyBpbnRlZ2VyIGNvbnN0YW50cy9kCisvZG9lcyBub3Qgc3VwcG9ydCB0aGUgYGxsJyBsZW5ndGggbW9kaWZpZXIvZAorL2RvZXMgbm90IHN1cHBvcnQgdGhlIGBsbCcgcHJpbnRmIGxlbmd0aCBtb2RpZmllci9kCisvQU5TSSBDIGZvcmJpZHMgbG9uZyBsb25nIGludGVnZXIgY29uc3RhbnRzL2QKKy90cmFkaXRpb25hbCBDIHJlamVjdHMgc3RyaW5nIGNvbmNhdGVuYXRpb24vZAorL2ludGVnZXIgY29uc3RhbnQgaXMgdW5zaWduZWQgaW4gQU5TSSBDLCBzaWduZWQgd2l0aCAtdHJhZGl0aW9uYWwvZAorL0F0IHRvcCBsZXZlbDovZAorL0luIGZpbGUgaW5jbHVkZWQgZnJvbS9kCisvSW4gZnVuY3Rpb24gYC4qJzovZAorL3plcm8tbGVuZ3RoIGZvcm1hdCBzdHJpbmcvZAorL3dhcm5pbmc6IG1pc3NpbmcgaW5pdGlhbGl6ZXIvZAorL3dhcm5pbmc6IChuZWFyIGluaXRpYWxpemF0aW9uIGZvci9kCisvXlsgCV0qZnJvbS9kCisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9nZW4tdGFyYmFsbC5pbiBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9nZW4tdGFyYmFsbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJmMTJjCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL2dlbi10YXJiYWxsLmluCkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9zaAorIworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkaXN0cmlidXRpb24gdGFyYmFsbAorIworc3JjZGlyPUBzcmNkaXJACit0b3Bfc3JjZGlyPUB0b3Bfc3JjZGlyQAordG9wX2Rpcj1gY2QgJHRvcF9zcmNkaXI7IHB3ZGAKK2Jhc2VfdmVyPWBlY2hvIEBFMkZTUFJPR1NfVkVSU0lPTkAgfCBzZWQgLWUgJ3MvLVdJUC8vJyAtZSAncy9wcmUtLy8nIC1lICdzLy1QTFVTLy8nYAorYmFzZV9lMmZzcHJvZ3M9YGJhc2VuYW1lICR0b3BfZGlyYAorZXhjbHVkZT0vdG1wL2V4Y2x1ZGUKK0daSVA9Z3ppcAorCisjCisjIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0ZXhpMmR2aSBibG93cyB1cCBob3JyaWJseSBpZiB0aGVyZSBhcmUgCisjIGFueSAnficgY2hyYWN0ZXJzIGluIHRoZSBkaXJlY3RvcnkgcGF0aG5hbWUuICBTbyB3ZSBrbHVkZ2UgYXJvdW5kIGl0IGJ5CisjIHVzaW5nIGEgbm9uLXN0YW5kYXJkIGRpcmVjdG9yeSBuYW1lIGZvciBXSVAgcmVsZWFzZXMuICBkcGtnLXNvdXJjZQorIyBjb21wbGFpbnMsIGJ1dCBsaWZlIGdvZXMgb24uCisjCitkZWJfcGtndmVyPWBlY2hvIEBFMkZTUFJPR1NfUEtHVkVSQCB8IHNlZCAtZSAncy9+Ly0vZydgCisgICAgCitjYXNlICQxIGluCisgICAgZGViaWFufHVidW50dSkKKwlTUkNST09UPSJlMmZzcHJvZ3MtJGRlYl9wa2d2ZXIiCisJcmVuYW1lX3RhcmJhbGw9ImUyZnNwcm9nc19ARTJGU1BST0dTX1BLR1ZFUkAub3JpZy50YXIuZ3oiCisJbGlzdD1hbGwKKwk7OworICAgIHN1YnNldCkKKwlTUkNST09UPSJlMmZzcHJvZ3MtbGlicy0kYmFzZV92ZXIiCisJbGlzdD1zdWJzZXQKKwk7OworICAgYWxsfCopCisJU1JDUk9PVD0iZTJmc3Byb2dzLSRiYXNlX3ZlciIKKwlsaXN0PWFsbAorCTs7Citlc2FjCisKK212IC4uL2UyZnNwcm9ncy5zcGVjICR0b3Bfc3JjZGlyL2UyZnNwcm9ncy5zcGVjCisoY2QgJHRvcF9zcmNkaXIvLi4gOyBmaW5kICRiYXNlX2UyZnNwcm9ncyBcKCAtbmFtZSBcKn4gLW8gLW5hbWUgXCoub3JpZyBcCisJCS1vIC1uYW1lIENWUyAtbyAtbmFtZSBcKi5yZWogLW8gLW5hbWUgTWFrZWZpbGUucHEgXAorCQktbyAtbmFtZSBUQUdTIC1vIC1uYW1lIFwqLm9sZCAtbyAtbmFtZSBTQ0NTIFwKKwkJLW8gLW5hbWUgY2hhbmdlZC1maWxlcyAtbyAtbmFtZSAuI1wqIC1vIC1uYW1lIFwqLnRhci5neiBcCisJCS1vIC1uYW1lIGF1dG9tNHRlLmNhY2hlIFwpIFwKKwkJLXByaW50KSB8IHNlZCAtZSAicy9eJGJhc2VfZTJmc3Byb2dzLyRTUkNST09ULyIgPiAkZXhjbHVkZQorc2VkIC1lICJzO147JFNSQ1JPT1QvOyIgPCAkc3JjZGlyLyRsaXN0LmV4Y2x1ZGUgPj4gJGV4Y2x1ZGUKKworKGNkICR0b3Bfc3JjZGlyLy4uIDsgcm0gLWYgJFNSQ1JPT1QgOyBsbiAtc2YgJGJhc2VfZTJmc3Byb2dzICRTUkNST09UKQorCisoY2QgJHRvcF9zcmNkaXIvLi4gOyB0YXIgLWMgLWggLXYgLWYgLSAtWCAkZXhjbHVkZSAkU1JDUk9PVCkgXAorCSB8ICRHWklQIC05IC1jID4gJFNSQ1JPT1QudGFyLmd6CiskR1pJUCAtbCAkU1JDUk9PVC50YXIuZ3oKKworKGNkICR0b3Bfc3JjZGlyLy4uIDsgcm0gLWYgJFNSQ1JPT1QpCittdiAkdG9wX3NyY2Rpci9lMmZzcHJvZ3Muc3BlYyAuLi9lMmZzcHJvZ3Muc3BlYyAKK2lmIHRlc3QgLW4gIiRyZW5hbWVfdGFyYmFsbCI7IHRoZW4KKyAgICBtdiAkU1JDUk9PVC50YXIuZ3ogJHJlbmFtZV90YXJiYWxsCitmaQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL2xpYmVjaG8uYyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9saWJlY2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyY2UxZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9saWJlY2hvLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIGxpYmVjaG8uYworICoKKyAqIEZvciBlYWNoIGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmUsIGVjaG8gaXQuICBTaG91bGQgZXhwYW5kCisgKiBET1Mgd2lsZGNhcmRzIGNvcnJlY3RseS4KKyAqCisgKiBTeW50YXg6IGxpYmVjaG8gWy1wIHByZWZpeF0gbGlzdC4uLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkIGVjaG9fZmlsZXMoY2hhciAqLCBjaGFyICopOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGk7CisgIGNoYXIgKnByZWZpeDsKKworICBwcmVmaXggPSAiIjsKKworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAgbGliZWNobyBbLXAgcHJlZml4XSBsaXN0Li4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGZvciAoaSA9IDEgOyBpIDwgYXJnYyA7IGkrKykKKyAgICBpZiAoIXN0cmljbXAoYXJndltpXSwgIi1wIikpCisgICAgICBwcmVmaXggPSBhcmd2WysraV07CisgICAgZWxzZQorICAgICAgZWNob19maWxlcyhwcmVmaXgsIGFyZ3ZbaV0pOworCisgIHJldHVybiAwOworfQorCit2b2lkCitlY2hvX2ZpbGVzKGNoYXIgKnByZWZpeCwgY2hhciAqZikKK3sKKyAgbG9uZyBmZjsKKyAgc3RydWN0IF9maW5kZGF0YV90IGZkdDsKKyAgY2hhciAqc2xhc2g7CisgIGNoYXIgZmlsZXBhdGhbMjU2XTsKKworICAvKgorICAgKiBXZSdyZSB1bml4IGJhc2VkIHF1aXRlIGEgYml0IGhlcmUuICBMb29rIGZvciBub3JtYWwgc2xhc2hlcyBhbmQKKyAgICogbWFrZSB0aGVtIHJldmVyc2Ugc2xhc2hlcy4KKyAgICovCisgIHdoaWxlKChzbGFzaCA9IHN0cnJjaHIoZiwgJy8nKSkgIT0gTlVMTCkKKyAgICAqc2xhc2ggPSAnXFwnOworCisgIHN0cmNweShmaWxlcGF0aCwgZik7CisKKyAgc2xhc2ggPSBzdHJyY2hyKGZpbGVwYXRoLCAnXFwnKTsKKworICBpZiAoc2xhc2gpIHsKKyAgICBzbGFzaCsrOworICAgICpzbGFzaCA9IDA7CisgIH0gZWxzZSB7CisgICAgZmlsZXBhdGhbMF0gPSAnXDAnOworICB9CisKKyAgZmYgPSBfZmluZGZpcnN0KGYsICZmZHQpOworCisgIGlmIChmZiA8IDApIHsKKyAgICBwcmludGYoIiVzJXNcbiIsIHByZWZpeCwgZik7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJpbnRmKCIlcyVzJXNcbiIsIHByZWZpeCwgZmlsZXBhdGgsIGZkdC5uYW1lKTsKKworICBmb3IgKDs7KSB7CisgICAgaWYgKF9maW5kbmV4dChmZiwgJmZkdCkgPCAwKQorICAgICAgYnJlYWs7CisgICAgcHJpbnRmKCIlcyVzJXNcbiIsIHByZWZpeCwgZmlsZXBhdGgsIGZkdC5uYW1lKTsKKyAgfQorICBfZmluZGNsb3NlKGZmKTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9zdWJzZXQuZXhjbHVkZSBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9zdWJzZXQuZXhjbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM4MzlkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL3N1YnNldC5leGNsdWRlCkBAIC0wLDAgKzEsMzUgQEAKKy5naXQKKy5oZworLmhnaWdub3JlCisucGMKK3BhdGNoZXMKK2J1aWxkCitidWlsZC5zdGF0aWMKK3JwbS5sb2cKK1RPRE8KK3Bvd2VycXVlc3QKKy5leGNsdWRlLXN1YnNldAorcG8vc3RhbXAtY2F0LWlkCitwby9jYXQtaWQtdGJsLmMKK01ldGEKK2UyZnNjaworZXh0MmVkCitkZWJ1Z2ZzCittaXNjCit0ZXN0cworcmVzaXplCitjb250cmliCitwbworaW5jbHVkZQorZGViaWFuCitsaWIvZTJwCitsaWIvZXZtcworbGliL2V4dDJmcworQUJPVVQtTkxTCitSRUFETUUKK0lOU1RBTEwKK0lOU1RBTEwuZGxsYmluCitJTlNUQUxMLmVsZmJpbgorUkVMRUFTRS1OT1RFUworZTJmc3Byb2dzLmxzbQorZTJmc3Byb2dzLnNwZWMKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9zdWJzdC5jIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL3N1YnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZjU0YgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9zdWJzdC5jCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogc3Vic3QuYyAtLS0gc3Vic3RpdHV0aW9uIHByb2dyYW0KKyAqCisgKiBTdWJzdCBpcyB1c2VkIGFzIGEgcXVpY2t5IHByb2dyYW0gdG8gZG8gQCBzdWJzdGl0dXRpb25zCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1dGltZS5oPgorCisjaWZkZWYgSEFWRV9HRVRPUFRfSAorI2luY2x1ZGUgPGdldG9wdC5oPgorI2Vsc2UKK2V4dGVybiBjaGFyICpvcHRhcmc7CitleHRlcm4gaW50IG9wdGluZDsKKyNlbmRpZgorCisKK3N0cnVjdCBzdWJzdF9lbnRyeSB7CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKKwlzdHJ1Y3Qgc3Vic3RfZW50cnkgKm5leHQ7Cit9OworCitzdHJ1Y3Qgc3Vic3RfZW50cnkgKnN1YnN0X3RhYmxlID0gMDsKKworc3RhdGljIGludCBhZGRfc3Vic3QoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpCit7CisJc3RydWN0IHN1YnN0X2VudHJ5CSplbnQgPSAwOworCWludAlyZXR2YWw7CisKKwlyZXR2YWwgPSBFTk9NRU07CisJZW50ID0gKHN0cnVjdCBzdWJzdF9lbnRyeSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdWJzdF9lbnRyeSkpOworCWlmICghZW50KQorCQlnb3RvIGZhaWw7CisJZW50LT5uYW1lID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKwlpZiAoIWVudC0+bmFtZSkKKwkJZ290byBmYWlsOworCWVudC0+dmFsdWUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHZhbHVlKSsxKTsKKwlpZiAoIWVudC0+dmFsdWUpCisJCWdvdG8gZmFpbDsKKwlzdHJjcHkoZW50LT5uYW1lLCBuYW1lKTsKKwlzdHJjcHkoZW50LT52YWx1ZSwgdmFsdWUpOworCWVudC0+bmV4dCA9IHN1YnN0X3RhYmxlOworCXN1YnN0X3RhYmxlID0gZW50OworCXJldHVybiAwOworZmFpbDoKKwlpZiAoZW50KSB7CisJCWZyZWUoZW50LT5uYW1lKTsKKwkJZnJlZShlbnQtPnZhbHVlKTsKKwkJZnJlZShlbnQpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IHN1YnN0X2VudHJ5ICpmZXRjaF9zdWJzdF9lbnRyeShjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdWJzdF9lbnRyeSAqZW50OworCisJZm9yIChlbnQgPSBzdWJzdF90YWJsZTsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJaWYgKHN0cmNtcChuYW1lLCBlbnQtPm5hbWUpID09IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGVudDsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlbWVudCBuYW1lLAorICogY2hlY2sgdG8gc2VlIGlmIGl0IGlzIHZhbGlkLCBhbmQgcHVsbCBpdCBvdXQgaWYgaXQgaXMuCisgKi8KK3N0YXRpYyBjaGFyICpnZXRfc3Vic3Rfc3ltYm9sKGNvbnN0IGNoYXIgKmJlZ2luLCBzaXplX3QgbGVuLCBjaGFyIHByZWZpeCkKK3sKKwlzdGF0aWMgY2hhciByZXBsYWNlX25hbWVbMTI4XTsKKwljaGFyICpjcCwgKnN0YXJ0OworCisJc3RhcnQgPSByZXBsYWNlX25hbWU7CisJaWYgKHByZWZpeCkKKwkJKnN0YXJ0KysgPSBwcmVmaXg7CisKKwlpZiAobGVuID4gc2l6ZW9mKHJlcGxhY2VfbmFtZSktMikKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KHN0YXJ0LCBiZWdpbiwgbGVuKTsKKwlzdGFydFtsZW5dID0gMDsKKworCS8qCisJICogVGhlIHN1YnN0aXR1dGlvbiB2YXJpYWJsZSBtdXN0IGFsbCBiZSBpbiB0aGUgb2YgWzAtOUEtWmEtel9dLgorCSAqIElmIGl0IGlzbid0LCB0aGlzIG11c3QgYmUgYW4gaW52YWxpZCBzeW1ib2wgbmFtZS4KKwkgKi8KKwlmb3IgKGNwID0gc3RhcnQ7ICpjcDsgY3ArKykgeworCQlpZiAoISgqY3AgPj0gJ2EnICYmICpjcCA8PSAneicpICYmCisJCSAgICAhKCpjcCA+PSAnQScgJiYgKmNwIDw9ICdaJykgJiYKKwkJICAgICEoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKSAmJgorCQkgICAgISgqY3AgPT0gJ18nKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHJlcGxhY2VfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcGxhY2Vfc3RyaW5nKGNoYXIgKmJlZ2luLCBjaGFyICplbmQsIGNoYXIgKm5ld3N0cikKK3sKKwlpbnQJcmVwbGFjZV9sZW4sIGxlbjsKKworCXJlcGxhY2VfbGVuID0gc3RybGVuKG5ld3N0cik7CisJbGVuID0gZW5kIC0gYmVnaW47CisJaWYgKHJlcGxhY2VfbGVuID09IDApCisJCW1lbW1vdmUoYmVnaW4sIGVuZCsxLCBzdHJsZW4oZW5kKSsxKTsKKwllbHNlIGlmIChyZXBsYWNlX2xlbiAhPSBsZW4rMSkKKwkJbWVtbW92ZShlbmQrKHJlcGxhY2VfbGVuLWxlbi0xKSwgZW5kLAorCQkJc3RybGVuKGVuZCkrMSk7CisJbWVtY3B5KGJlZ2luLCBuZXdzdHIsIHJlcGxhY2VfbGVuKTsKK30KKworc3RhdGljIHZvaWQgc3Vic3RpdHV0ZV9saW5lKGNoYXIgKmxpbmUpCit7CisJY2hhcgkqcHRyLCAqbmFtZV9wdHIsICplbmRfcHRyOworCXN0cnVjdCBzdWJzdF9lbnRyeSAqZW50OworCWNoYXIJKnJlcGxhY2VfbmFtZTsKKwlzaXplX3QJbGVuOworCisJLyoKKwkgKiBFeHBhbmQgYWxsIEBGT09AIHN1YnN0aXR1dGlvbnMKKwkgKi8KKwlwdHIgPSBsaW5lOworCXdoaWxlIChwdHIpIHsKKwkJbmFtZV9wdHIgPSBzdHJjaHIocHRyLCAnQCcpOworCQlpZiAoIW5hbWVfcHRyKQorCQkJYnJlYWs7CS8qIE5vIG1vcmUgKi8KKwkJaWYgKCooKytuYW1lX3B0cikgPT0gJ0AnKSB7CisJCQkvKgorCQkJICogSGFuZGxlIHR5dHNvQEBtaXQuZWR1IC0tPiB0eXRzb0BtaXQuZWR1CisJCQkgKi8KKwkJCW1lbW1vdmUobmFtZV9wdHItMSwgbmFtZV9wdHIsIHN0cmxlbihuYW1lX3B0cikrMSk7CisJCQlwdHIgPSBuYW1lX3B0cisxOworCQkJY29udGludWU7CisJCX0KKwkJZW5kX3B0ciA9IHN0cmNocihuYW1lX3B0ciwgJ0AnKTsKKwkJaWYgKCFlbmRfcHRyKQorCQkJYnJlYWs7CisJCWxlbiA9IGVuZF9wdHIgLSBuYW1lX3B0cjsKKwkJcmVwbGFjZV9uYW1lID0gZ2V0X3N1YnN0X3N5bWJvbChuYW1lX3B0ciwgbGVuLCAwKTsKKwkJaWYgKCFyZXBsYWNlX25hbWUpIHsKKwkJCXB0ciA9IG5hbWVfcHRyOworCQkJY29udGludWU7CisJCX0KKwkJZW50ID0gZmV0Y2hfc3Vic3RfZW50cnkocmVwbGFjZV9uYW1lKTsKKwkJaWYgKCFlbnQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5mb3VuZCBleHBhbnNpb246ICclcydcbiIsCisJCQkJcmVwbGFjZV9uYW1lKTsKKwkJCXB0ciA9IGVuZF9wdHIgKyAxOworCQkJY29udGludWU7CisJCX0KKyNpZiAwCisJCWZwcmludGYoc3RkZXJyLCAiUmVwbGFjZSBuYW1lID0gJyVzJyB3aXRoICclcydcbiIsCisJCSAgICAgICByZXBsYWNlX25hbWUsIGVudC0+dmFsdWUpOworI2VuZGlmCisJCXB0ciA9IG5hbWVfcHRyLTE7CisJCXJlcGxhY2Vfc3RyaW5nKHB0ciwgZW5kX3B0ciwgZW50LT52YWx1ZSk7CisJCWlmICgoZW50LT52YWx1ZVswXSA9PSAnQCcpICYmCisJCSAgICAoc3RybGVuKHJlcGxhY2VfbmFtZSkgPT0gc3RybGVuKGVudC0+dmFsdWUpLTIpICYmCisJCSAgICAhc3RybmNtcChyZXBsYWNlX25hbWUsIGVudC0+dmFsdWUrMSwKKwkJCSAgICAgc3RybGVuKGVudC0+dmFsdWUpLTIpKQorCQkJLyogYXZvaWQgYW4gaW5maW5pdGUgbG9vcCAqLworCQkJcHRyICs9IHN0cmxlbihlbnQtPnZhbHVlKTsKKwl9CisJLyoKKwkgKiBOb3cgZG8gYSBzZWNvbmQgcGFzcyB0byBleHBhbmQgJHtGT099CisJICovCisJcHRyID0gbGluZTsKKwl3aGlsZSAocHRyKSB7CisJCW5hbWVfcHRyID0gc3RyY2hyKHB0ciwgJyQnKTsKKwkJaWYgKCFuYW1lX3B0cikKKwkJCWJyZWFrOwkvKiBObyBtb3JlICovCisJCWlmICgqKCsrbmFtZV9wdHIpICE9ICd7JykgeworCQkJcHRyID0gbmFtZV9wdHI7CisJCQljb250aW51ZTsKKwkJfQorCQluYW1lX3B0cisrOworCQllbmRfcHRyID0gc3RyY2hyKG5hbWVfcHRyLCAnfScpOworCQlpZiAoIWVuZF9wdHIpCisJCQlicmVhazsKKwkJbGVuID0gZW5kX3B0ciAtIG5hbWVfcHRyOworCQlyZXBsYWNlX25hbWUgPSBnZXRfc3Vic3Rfc3ltYm9sKG5hbWVfcHRyLCBsZW4sICckJyk7CisJCWlmICghcmVwbGFjZV9uYW1lKSB7CisJCQlwdHIgPSBuYW1lX3B0cjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVudCA9IGZldGNoX3N1YnN0X2VudHJ5KHJlcGxhY2VfbmFtZSk7CisJCWlmICghZW50KSB7CisJCQlwdHIgPSBlbmRfcHRyICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisjaWYgMAorCQlmcHJpbnRmKHN0ZGVyciwgIlJlcGxhY2UgbmFtZSA9ICclcycgd2l0aCAnJXMnXG4iLAorCQkgICAgICAgcmVwbGFjZV9uYW1lLCBlbnQtPnZhbHVlKTsKKyNlbmRpZgorCQlwdHIgPSBuYW1lX3B0ci0yOworCQlyZXBsYWNlX3N0cmluZyhwdHIsIGVuZF9wdHIsIGVudC0+dmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoRklMRSAqZikKK3sKKwljaGFyCWxpbmVbMjA0OF07CisJY2hhcgkqY3AsICpwdHI7CisKKwl3aGlsZSAoIWZlb2YoZikpIHsKKwkJbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CisJCWlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpID09IE5VTEwpCisJCQlicmVhazsKKwkJLyoKKwkJICogU3RyaXAgbmV3bGluZXMgYW5kIGNvbW1lbnRzLgorCQkgKi8KKwkJY3AgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisJCWlmIChjcCkKKwkJCSpjcCA9IDA7CisJCWNwID0gc3RyY2hyKGxpbmUsICcjJyk7CisJCWlmIChjcCkKKwkJCSpjcCA9IDA7CisJCS8qCisJCSAqIFNraXAgdHJhaWxpbmcgYW5kIGxlYWRpbmcgd2hpdGVzcGFjZQorCQkgKi8KKwkJZm9yIChjcCA9IGxpbmUgKyBzdHJsZW4obGluZSkgLSAxOyBjcCA+PSBsaW5lOyBjcC0tKSB7CisJCQlpZiAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykKKwkJCQkqY3AgPSAwOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJCWNwID0gbGluZTsKKwkJd2hpbGUgKCpjcCAmJiBpc3NwYWNlKCpjcCkpCisJCQljcCsrOworCQlwdHIgPSBjcDsKKwkJLyoKKwkJICogU2tpcCBlbXB0eSBsaW5lcworCQkgKi8KKwkJaWYgKCpwdHIgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZ25vcmUgZnV0dXJlIGV4dGVuc2lvbnMKKwkJICovCisJCWlmICgqcHRyID09ICdAJykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBQYXJzZSBzdWJzdGl0dXRpb25zCisJCSAqLworCQlmb3IgKGNwID0gcHRyOyAqY3A7IGNwKyspCisJCQlpZiAoaXNzcGFjZSgqY3ApKQorCQkJCWJyZWFrOworCQkqY3AgPSAwOworCQlmb3IgKGNwKys7ICpjcDsgY3ArKykKKwkJCWlmICghaXNzcGFjZSgqY3ApKQorCQkJCWJyZWFrOworI2lmIDAKKwkJcHJpbnRmKCJTdWJzdGl0dXRlOiAnJXMnIGZvciAnJXMnXG4iLCBwdHIsIGNwID8gY3AgOiAiPE5VTEw+Iik7CisjZW5kaWYKKwkJYWRkX3N1YnN0KHB0ciwgY3ApOworCX0KK30KKworLyoKKyAqIFJldHVybiAwIGlmIHRoZSBmaWxlcyBhcmUgZGlmZmVyZW50LCAxIGlmIHRoZSBmaWxlcyBhcmUgdGhlIHNhbWUuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9maWxlKGNvbnN0IGNoYXIgKm91dGZuLCBjb25zdCBjaGFyICpuZXdmbikKK3sKKwlGSUxFCSpvbGRfZiwgKm5ld19mOworCWNoYXIJb2xkYnVmWzIwNDhdLCBuZXdidWZbMjA0OF0sICpvbGRjcCwgKm5ld2NwOworCWludAlyZXR2YWw7CisKKwlvbGRfZiA9IGZvcGVuKG91dGZuLCAiciIpOworCWlmICghb2xkX2YpCisJCXJldHVybiAwOworCW5ld19mID0gZm9wZW4obmV3Zm4sICJyIik7CisJaWYgKCFuZXdfZikgeworCQlmY2xvc2Uob2xkX2YpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlvbGRjcCA9IGZnZXRzKG9sZGJ1Ziwgc2l6ZW9mKG9sZGJ1ZiksIG9sZF9mKTsKKwkJbmV3Y3AgPSBmZ2V0cyhuZXdidWYsIHNpemVvZihuZXdidWYpLCBuZXdfZik7CisJCWlmICghb2xkY3AgJiYgIW5ld2NwKSB7CisJCQlyZXR2YWwgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFvbGRjcCB8fCAhbmV3Y3AgfHwgc3RyY21wKG9sZGJ1ZiwgbmV3YnVmKSkgeworCQkJcmV0dmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWZjbG9zZShvbGRfZik7CisJZmNsb3NlKG5ld19mKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIJbGluZVsyMDQ4XTsKKwlpbnQJYzsKKwlGSUxFCSppbiwgKm91dDsKKwljaGFyCSpvdXRmbiA9IE5VTEwsICpuZXdmbiA9IE5VTEw7CisJaW50CXZlcmJvc2UgPSAwOworCWludAlhZGp1c3RfdGltZXN0YW1wID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKwlzdHJ1Y3QgdXRpbWJ1ZiB1dDsKKworCXdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgImY6dHYiKSkgIT0gRU9GKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdmJzoKKwkJCWluID0gZm9wZW4ob3B0YXJnLCAiciIpOworCQkJaWYgKCFpbikgeworCQkJCXBlcnJvcihvcHRhcmcpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlwYXJzZV9jb25maWdfZmlsZShpbik7CisJCQlmY2xvc2UoaW4pOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJYWRqdXN0X3RpbWVzdGFtcCsrOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSsrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBbLWYgY29uZmlnLWZpbGVdIFtmaWxlXVxuIiwKKwkJCQlhcmd2WzBdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvcHRpbmQgPCBhcmdjKSB7CisJCWluID0gZm9wZW4oYXJndltvcHRpbmRdLCAiciIpOworCQlpZiAoIWluKSB7CisJCQlwZXJyb3IoYXJndltvcHRpbmRdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJb3B0aW5kKys7CisJfSBlbHNlCisJCWluID0gc3RkaW47CisKKwlpZiAob3B0aW5kIDwgYXJnYykgeworCQlvdXRmbiA9IGFyZ3Zbb3B0aW5kXTsKKwkJbmV3Zm4gPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKG91dGZuKSsyMCk7CisJCWlmICghbmV3Zm4pIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTWVtb3J5IGVycm9yISAgRXhpdGluZy5cbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlzdHJjcHkobmV3Zm4sIG91dGZuKTsKKwkJc3RyY2F0KG5ld2ZuLCAiLm5ldyIpOworCQlvdXQgPSBmb3BlbihuZXdmbiwgInciKTsKKwkJaWYgKCFvdXQpIHsKKwkJCXBlcnJvcihuZXdmbik7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIHsKKwkJb3V0ID0gc3Rkb3V0OworCQlvdXRmbiA9IDA7CisJfQorCisJd2hpbGUgKCFmZW9mKGluKSkgeworCQlpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlzdWJzdGl0dXRlX2xpbmUobGluZSk7CisJCWZwdXRzKGxpbmUsIG91dCk7CisJfQorCWZjbG9zZShpbik7CisJZmNsb3NlKG91dCk7CisJaWYgKG91dGZuKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQlpZiAoY29tcGFyZV9maWxlKG91dGZuLCBuZXdmbikpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigiTm8gY2hhbmdlLCBrZWVwaW5nICVzLlxuIiwgb3V0Zm4pOworCQkJaWYgKGFkanVzdF90aW1lc3RhbXApIHsKKwkJCQlpZiAoc3RhdChvdXRmbiwgJnN0YnVmKSA9PSAwKSB7CisJCQkJCWlmICh2ZXJib3NlKQorCQkJCQkJcHJpbnRmKCJVcGRhdGluZyBtb2R0aW1lIGZvciAlc1xuIiwgb3V0Zm4pOworCQkJCQl1dC5hY3RpbWUgPSBzdGJ1Zi5zdF9hdGltZTsKKwkJCQkJdXQubW9kdGltZSA9IHRpbWUoMCk7CisJCQkJCWlmICh1dGltZShvdXRmbiwgJnV0KSA8IDApCisJCQkJCQlwZXJyb3IoInV0aW1lIik7CisJCQkJfQorCQkJfQorCQkJdW5saW5rKG5ld2ZuKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigiQ3JlYXRpbmcgb3IgcmVwbGFjaW5nICVzLlxuIiwgb3V0Zm4pOworCQkJcmVuYW1lKG5ld2ZuLCBvdXRmbik7CisJCX0KKwkJLyogc2V0IHJlYWQtb25seSB0byBhbGVydCB1c2VyIGl0IGlzIGEgZ2VuZXJhdGVkIGZpbGUgKi8KKwkJaWYgKHN0YXQob3V0Zm4sICZzdCkgPT0gMCkKKwkJCWNobW9kKG91dGZuLCBzdC5zdF9tb2RlICYgfjAyMjIpOworCX0KKwlyZXR1cm4gKDApOworfQorCisKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9zdWJzdC5jb25mLmluIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi91dGlsL3N1YnN0LmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3MDcyNQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvdXRpbC9zdWJzdC5jb25mLmluCkBAIC0wLDAgKzEsMTkgQEAKK0FXSwkJCUBBV0tACitTRUQJCQlAU0VEQAorRVRfRElSCQkJQEVUX0RJUkAKK1NTX0RJUgkJCUBTU19ESVJACitFMkZTUFJPR1NfTU9OVEgJCUBFMkZTUFJPR1NfTU9OVEhACitFMkZTUFJPR1NfWUVBUgkJQEUyRlNQUk9HU19ZRUFSQAorRTJGU1BST0dTX1ZFUlNJT04JQEUyRlNQUk9HU19WRVJTSU9OQAorU0laRU9GX0xPTkdfTE9ORwlAU0laRU9GX0xPTkdfTE9OR0AKK1NJWkVPRl9MT05HCQlAU0laRU9GX0xPTkdACitTSVpFT0ZfSU5UCQlAU0laRU9GX0lOVEAKK1NJWkVPRl9TSE9SVAkJQFNJWkVPRl9TSE9SVEAKK2RhdGFyb290ZGlyCQlAZGF0YXJvb3RkaXJACitkYXRhZGlyCQkJQGRhdGFkaXJACityb290X3N5c2NvbmZkaXIJCUByb290X3N5c2NvbmZkaXJACiskcm9vdF9wcmVmaXgJCUByb290X3ByZWZpeEAKKyRwcmVmaXgJCQlAcHJlZml4QAorIyBFbmFibGUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBqb3VybmFsIGRldmljZSBta2UyZnMsIHR1bmUyZnMsIGFuZAorIyBlMmZzY2sncyBtYW4gcGFnZQorSkRFVgkJCQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi92ZXJzaW9uLmggYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTA4ODRkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi92ZXJzaW9uLmgKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIHZlcnNpb24uaCAtLS0gY29udHJvbHMgdGhlIHZlcnNpb24gbnVtYmVyIHByaW50ZWQgYnkgdGhlIGUyZnMKKyAqIHByb2dyYW1zLgorICoKKyAqIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLAorICogMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBieSBUaGVvZG9yZSBUcydvLiAgVGhpcworICogZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHYyLgorICovCisKKyNkZWZpbmUgRTJGU1BST0dTX1ZFUlNJT04gIjEuNDEuMTIiCisjZGVmaW5lIEUyRlNQUk9HU19EQVRFICIxNy1NYXktMjAxMCIKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLTEuNDEuMTIvd29yZHdyYXAucGwgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3dvcmR3cmFwLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmJiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy0xLjQxLjEyL3dvcmR3cmFwLnBsCkBAIC0wLDAgKzEsMjkgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyB3b3Jkd3JhcC5wbCAtLS0gZG9lcyB3b3JkIHdyYXAKKyMKK3doaWxlICg8PikgeworICAgIGlmICgvXiMvKSB7CQkjIGRvbid0IHdvcmQgd3JhcCBjb21tZW50cworCXByaW50OworCW5leHQ7CisgICAgfQorICAgIG5leHQgaWYgKC9eJC8pOwkjIHNraXAgYmxhbmsgbGluZXMKKyAgICAkbGluZWxlbiA9IDA7CisgICAgc3BsaXQ7CisgICAgd2hpbGUgKGRlZmluZWQoJHdvcmQgPSBzaGlmdCBAXykpIHsKKwkkd29yZCA9fiBzI1wkXChzcmNkaXJcKS9cLlwuL3ZlcnNpb24uaCNcJFwodG9wX3NyY2RpclwpL3ZlcnNpb24uaCM7CisJJHdvcmQgPX4gcyNcJFwoc3JjZGlyXCkvLlwuXC9cLlwuL3ZlcnNpb24uaCNcJFwodG9wX3NyY2RpclwpL3ZlcnNpb24uaCM7CisJJHdvcmQgPX4gcyNcJFwoc3JjZGlyXCkvLlwuXC9ldC9jb21fZXJyLmgjXCRcKHRvcF9zcmNkaXJcKS9saWIvZXQvY29tX2Vyci5oIzsKKwlpZiAoJGxpbmVsZW4gPiAwKSB7CisJICAgIHByaW50ZigiICIpOworCX0KKwkkbGVuID0gbGVuZ3RoKCR3b3JkKSArIDE7CisJJGxpbmVsZW4gKz0gJGxlbjsKKwlpZiAoJGxpbmVsZW4gPiA3OCkgeworCSAgICBwcmludGYoIlxcXG4gIik7CisJICAgICRsaW5lbGVuID0gMSskbGVuOworCX0KKwlwcmludGYoIiVzIiwgJHdvcmQpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy50YXIuZ3ogYi9lMmZzcHJvZ3MtbGlicy50YXIuZ3oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjOGM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLnRhci5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MtbGlicy51cmwgYi9lMmZzcHJvZ3MtbGlicy51cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3YTcxNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy1saWJzLnVybApAQCAtMCwwICsxIEBACitodHRwOi8vZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9lMmZzcHJvZ3MvZTJmc3Byb2dzLWxpYnMtMS40MS4xMi50YXIuZ3oKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy1saWJzLnZlcnNpb24gYi9lMmZzcHJvZ3MtbGlicy52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjZhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MtbGlicy52ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKzEuNDEuMTIK