每日签到奶昔超市点数市场奶昔访达
返回列表 发布新帖
查看: 8012|回复: 158

[教程] GitHub学生包全能油猴脚本

 火..
发表于 2025-4-20 19:26:45 | 查看全部 |阅读模式

欢迎注册论坛,享受更多奶昔会员权益!

您需要 登录 才可以下载或查看,没有账号?注册

×
最近github学生包的页面更新,原来的脚本失效,今天突然想薅一下,让GPT重新修改写了个脚本
然后通过了
方法:1.安装脚本
2.打开 https://github.com/education 点击“Join GitHub Education”
3.点击Load按钮,上传学生证照片
4.点击“Start an application”,点击Student,然后这里注意!!,一定要
手动输入自己的学校名称,不能点“Use this School”,否则会修改不到定位。
5.点击继续,选择1号School ID ,然后打开摄像头,设置没问题的话就可以看到自己的学生证图片了,点击确认上传即可

这里还得注意几点:用的IP要跟学校近一点,不然会提示VPN,我是直接用的同州的IP通过的,尽量用无痕模式申请,防止其它账号被关联。
41cf7708b3849003f4452a548db59662.jpg
油猴脚本:(Base64自己转文本)
  1. Ly8gPT1Vc2VyU2NyaXB0PT0NCi8vIEBuYW1lICAgICAgICAgRW5oYW5jZWQgVmlydHVhbCBDYW1lcmEgSG9vaw0KLy8gQG5hbWVzcGFjZSAgICB1cGRvd251cA0KLy8gQHZlcnNpb24gICAgICAxLjANCi8vIEBkZXNjcmlwdGlvbiAgSG9vayB2YXJpb3VzIGNhbWVyYSBBUElzDQovLyBAbWF0Y2ggICAgICAgICo6Ly9lZHVjYXRpb24uZ2l0aHViLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9naXRodWIuY29tL3NldHRpbmdzL2VkdWNhdGlvbi9kZXZlbG9wZXJfcGFja19hcHBsaWNhdGlvbnMvbmV3DQovLyBAbWF0Y2ggICAgICAgICo6Ly9naXRodWIuY29tL3NldHRpbmdzL2VkdWNhdGlvbi9iZW5lZml0cw0KLy8gQG1hdGNoICAgICAgICAqOi8vd2ViY2FtdGVzdHMuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL3d3dy52ZWVkLmlvLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL3dlYmNhbW1pY3Rlc3QuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL3d3dy5vbmxpbmVtaWN0ZXN0LmNvbS8qDQovLyBAZ3JhbnQgICAgICAgIHVuc2FmZVdpbmRvdw0KLy8gQGdyYW50ICAgICAgICBHTV94bWxodHRwUmVxdWVzdA0KLy8gQHJ1bi1hdCAgICAgICBkb2N1bWVudC1zdGFydA0KLy8gPT0vVXNlclNjcmlwdD09DQoNCihmdW5jdGlvbigpIHsNCiAgICAndXNlIHN0cmljdCc7DQoNCiAgICBsZXQgYmFzZTY0SW1hZ2U7DQoNCiAgICAvLyAtLS0tLS0tLSBVdGlsaXR5IENsYXNzIC0tLS0tLS0tDQogICAgY2xhc3MgVXRpbHMgew0KICAgICAgICBzdGF0aWMgZ2VuZXJhdGVSYW5kb21CYXNlNjQobGVuZ3RoKSB7DQogICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nOw0KICAgICAgICAgICAgbGV0IHJlc3VsdCA9ICcnOw0KICAgICAgICAgICAgY29uc3QgY2hhcmFjdGVyc0xlbmd0aCA9IGNoYXJhY3RlcnMubGVuZ3RoOw0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzTGVuZ3RoKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgc3RhdGljIGFzeW5jIGdldEJhc2U2NEltYWdlKGRlZmF1bHRCYXNlNjRJbWFnZSkgew0KICAgICAgICAgICAgcmV0dXJuIGJhc2U2NEltYWdlIHx8IGRlZmF1bHRCYXNlNjRJbWFnZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tLS0tIFN0ZWFsdGggVUkgQ2xhc3MgLS0tLS0tLS0NCiAgICBjbGFzcyBTdGVhbHRoVUkgew0KICAgICAgICBjb25zdHJ1Y3RvcigpIHsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJhc2U2NEltYWdlID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDa2xFUVZSNG5HTUFBUUFBQlFBQkRRb3R0QUFBQUFCSlJVNUVya0pnZ2c9PSc7DQogICAgICAgICAgICB0aGlzLmNyZWF0ZVVJKCk7DQogICAgICAgIH0NCg0KICAgICAgICBjcmVhdGVVSSgpIHsNCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmFsbCA9ICdpbml0aWFsJzsNCiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpOw0KDQogICAgICAgICAgICBjb25zdCBzaGFkb3cgPSBjb250YWluZXIuYXR0YWNoU2hhZG93KHsgbW9kZTogJ2Nsb3NlZCcgfSk7DQoNCiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IGANCiAgICAgICAgICAgIDpob3N0IHsgYWxsOiBpbml0aWFsOyB9DQogICAgICAgICAgICAjc3RlYWx0aC1jb250YWluZXIgeyBwb3NpdGlvbjogZml4ZWQ7IHRvcDogMDsgcmlnaHQ6IDA7IHotaW5kZXg6IDIxNDc0ODM2NDc7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7IHBhZGRpbmc6IDA7IGJvcmRlci1yYWRpdXM6IDdweDsgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0LCBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZS1pbi1vdXQ7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogYXV0bzsgbWF4LXdpZHRoOiAyMDBweDsgb3BhY2l0eTogMC4xOyB9DQogICAgICAgICAgICAjc3RlYWx0aC1jb250YWluZXI6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDIyMCwgMCwgMC4yNSk7IG9wYWNpdHk6IDE7IH0NCiAgICAgICAgICAgICNzdGVhbHRoLWNvbnRhaW5lci5oaWRkZW4geyBvcGFjaXR5OiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTsgfQ0KICAgICAgICAgICAgI3N0ZWFsdGgtZmlsZUlucHV0IHsgZGlzcGxheTogbm9uZTsgfQ0KICAgICAgICAgICAgI3N0ZWFsdGgtbG9hZEJ1dHRvbiB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7IGJvcmRlcjogbm9uZTsgcGFkZGluZzogNXB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiBpbmhlcml0OyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogYmxhY2s7IHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4yNXMgZWFzZS1pbi1vdXQ7IH0NCiAgICAgICAgICAgICNzdGVhbHRoLWxvYWRCdXR0b246aG92ZXIgeyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNSwgMjUsIDI1LCAwLjI1KTsgfQ0KICAgICAgICAgICAgI3N0ZWFsdGgtbG9hZEJ1dHRvbi5kb25lIHsgYW5pbWF0aW9uOiBzcGluIDJzIGxpbmVhciBpbmZpbml0ZTsgfQ0KICAgICAgICAgICAgQGtleWZyYW1lcyBzcGluIHsgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfSAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9DQogICAgICAgIGA7DQoNCiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsNCiAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDxzdHlsZT4ke3N0eWxlc308L3N0eWxlPg0KICAgICAgICAgICAgPGRpdiBpZD0ic3RlYWx0aC1jb250YWluZXIiPg0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0ic3RlYWx0aC1maWxlSW5wdXQiIGFjY2VwdD0iaW1hZ2UvKiI+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0ic3RlYWx0aC1sb2FkQnV0dG9uIj5Mb2FkPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgYDsNCg0KICAgICAgICAgICAgc2hhZG93LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTsNCg0KICAgICAgICAgICAgY29uc3Qgc3RlYWx0aENvbnRhaW5lciA9IHNoYWRvdy5nZXRFbGVtZW50QnlJZCgnc3RlYWx0aC1jb250YWluZXInKTsNCiAgICAgICAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IHNoYWRvdy5nZXRFbGVtZW50QnlJZCgnc3RlYWx0aC1maWxlSW5wdXQnKTsNCiAgICAgICAgICAgIGNvbnN0IGxvYWRCdXR0b24gPSBzaGFkb3cuZ2V0RWxlbWVudEJ5SWQoJ3N0ZWFsdGgtbG9hZEJ1dHRvbicpOw0KDQogICAgICAgICAgICBsb2FkQnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgICAgICAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmaWxlSW5wdXQub25jaGFuZ2UgPSBmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgICAgICAgICAgICAgaWYgKGZpbGVJbnB1dC5maWxlcyAmJiBmaWxlSW5wdXQuZmlsZXNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgbG9hZEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdkb25lJyk7DQogICAgICAgICAgICAgICAgICAgIGxvYWRCdXR0b24udGV4dENvbnRlbnQgPSAnLi4uJzsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsNCiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRJbWFnZSA9IGUudGFyZ2V0LnJlc3VsdDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRCdXR0b24udGV4dENvbnRlbnQgPSAn4oiaJzsNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUlucHV0LmZpbGVzWzBdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0tLS0gVmlydHVhbCBTdHJlYW0gQ2xhc3MgLS0tLS0tLS0NCiAgICBjbGFzcyBWaXJ0dWFsU3RyZWFtIHsNCiAgICAgICAgY29uc3RydWN0b3Iod2lkdGggPSAxOTIwLCBoZWlnaHQgPSAxMDgwLCBmcHMgPSAzMCkgew0KICAgICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOw0KICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7DQogICAgICAgICAgICB0aGlzLmZwcyA9IGZwczsNCiAgICAgICAgfQ0KDQogICAgICAgIGFzeW5jIGNyZWF0ZU5vaXNlTGF5ZXIob3BhY2l0eSA9IDAuMjYxNDk3MjEpIHsNCiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOw0KICAgICAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy53aWR0aDsNCiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodDsNCiAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7DQogICAgICAgICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7DQoNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkgew0KICAgICAgICAgICAgICAgIGNvbnN0IG5vaXNlID0gTWF0aC5yYW5kb20oKSAqIDI1NTsNCiAgICAgICAgICAgICAgICBkYXRhW2ldID0gZGF0YVtpICsgMV0gPSBkYXRhW2kgKyAyXSA9IG5vaXNlOw0KICAgICAgICAgICAgICAgIGRhdGFbaSArIDNdID0gb3BhY2l0eSAqIDI1NTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApOw0KICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsNCiAgICAgICAgfQ0KDQogICAgICAgIGRyYXdJbWFnZUNvdmVyZWQoY3R4LCBpbWcsIHgsIHksIHcsIGgpIHsNCiAgICAgICAgICAgIGNvbnN0IGltZ1JhdGlvID0gaW1nLndpZHRoIC8gaW1nLmhlaWdodDsNCiAgICAgICAgICAgIGNvbnN0IGNhbnZhc1JhdGlvID0gdyAvIGg7DQogICAgICAgICAgICBsZXQgc3gsIHN5LCBzV2lkdGgsIHNIZWlnaHQ7DQoNCiAgICAgICAgICAgIGlmIChpbWdSYXRpbyA+IGNhbnZhc1JhdGlvKSB7DQogICAgICAgICAgICAgICAgc0hlaWdodCA9IGltZy5oZWlnaHQ7DQogICAgICAgICAgICAgICAgc1dpZHRoID0gc0hlaWdodCAqIGNhbnZhc1JhdGlvOw0KICAgICAgICAgICAgICAgIHN4ID0gKGltZy53aWR0aCAtIHNXaWR0aCkgLyAyOw0KICAgICAgICAgICAgICAgIHN5ID0gMDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc1dpZHRoID0gaW1nLndpZHRoOw0KICAgICAgICAgICAgICAgIHNIZWlnaHQgPSBzV2lkdGggLyBjYW52YXNSYXRpbzsNCiAgICAgICAgICAgICAgICBzeCA9IDA7DQogICAgICAgICAgICAgICAgc3kgPSAoaW1nLmhlaWdodCAtIHNIZWlnaHQpIC8gMjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIHN4LCBzeSwgc1dpZHRoLCBzSGVpZ2h0LCB4LCB5LCB3LCBoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGFzeW5jIGNyZWF0ZUR5bmFtaWNGaWx0ZXJlZFN0cmVhbSgpIHsNCiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOw0KICAgICAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy53aWR0aDsNCiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodDsNCiAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOw0KDQogICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTsNCiAgICAgICAgICAgIGltZy5zcmMgPSBhd2FpdCBVdGlscy5nZXRCYXNlNjRJbWFnZShuZXcgU3RlYWx0aFVJKCkuZGVmYXVsdEJhc2U2NEltYWdlKTsNCg0KICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7DQogICAgICAgICAgICBvZmZzY3JlZW5DYW52YXMud2lkdGggPSB0aGlzLndpZHRoOw0KICAgICAgICAgICAgb2Zmc2NyZWVuQ2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0Ow0KICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuQ3R4ID0gb2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoJzJkJyk7DQoNCiAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7DQogICAgICAgICAgICAgICAgdGhpcy5kcmF3SW1hZ2VDb3ZlcmVkKG9mZnNjcmVlbkN0eCwgaW1nLCAwLCAwLCBvZmZzY3JlZW5DYW52YXMud2lkdGgsIG9mZnNjcmVlbkNhbnZhcy5oZWlnaHQpOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgbGV0IG5vaXNlTGF5ZXIgPSBhd2FpdCB0aGlzLmNyZWF0ZU5vaXNlTGF5ZXIoKTsNCg0KICAgICAgICAgICAgbGV0IGh1ZSA9IDA7DQogICAgICAgICAgICBsZXQgc2F0dXJhdGUgPSAxMDA7DQogICAgICAgICAgICBsZXQgYnJpZ2h0bmVzcyA9IDEwMDsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVGcmFtZSgpIHsNCiAgICAgICAgICAgICAgICBodWUgPSAoaHVlICsgMC4xKSAlIDI7DQogICAgICAgICAgICAgICAgc2F0dXJhdGUgPSA5OSArIE1hdGguc2luKERhdGUubm93KCkgLyAxMDAwKSAqIE1hdGgucmFuZG9tKCk7DQogICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IDk4ICsgTWF0aC5yYW5kb20oKSAqIDI7DQoNCiAgICAgICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7DQogICAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShvZmZzY3JlZW5DYW52YXMsIDAsIDApOw0KICAgICAgICAgICAgICAgIGN0eC5maWx0ZXIgPSBgaHVlLXJvdGF0ZSgke2h1ZX1kZWcpIHNhdHVyYXRlKCR7c2F0dXJhdGV9JSkgYnJpZ2h0bmVzcygke2JyaWdodG5lc3N9JSlgOw0KICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoY2FudmFzLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBjdHguZmlsdGVyID0gJ25vbmUnOw0KICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnb3ZlcmxheSc7DQogICAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShub2lzZUxheWVyLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gY2FudmFzLmNhcHR1cmVTdHJlYW0odGhpcy5mcHMpOw0KDQogICAgICAgICAgICBzZXRJbnRlcnZhbChnZW5lcmF0ZUZyYW1lLCAxMDAwIC8gdGhpcy5mcHMpOw0KDQogICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7DQogICAgICAgICAgICAgICAgbm9pc2VMYXllciA9IHRoaXMuY3JlYXRlTm9pc2VMYXllcigpOw0KICAgICAgICAgICAgfSwgMTAwICsgTWF0aC5zaW4oRGF0ZS5ub3coKSAvIDEwMDApICogMTUwKTsNCg0KICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTsNCiAgICAgICAgfQ0KDQogICAgICAgIGFzeW5jIGNyZWF0ZVdlYkdMRmlsdGVyZWRTdHJlYW0oKSB7DQogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsNCiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7DQogICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7DQogICAgICAgICAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTsNCg0KICAgICAgICAgICAgaWYgKCFnbCkgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dlYkdMIG5vdCBzdXBwb3J0ZWQsIGZhbGxpbmcgYmFjayB0byAyRCBjYW52YXMnKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVEeW5hbWljRmlsdGVyZWRTdHJlYW0oKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gYA0KICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247DQogICAgICAgICAgICAgICAgYXR0cmlidXRlIHZlYzIgYV90ZXhDb29yZDsNCiAgICAgICAgICAgICAgICB2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsNCiAgICAgICAgICAgICAgICB2b2lkIG1haW4oKSB7DQogICAgICAgICAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uLCAwLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYDsNCg0KICAgICAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBgDQogICAgICAgICAgICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7DQogICAgICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTsNCiAgICAgICAgICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X25vaXNlOw0KICAgICAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgdV90aW1lOw0KICAgICAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X25vaXNlT2Zmc2V0Ow0KICAgICAgICAgICAgICAgIHZhcnlpbmcgdmVjMiB2X3RleENvb3JkOw0KDQogICAgICAgICAgICAgICAgdmVjMyByZ2IyaHN2KHZlYzMgYykgew0KICAgICAgICAgICAgICAgICAgICB2ZWM0IEsgPSB2ZWM0KDAuMCwgLTEuMCAvIDMuMCwgMi4wIC8gMy4wLCAtMS4wKTsNCiAgICAgICAgICAgICAgICAgICAgdmVjNCBwID0gbWl4KHZlYzQoYy5iZywgSy53eiksIHZlYzQoYy5nYiwgSy54eSksIHN0ZXAoYy5iLCBjLmcpKTsNCiAgICAgICAgICAgICAgICAgICAgdmVjNCBxID0gbWl4KHZlYzQocC54eXcsIGMuciksIHZlYzQoYy5yLCBwLnl6eCksIHN0ZXAocC54LCBjLnIpKTsNCiAgICAgICAgICAgICAgICAgICAgZmxvYXQgZCA9IHEueCAtIG1pbihxLncsIHEueSk7DQogICAgICAgICAgICAgICAgICAgIGZsb2F0IGUgPSAxLjBlLTEwOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjMyhhYnMocS56ICsgKHEudyAtIHEueSkgLyAoNi4wICogZCArIGUpKSwgZCAvIChxLnggKyBlKSwgcS54KTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2ZWMzIGhzdjJyZ2IodmVjMyBjKSB7DQogICAgICAgICAgICAgICAgICAgIHZlYzQgSyA9IHZlYzQoMS4wLCAyLjAgLyAzLjAsIDEuMCAvIDMuMCwgMy4wKTsNCiAgICAgICAgICAgICAgICAgICAgdmVjMyBwID0gYWJzKGZyYWN0KGMueHh4ICsgSy54eXopICogNi4wIC0gSy53d3cpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy56ICogbWl4KEsueHh4LCBjbGFtcChwIC0gSy54eHgsIDAuMCwgMS4wKSwgYy55KTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2b2lkIG1haW4oKSB7DQogICAgICAgICAgICAgICAgICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdmVjMih2X3RleENvb3JkLngsIDEuMCAtIHZfdGV4Q29vcmQueSkpOw0KICAgICAgICAgICAgICAgICAgICB2ZWM0IG5vaXNlID0gdGV4dHVyZTJEKHVfbm9pc2UsIHZfdGV4Q29vcmQgKiA0LjAgKyB1X25vaXNlT2Zmc2V0KTsNCg0KICAgICAgICAgICAgICAgICAgICB2ZWMzIGhzdiA9IHJnYjJoc3YoY29sb3IucmdiKTsNCg0KICAgICAgICAgICAgICAgICAgICBmbG9hdCBzYXR1cmF0aW9uQWRqdXN0ID0gMC45OSArIHNpbih1X3RpbWUgKiAwLjAwMikgKiAwLjAxOw0KICAgICAgICAgICAgICAgICAgICBoc3YueSAqPSBzYXR1cmF0aW9uQWRqdXN0Ow0KDQogICAgICAgICAgICAgICAgICAgIGZsb2F0IGJyaWdodG5lc3NBZGp1c3QgPSAwLjk4ICsgMC4wMiAqIGZyYWN0KHNpbihkb3Qodl90ZXhDb29yZCwgdmVjMigxMi45ODk4LCA3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTsNCiAgICAgICAgICAgICAgICAgICAgaHN2LnogKj0gYnJpZ2h0bmVzc0FkanVzdDsNCg0KICAgICAgICAgICAgICAgICAgICB2ZWMzIHJnYiA9IGhzdjJyZ2IoaHN2KTsNCg0KICAgICAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHJnYiwgY29sb3IuYSkgKyBub2lzZSAqIDAuMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBgOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVTaGFkZXIoZ2wsIHR5cGUsIHNvdXJjZSkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKTsNCiAgICAgICAgICAgICAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpOw0KICAgICAgICAgICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTsNCiAgICAgICAgICAgICAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBjb21waWxpbmcgdGhlIHNoYWRlcnM6ICcgKyBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikpOw0KICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoc2hhZGVyKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBzaGFkZXI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsNCiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsNCg0KICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsNCiAgICAgICAgICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOw0KICAgICAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsNCiAgICAgICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOw0KDQogICAgICAgICAgICBpZiAoIWdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIHNoYWRlciBwcm9ncmFtOiAnICsgZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpOw0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOw0KICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHBvc2l0aW9uQnVmZmVyKTsNCiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFsNCiAgICAgICAgICAgICAgICAtMSwgLTEsDQogICAgICAgICAgICAgICAgMSwgLTEsDQogICAgICAgICAgICAgICAgLTEsIDEsDQogICAgICAgICAgICAgICAgMSwgMSwNCiAgICAgICAgICAgIF0pLCBnbC5TVEFUSUNfRFJBVyk7DQoNCiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7DQogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGV4Q29vcmRCdWZmZXIpOw0KICAgICAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoWw0KICAgICAgICAgICAgICAgIDAsIDAsDQogICAgICAgICAgICAgICAgMSwgMCwNCiAgICAgICAgICAgICAgICAwLCAxLA0KICAgICAgICAgICAgICAgIDEsIDEsDQogICAgICAgICAgICBdKSwgZ2wuU1RBVElDX0RSQVcpOw0KDQogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkxvY2F0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ2FfcG9zaXRpb24nKTsNCiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnYV90ZXhDb29yZCcpOw0KDQogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOw0KICAgICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb25Mb2NhdGlvbik7DQogICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZExvY2F0aW9uKTsNCg0KICAgICAgICAgICAgY29uc3QgaW1hZ2VUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOw0KICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgaW1hZ2VUZXh0dXJlKTsNCiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOw0KICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7DQogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTsNCiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpOw0KDQogICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTsNCiAgICAgICAgICAgIGltZy5zcmMgPSBhd2FpdCBVdGlscy5nZXRCYXNlNjRJbWFnZShuZXcgU3RlYWx0aFVJKCkuZGVmYXVsdEJhc2U2NEltYWdlKTsNCiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gaW1nLm9ubG9hZCA9IHJlc29sdmUpOw0KDQogICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltZyk7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZU5vaXNlVGV4dHVyZShnbCwgc2l6ZSkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVscyA9IG5ldyBVaW50OEFycmF5KHNpemUgKiBzaXplICogNCk7DQogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpICs9IDQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9pc2UgPSBNYXRoLnJhbmRvbSgpICogMjU1Ow0KICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaV0gPSBwaXhlbHNbaSArIDFdID0gcGl4ZWxzW2kgKyAyXSA9IG5vaXNlOw0KICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaSArIDNdID0gMjU1Ow0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7DQogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7DQogICAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCBzaXplLCBzaXplLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBwaXhlbHMpOw0KICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpOw0KICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpOw0KICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLlJFUEVBVCk7DQogICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuUkVQRUFUKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dHVyZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29uc3Qgbm9pc2VUZXh0dXJlID0gY3JlYXRlTm9pc2VUZXh0dXJlKGdsLCAxMDI0KTsNCg0KICAgICAgICAgICAgY29uc3QgdV9pbWFnZSA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAndV9pbWFnZScpOw0KICAgICAgICAgICAgY29uc3QgdV9ub2lzZSA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAndV9ub2lzZScpOw0KICAgICAgICAgICAgY29uc3QgdV90aW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1X3RpbWUnKTsNCiAgICAgICAgICAgIGNvbnN0IHVfbm9pc2VPZmZzZXQgPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ3Vfbm9pc2VPZmZzZXQnKTsNCg0KICAgICAgICAgICAgZ2wudW5pZm9ybTFpKHVfaW1hZ2UsIDApOw0KICAgICAgICAgICAgZ2wudW5pZm9ybTFpKHVfbm9pc2UsIDEpOw0KDQogICAgICAgICAgICBsZXQgbm9pc2VPZmZzZXRYID0gMDsNCiAgICAgICAgICAgIGxldCBub2lzZU9mZnNldFkgPSAwOw0KDQogICAgICAgICAgICBmdW5jdGlvbiByZW5kZXIodGltZSkgew0KICAgICAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7DQogICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOw0KDQogICAgICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRleENvb3JkQnVmZmVyKTsNCiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7DQoNCiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTsNCiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbWFnZVRleHR1cmUpOw0KDQogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7DQogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbm9pc2VUZXh0dXJlKTsNCg0KICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBub2lzZSBvZmZzZXQNCiAgICAgICAgICAgICAgICBub2lzZU9mZnNldFggPSAobm9pc2VPZmZzZXRYICsgMC4wMDEpICUgMTsNCiAgICAgICAgICAgICAgICBub2lzZU9mZnNldFkgPSAobm9pc2VPZmZzZXRZICsgMC4wMDEpICUgMTsNCg0KICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZih1X3RpbWUsIHRpbWUpOw0KICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih1X25vaXNlT2Zmc2V0LCBub2lzZU9mZnNldFgsIG5vaXNlT2Zmc2V0WSk7DQoNCiAgICAgICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsNCiAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICBjb25zdCBmcHMgPSB0aGlzLmZwczsNCiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IGNhbnZhcy5jYXB0dXJlU3RyZWFtKGZwcyk7DQoNCiAgICAgICAgICAgIGxldCBsYXN0VGltZSA9IDA7DQogICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGUoY3VycmVudFRpbWUpIHsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWUgLSBsYXN0VGltZSA+PSAxMDAwIC8gZnBzKSB7DQogICAgICAgICAgICAgICAgICAgIHJlbmRlcihjdXJyZW50VGltZSk7DQogICAgICAgICAgICAgICAgICAgIGxhc3RUaW1lID0gY3VycmVudFRpbWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB1cGRhdGUoMCk7DQoNCiAgICAgICAgICAgIHJldHVybiBzdHJlYW07DQogICAgICAgIH0NCg0KICAgICAgICBhc3luYyBjcmVhdGVWaXJ0dWFsU3RyZWFtKCkgew0KICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlV2ViR0xGaWx0ZXJlZFN0cmVhbSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0tLS0gQVBJIEhvb2sgQ2xhc3MgLS0tLS0tLS0NCiAgICBjbGFzcyBBUElIb29rIHsNCiAgICAgICAgY29uc3RydWN0b3IoKSB7DQogICAgICAgICAgICB0aGlzLm1ldGhvZHNMb29rdXBUYWJsZSA9IG5ldyBXZWFrTWFwKCk7DQogICAgICAgICAgICB0aGlzLnZpcnR1YWxEZXZpY2VJZCA9IFV0aWxzLmdlbmVyYXRlUmFuZG9tQmFzZTY0KDQzKSArICc9JzsNCiAgICAgICAgICAgIHRoaXMudmlydHVhbEdyb3VwSWQgPSBVdGlscy5nZW5lcmF0ZVJhbmRvbUJhc2U2NCg0MykgKyAnPSc7DQogICAgICAgICAgICB0aGlzLmhvb2tNZWRpYURldmljZXMoKTsNCiAgICAgICAgICAgIHRoaXMuaG9va1JUQ1BlZXJDb25uZWN0aW9uKCk7DQogICAgICAgICAgICB0aGlzLmhvb2tNZWRpYVN0cmVhbVRyYWNrKCk7DQogICAgICAgICAgICB0aGlzLmhvb2tJbWFnZUNhcHR1cmUoKTsNCiAgICAgICAgICAgIHRoaXMuaG9va0dlb2xvY2F0aW9uKCk7DQogICAgICAgICAgICB0aGlzLlF1ZW5jaGluZygpOw0KICAgICAgICB9DQoNCiAgICAgICAgUXVlbmNoaW5nKCkgew0KICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzsNCiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHRoaXMubWV0aG9kc0xvb2t1cFRhYmxlOw0KDQogICAgICAgICAgICBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBuZXcgUHJveHkob3JpZ2luYWxUb1N0cmluZywgew0KICAgICAgICAgICAgICAgIGFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJndW1lbnRzTGlzdCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNBcmc/LmNhbGwgIT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJndW1lbnRzTGlzdCk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmhhcyh0aGlzQXJnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCBtYXAuZ2V0KHRoaXNBcmcpLCBhcmd1bWVudHNMaXN0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJndW1lbnRzTGlzdCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KDQogICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byByZXBsYWNlIGEgbWV0aG9kIHdpdGggYSBob29rDQogICAgICAgIHJlcGxhY2VNZXRob2Qob2JqLCBtZXRob2ROYW1lLCBuZXdNZXRob2QpIHsNCiAgICAgICAgICAgIGNvbnN0IG9sZE1ldGhvZCA9IG9ialttZXRob2ROYW1lXQ0KICAgICAgICAgICAgb2JqW21ldGhvZE5hbWVdID0gbmV3TWV0aG9kOw0KICAgICAgICAgICAgdGhpcy5tZXRob2RzTG9va3VwVGFibGUuc2V0KG5ld01ldGhvZCwgb2xkTWV0aG9kKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEhvb2sgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBtZXRob2RzDQogICAgICAgIGhvb2tNZWRpYURldmljZXMoKSB7DQogICAgICAgICAgICB0aGlzLnJlcGxhY2VNZXRob2QobmF2aWdhdG9yLm1lZGlhRGV2aWNlcywgJ2VudW1lcmF0ZURldmljZXMnLCBhc3luYyAoKSA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlcyA9IGF3YWl0IHRoaXMubWV0aG9kc0xvb2t1cFRhYmxlLmdldChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMpLmNhbGwobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyk7DQogICAgICAgICAgICAgICAgY29uc3QgdmlydHVhbERldmljZSA9IG5ldyBNZWRpYURldmljZUluZm8oew0KICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy52aXJ0dWFsRGV2aWNlSWQsDQogICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6IHRoaXMudmlydHVhbEdyb3VwSWQsDQogICAgICAgICAgICAgICAgICAgIGtpbmQ6ICd2aWRlb2lucHV0JywNCiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdJbnRlZ3JhdGVkIFdlYmNhbScNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICByZXR1cm4gW3ZpcnR1YWxEZXZpY2UsIC4uLmRldmljZXNdOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIHRoaXMucmVwbGFjZU1ldGhvZChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLCAnZ2V0VXNlck1lZGlhJywgYXN5bmMgKGNvbnN0cmFpbnRzKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgVmlydHVhbFN0cmVhbSgpLmNyZWF0ZVZpcnR1YWxTdHJlYW0oKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0aG9kc0xvb2t1cFRhYmxlLmdldChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSkuY2FsbChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLCBjb25zdHJhaW50cyk7DQogICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWV0aG9kKG5hdmlnYXRvci5tZWRpYURldmljZXMsICdnZXREaXNwbGF5TWVkaWEnLCBhc3luYyAoY29uc3RyYWludHMpID0+IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFZpcnR1YWxTdHJlYW0oKS5jcmVhdGVWaXJ0dWFsU3RyZWFtKCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEhvb2sgUlRDUGVlckNvbm5lY3Rpb24NCiAgICAgICAgaG9va1JUQ1BlZXJDb25uZWN0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWV0aG9kKHdpbmRvdywgJ1JUQ1BlZXJDb25uZWN0aW9uJywgKG9yaWdpbmFsUlRDUGVlckNvbm5lY3Rpb24gPT4gew0KICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykgew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYyA9IG5ldyBvcmlnaW5hbFJUQ1BlZXJDb25uZWN0aW9uKC4uLmFyZ3MpOw0KDQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZU1ldGhvZChwYywgJ2FkZFRyYWNrJywgKG9yaWdpbmFsQWRkVHJhY2sgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gJiYgYXJnc1swXS5raW5kID09PSAndmlkZW8nICYmIGFyZ3NbMF0uZ2V0U2V0dGluZ3MoKS5kZXZpY2VJZCA9PT0gdGhpcy52aXJ0dWFsRGV2aWNlSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmV3IFZpcnR1YWxTdHJlYW0oKS5jcmVhdGVWaXJ0dWFsU3RyZWFtKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFt2aWRlb1RyYWNrXSA9IHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxBZGRUcmFjay5jYWxsKHRoaXMsIG5ldyBWaXJ0dWFsVHJhY2sodmlkZW9UcmFjayksIC4uLmFyZ3Muc2xpY2UoMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxBZGRUcmFjay5hcHBseSh0aGlzLCBhcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpOw0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYzsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfSkuYmluZCh0aGlzKSh3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24pKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEhvb2sgTWVkaWFTdHJlYW1UcmFjaw0KICAgICAgICBob29rTWVkaWFTdHJlYW1UcmFjaygpIHsNCiAgICAgICAgICAgIHRoaXMucmVwbGFjZU1ldGhvZCh3aW5kb3csICdNZWRpYVN0cmVhbVRyYWNrJywgKG9yaWdpbmFsTWVkaWFTdHJlYW1UcmFjayA9PiB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNrID0gbmV3IG9yaWdpbmFsTWVkaWFTdHJlYW1UcmFjayguLi5hcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWV0aG9kKHRyYWNrLCAnZ2V0U2V0dGluZ3MnLCAob3JpZ2luYWxHZXRTZXR0aW5ncyA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gb3JpZ2luYWxHZXRTZXR0aW5ncy5jYWxsKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5kZXZpY2VJZCA9PT0gdGhpcy52aXJ0dWFsRGV2aWNlSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnNldHRpbmdzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMudmlydHVhbERldmljZUlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogdGhpcy52aXJ0dWFsR3JvdXBJZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMjgwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA3MjAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogMTYgLyA5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlOiAzMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZ01vZGU6ICd1c2VyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZU1vZGU6ICdub25lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3M7DQogICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTsNCg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2s7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0pLmJpbmQodGhpcykod2luZG93Lk1lZGlhU3RyZWFtVHJhY2spKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEhvb2sgSW1hZ2VDYXB0dXJlDQogICAgICAgIGhvb2tJbWFnZUNhcHR1cmUoKSB7DQogICAgICAgICAgICB0aGlzLnJlcGxhY2VNZXRob2Qod2luZG93LCAnSW1hZ2VDYXB0dXJlJywgKG9yaWdpbmFsSW1hZ2VDYXB0dXJlID0+IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRyYWNrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay5raW5kID09PSAndmlkZW8nICYmIHRyYWNrLmdldFNldHRpbmdzKCkuZGV2aWNlSWQgPT09IHRoaXMudmlydHVhbERldmljZUlkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXJ0dWFsVHJhY2sgPSBuZXcgVmlydHVhbFRyYWNrKHRyYWNrKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JpZ2luYWxJbWFnZUNhcHR1cmUodmlydHVhbFRyYWNrKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yaWdpbmFsSW1hZ2VDYXB0dXJlKHRyYWNrKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfSkuYmluZCh0aGlzKSh3aW5kb3cuSW1hZ2VDYXB0dXJlKSk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBHZW9sb2NhdGlvbiBTcG9vZmluZw0KICAgICAgICBhc3luYyBnZXRDb29yZGluYXRlc0Zyb21BZGRyZXNzKGFkZHJlc3MpIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3Qoew0KICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLA0KICAgICAgICAgICAgICAgICAgICB1cmw6IGBodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/cT0ke2VuY29kZVVSSUNvbXBvbmVudChhZGRyZXNzKX0mZm9ybWF0PWpzb25gLA0KICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZS5yZXNwb25zZVRleHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChkYXRhWzBdLmxhdCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQoZGF0YVswXS5sb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIk5vIHJlc3VsdHMgZm91bmQiKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGdldFJhbmRvbU9mZnNldChtYXhPZmZzZXQgPSAwLjAwMDA1KSB7DQogICAgICAgICAgICByZXR1cm4gKE1hdGgucmFuZG9tKCkgLSAwLjUpICogMiAqIG1heE9mZnNldDsNCiAgICAgICAgfQ0KDQogICAgICAgIGFzeW5jIHVwZGF0ZU1vY2tlZEdlb2xvY2F0aW9uKCkgew0KICAgICAgICAgICAgY29uc3Qgc2Nob29sSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjanMtc2Nob29sLW5hbWUtc2VhcmNoJyk7DQogICAgICAgICAgICBpZiAoc2Nob29sSW5wdXQgJiYgc2Nob29sSW5wdXQudmFsdWUpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IGF3YWl0IHRoaXMuZ2V0Q29vcmRpbmF0ZXNGcm9tQWRkcmVzcyhzY2hvb2xJbnB1dC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2NrZWRHZW9sb2NhdGlvbiA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogY29vcmRpbmF0ZXMubGF0aXR1ZGUgKyB0aGlzLmdldFJhbmRvbU9mZnNldCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogY29vcmRpbmF0ZXMubG9uZ2l0dWRlICsgdGhpcy5nZXRSYW5kb21PZmZzZXQoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogMzAgKyBNYXRoLnJhbmRvbSgpICogMjANCiAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciB1cGRhdGluZyBtb2NrZWQgZ2VvbG9jYXRpb246IiwgZXJyb3IpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEhvb2sgR2VvbG9jYXRpb24NCiAgICAgICAgaG9va0dlb2xvY2F0aW9uKCkgew0KICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWV0aG9kKG5hdmlnYXRvci5nZW9sb2NhdGlvbiwgJ2dldEN1cnJlbnRQb3NpdGlvbicsIGFzeW5jIChzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG9wdGlvbnMpID0+IHsNCiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU1vY2tlZEdlb2xvY2F0aW9uKCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMubW9ja2VkR2VvbG9jYXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkczogew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogdGhpcy5tb2NrZWRHZW9sb2NhdGlvbi5sYXRpdHVkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLm1vY2tlZEdlb2xvY2F0aW9uLmxvbmdpdHVkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3k6IHRoaXMubW9ja2VkR2VvbG9jYXRpb24uYWNjdXJhY3kNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0sIDI1MDAgKyBNYXRoLnJhbmRvbSgpICogNTAwKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZHNMb29rdXBUYWJsZS5nZXQobmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbikuY2FsbChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24sIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIHRoaXMucmVwbGFjZU1ldGhvZChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24sICd3YXRjaFBvc2l0aW9uJywgYXN5bmMgKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9ucykgPT4gew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vY2tlZEdlb2xvY2F0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhdGNoSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgIH0sIDUwMDApOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2F0Y2hJZDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRob2RzTG9va3VwVGFibGUuZ2V0KG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKS5jYWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbiwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBvcHRpb25zKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWV0aG9kKG5hdmlnYXRvci5nZW9sb2NhdGlvbiwgJ2NsZWFyV2F0Y2gnLCAod2F0Y2hJZCkgPT4gew0KICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwod2F0Y2hJZCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tLS0tIFZpcnR1YWwgVHJhY2sgQ2xhc3MgLS0tLS0tLS0NCiAgICBjbGFzcyBWaXJ0dWFsVHJhY2sgew0KICAgICAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbFRyYWNrKSB7DQogICAgICAgICAgICB0aGlzLm9yaWdpbmFsVHJhY2sgPSBvcmlnaW5hbFRyYWNrOw0KICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsNCiAgICAgICAgICAgIHRoaXMubXV0ZWQgPSBmYWxzZTsNCiAgICAgICAgICAgIHRoaXMuY29uc3RyYWludHMgPSB7fTsNCiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSB7DQogICAgICAgICAgICAgICAgZGV2aWNlSWQ6IHRoaXMudmlydHVhbERldmljZUlkLA0KICAgICAgICAgICAgICAgIGdyb3VwSWQ6IHRoaXMudmlydHVhbEdyb3VwSWQsDQogICAgICAgICAgICAgICAgd2lkdGg6IDEyODAsDQogICAgICAgICAgICAgICAgaGVpZ2h0OiA3MjAsDQogICAgICAgICAgICAgICAgYXNwZWN0UmF0aW86IDE2IC8gOSwNCiAgICAgICAgICAgICAgICBmcmFtZVJhdGU6IDMwLA0KICAgICAgICAgICAgICAgIGZhY2luZ01vZGU6ICd1c2VyJw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMudmlydHVhbERldmljZUlkOyB9DQogICAgICAgIGdldCBraW5kKCkgeyByZXR1cm4gJ3ZpZGVvJzsgfQ0KICAgICAgICBnZXQgbGFiZWwoKSB7IHJldHVybiAnJzsgfQ0KICAgICAgICBnZXQgZW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuZW5hYmxlZDsgfQ0KICAgICAgICBnZXQgbXV0ZWQoKSB7IHJldHVybiB0aGlzLm11dGVkOyB9DQogICAgICAgIGdldCByZWFkeVN0YXRlKCkgeyByZXR1cm4gJ2xpdmUnOyB9DQoNCiAgICAgICAgZ2V0Q29uc3RyYWludHMoKSB7IHJldHVybiB7IC4uLnRoaXMuY29uc3RyYWludHMgfTsgfQ0KICAgICAgICBnZXRTZXR0aW5ncygpIHsgcmV0dXJuIHsgLi4udGhpcy5zZXR0aW5ncyB9OyB9DQoNCiAgICAgICAgZ2V0Q2FwYWJpbGl0aWVzKCkgew0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICB3aWR0aDogeyBtaW46IDY0MCwgbWF4OiAxOTIwIH0sDQogICAgICAgICAgICAgICAgaGVpZ2h0OiB7IG1pbjogNDgwLCBtYXg6IDEwODAgfSwNCiAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogeyBtaW46IDEuMzMsIG1heDogMS43OCB9LA0KICAgICAgICAgICAgICAgIGZyYW1lUmF0ZTogeyBtaW46IDE1LCBtYXg6IDYwIH0sDQogICAgICAgICAgICAgICAgZmFjaW5nTW9kZTogWyd1c2VyJywgJ2Vudmlyb25tZW50J10sDQogICAgICAgICAgICAgICAgcmVzaXplTW9kZTogWydub25lJywgJ2Nyb3AtYW5kLXNjYWxlJ10NCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBhc3luYyBhcHBseUNvbnN0cmFpbnRzKG5ld0NvbnN0cmFpbnRzKSB7DQogICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuY29uc3RyYWludHMsIG5ld0NvbnN0cmFpbnRzKTsNCiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHN0b3AoKSB7DQogICAgICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxUcmFjay5zdG9wKCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLS0tLSAgTW9kaWZ5IE1lZGlhRGV2aWNlSW5mbyAtLS0tLS0tLQ0KICAgIGNvbnN0IE9yaWdpbmFsTWVkaWFEZXZpY2VJbmZvID0gdW5zYWZlV2luZG93Lk1lZGlhRGV2aWNlSW5mbzsNCg0KICAgIGZ1bmN0aW9uIE1lZGlhRGV2aWNlSW5mbyh7IGRldmljZUlkLCBncm91cElkLCBraW5kLCBsYWJlbCB9KSB7DQogICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBNZWRpYURldmljZUluZm8pKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhRGV2aWNlSW5mbyh7IGRldmljZUlkLCBncm91cElkLCBraW5kLCBsYWJlbCB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsNCiAgICAgICAgICAgIGRldmljZUlkOiB7DQogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGRldmljZUlkOyB9LA0KICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBncm91cElkOiB7DQogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGdyb3VwSWQ7IH0sDQogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGtpbmQ6IHsNCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4ga2luZDsgfSwNCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgbGFiZWw6IHsNCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGFiZWw7IH0sDQogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWVkaWFEZXZpY2VJbmZvLCAnbGVuZ3RoJywgeyB2YWx1ZTogMCwgd3JpdGFibGU6IGZhbHNlIH0pOw0KICAgIE1lZGlhRGV2aWNlSW5mby5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9yaWdpbmFsTWVkaWFEZXZpY2VJbmZvLnByb3RvdHlwZSk7DQogICAgTWVkaWFEZXZpY2VJbmZvLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lZGlhRGV2aWNlSW5mbzsNCg0KICAgIHVuc2FmZVdpbmRvdy5NZWRpYURldmljZUluZm8gPSBNZWRpYURldmljZUluZm87DQoNCiAgICAvLyAtLS0tLS0tLSBJbml0aWFsaXplIC0tLS0tLS0tDQogICAgbmV3IFN0ZWFsdGhVSSgpOw0KICAgIG5ldyBBUElIb29rKCk7DQoNCiAgICBjb25zb2xlLmxvZygnRW5oYW5jZWQgVmlydHVhbCBDYW1lcmEgSG9vayBpbmplY3RlZCcpOw0KfSkoKTs=
复制代码
爱生活,爱奶昔~
回复

使用道具 举报

发表于 2025-4-20 19:31:02 | 查看全部
感谢大佬分享
爱生活,爱奶昔~
发表于 2025-4-20 19:54:18 | 查看全部
大佬也太强了吧
爱生活,爱奶昔~
发表于 2025-4-20 20:31:28 | 查看全部
大佬也太强了吧
爱生活,爱奶昔~
发表于 2025-4-20 20:34:36 | 查看全部
膜拜大佬
爱生活,爱奶昔~
发表于 2025-4-20 20:42:28 来自手机 | 查看全部
膜拜
爱生活,爱奶昔~
发表于 2025-4-20 22:22:50 来自手机 | 查看全部
厉害大佬!
爱生活,爱奶昔~
发表于 2025-4-21 01:02:48 | 查看全部
感谢大佬分享
爱生活,爱奶昔~
发表于 2025-4-21 12:57:57 来自手机 | 查看全部
6666
爱生活,爱奶昔~
发表于 2025-4-22 09:50:10 | 查看全部
感谢大佬分享
爱生活,爱奶昔~
发表于 2025-4-22 18:24:24 来自手机 | 查看全部
试试,谢谢!
爱生活,爱奶昔~
发表于 2025-4-23 00:28:00 来自手机 | 查看全部
大佬也太强了吧
爱生活,爱奶昔~
发表于 2025-4-23 20:18:04 | 查看全部
爱生活,爱奶昔~
发表于 2025-4-23 20:44:40 | 查看全部
大佬nb!
爱生活,爱奶昔~
发表于 2025-4-23 21:05:44 | 查看全部
11111
爱生活,爱奶昔~
发表于 2025-4-24 00:17:32 来自手机 | 查看全部
牛逼
爱生活,爱奶昔~
发表于 2025-4-24 07:52:35 | 查看全部
看看咋用
爱生活,爱奶昔~
发表于 2025-4-24 19:02:49 | 查看全部
Thanks!
爱生活,爱奶昔~
发表于 2025-4-24 23:02:03 来自手机 | 查看全部
看看怎么弄
爱生活,爱奶昔~
发表于 2025-4-25 00:27:23 来自手机 | 查看全部
感谢分享
爱生活,爱奶昔~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

© 2025 Nyarime 沪ICP备13020230号-1|沪公网安备 31010702007642号手机版小黑屋RSS
返回顶部 关灯 在本版发帖
快速回复 返回顶部 返回列表