LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZvbGRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwovKioKICogQSBzaW1wbGUgSU1vZHVsZVByb2plY3QgdGhhdCBtYXBzIGEgZm9sZGVyIHdpdGhpbiBhIHByb2plY3QKICogKG9yIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IGl0c2VsZikgdG8gdGhlIG1vZHVsZS4KICogCiAqIEBwbGFubmVkZm9yIDEuMAogKi8KcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RNb2R1bGUgZXh0ZW5kcyBNb2R1bGVEZWxlZ2F0ZSB7Cglwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKCXByb3RlY3RlZCBJUGF0aCByb290OwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IHByb2plY3QgbW9kdWxlLgoJICovCglwdWJsaWMgUHJvamVjdE1vZHVsZSgpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgcHJvamVjdCBtb2R1bGUgaW4gdGhlIGdpdmVuIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIG1vZHVsZQoJICovCglwdWJsaWMgUHJvamVjdE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7CgkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbi4KCSAqIAoJICogQHJldHVybiB0aGUgcHJvamVjdCB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIGluCgkgKi8KCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewoJCXJldHVybiBwcm9qZWN0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXIuIFRoZSByb290IGZvbGRlciBpcyB0aGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoCgkgKiB0aGF0IHBvaW50cyB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIG1vZHVsZS4gQWxsIHJlc291cmNlcyBjb250YWluZWQKCSAqIHdpdGhpbiB0aGlzIGZvbGRlciBiZWxvbmcgdG8gdGhlIG1vZHVsZS4KCSAqIAoJICogQHJldHVybiB0aGUgcm9vdCBwcm9qZWN0LXJlbGF0aXZlIGZvbGRlciB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cwoJICogICAgb2YgdGhlIG1vZHVsZQoJICovCglwdWJsaWMgSVBhdGggZ2V0Um9vdEZvbGRlcigpIHsKCQlyZXR1cm4gcm9vdDsKCX0KCgkvKgoJICogQHNlZSBJTW9kdWxlUHJvamVjdCNnZXRNb2R1bGVSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhKQoJICovCgkvKnB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YSBnZXRNb2R1bGVSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPiBnZXRNb2R1bGVSZXNvdXJjZURlbHRhIik7CgkJSVBhdGggcm9vdDIgPSBudWxsOwoJCXRyeSB7CgkJCXJvb3QyID0gZ2V0Um9vdEZvbGRlcigpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkVycm9yIGdldHRpbmcgcm9vdDIiKTsKCQl9CgkJaWYgKHJvb3QyID09IG51bGwpIHsKCQkJcmV0dXJuIGNvbnZlcnRDaGlsZHJlbihkZWx0YSwgbnVsbCk7CgkJfQoJCWNsYXNzIEhlbHBlciB7CgkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKCQkJSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEyOwoJCX0KCQlmaW5hbCBIZWxwZXIgaGVscGVyID0gbmV3IEhlbHBlcigpOwoJCWZpbmFsIElQYXRoIHJvb3QzID0gcm9vdDI7CgkJdHJ5IHsKCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CgkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSB2aXNpdERlbHRhKSB7CgkJCQkJaWYgKCFoZWxwZXIuZm91bmQgJiYgcm9vdDMuZXF1YWxzKHZpc2l0RGVsdGEuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKSkgewoJCQkJCQloZWxwZXIuZGVsdGEyID0gY29udmVydENoaWxkcmVuKHZpc2l0RGVsdGEsIG51bGwpOwoJCQkJCQloZWxwZXIuZm91bmQgPSB0cnVlOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9KTsKCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPCBnZXRNb2R1bGVSZXNvdXJjZURlbHRhIik7CgkJCXJldHVybiBoZWxwZXIuZGVsdGEyOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgbW9kdWxlIHJlc291cmNlIGRlbHRhIik7CgkJfQoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIjwgZ2V0TW9kdWxlUmVzb3VyY2VEZWx0YSBudWxsIik7CgkJcmV0dXJuIG51bGw7Cgl9Ki8KCQoJLyoqCgkgKiAKCSAqLwoJLypwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGEgY29udmVydENoaWxkcmVuKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJTW9kdWxlRm9sZGVyIHBhcmVudCkgewoJCWludCBmbGFncyA9IGRlbHRhLmdldEtpbmQoKTsKCQlpbnQga2luZCA9IElNb2R1bGVSZXNvdXJjZURlbHRhLk5PX0NIQU5HRTsKCQlpZiAoZmxhZ3MgPT0gSVJlc291cmNlRGVsdGEuQURERUQpCgkJCWtpbmQgPSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRDsKCQllbHNlIGlmIChmbGFncyA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQoJCQlraW5kID0gSU1vZHVsZVJlc291cmNlRGVsdGEuUkVNT1ZFRDsKCQllbHNlIGlmIChmbGFncyA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKQoJCQlraW5kID0gSU1vZHVsZVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKCQkKCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwoJCQoJCUlNb2R1bGVSZXNvdXJjZSBwdWJSZXNvdXJjZSA9IG51bGw7CgkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKCQkJcHViUmVzb3VyY2UgPSBuZXcgUHJvamVjdE1vZHVsZUZvbGRlcih0aGlzLCBwYXJlbnQsIChJQ29udGFpbmVyKSByZXNvdXJjZSk7CQoJCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKCQkJaWYgKGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykKCQkJCXJldHVybiBudWxsOwoJCQlwdWJSZXNvdXJjZSA9IG5ldyBQcm9qZWN0TW9kdWxlRmlsZSh0aGlzLCBwYXJlbnQsIChJRmlsZSkgcmVzb3VyY2UpOwoJCX0KCQkKCQlNb2R1bGVSZXNvdXJjZURlbHRhIGRlcGxveURlbHRhID0gbmV3IE1vZHVsZVJlc291cmNlRGVsdGEocHViUmVzb3VyY2UsIGtpbmQpOwoJCQoJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CgkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgcHViUmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7CgkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJSU1vZHVsZVJlc291cmNlRGVsdGEgY2hpbGREZWx0YSA9IGNvbnZlcnRDaGlsZHJlbihjaGlsZHJlbltpXSwgKElNb2R1bGVGb2xkZXIpIHB1YlJlc291cmNlKTsKCQkJCWlmIChjaGlsZERlbHRhICE9IG51bGwpCgkJCQkJZGVwbG95RGVsdGEuYWRkQ2hpbGQoY2hpbGREZWx0YSk7CgkJCX0KCQl9CgkJcmV0dXJuIGRlcGxveURlbHRhOwoJfSovCgoJLyoqCgkgKiBIZWxwZXIgbWV0aG9kIC0gcmV0dXJucyB0aGUgbW9kdWxlJ3MgaWQuCgkgKiAKCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBpZAoJICovCglwdWJsaWMgU3RyaW5nIGdldElkKCkgewoJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwoJCS8vcmV0dXJuIGdldE1vZHVsZSgpLmdldElkKCk7Cgl9CgoJLyoqCgkgKiBAc2VlIE1vZHVsZURlbGVnYXRlI3ZhbGlkYXRlKCkKCSAqLwoJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBAc2VlIE1vZHVsZURlbGVnYXRlI21lbWJlcnMoKQoJICovCglwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlJUGF0aCByb290MiA9IG51bGw7CgkJdHJ5IHsKCQkJcm9vdDIgPSBnZXRSb290Rm9sZGVyKCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJLy8gaWdub3JlCgkJfQoJCXRyeSB7CgkJCWlmIChyb290MiA9PSBudWxsIHx8IHJvb3QyLmlzUm9vdCgpIHx8IHJvb3QyLmVxdWFscyhuZXcgUGF0aCgiIikpIHx8IHJvb3QyLmVxdWFscyhuZXcgUGF0aCgiLyIpKSkKCQkJCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoUGF0aC5FTVBUWSwgZ2V0UHJvamVjdCgpKTsKCQkJCgkJCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIocm9vdDIpOwoJCQlyZXR1cm4gZ2V0TW9kdWxlUmVzb3VyY2VzKFBhdGguRU1QVFksIGZvbGRlcik7CgkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CgkJCXRocm93IGU7CgkJfQoJfQoKICAgIHByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRNb2R1bGVSZXNvdXJjZXMoSVBhdGggcGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgogICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7CiAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIGludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKICAgICAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lcjIgPSBnZXRDb250YWluZXJSZXNvdXJjZShyZXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcjIgIT0gbnVsbCAmJiBjb250YWluZXIyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUZvbGRlciBtZiA9IG5ldyBNb2R1bGVGb2xkZXIoY29udGFpbmVyLCBjb250YWluZXIyLmdldE5hbWUoKSwgcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1mLnNldE1lbWJlcnMoZ2V0TW9kdWxlUmVzb3VyY2VzKHBhdGguYXBwZW5kKGNvbnRhaW5lcjIuZ2V0TmFtZSgpKSwgY29udGFpbmVyMikpOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChtZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IGdldEZpbGVSZXNvdXJjZShyZXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQogICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXcgTW9kdWxlRmlsZShmaWxlLCBmaWxlLmdldE5hbWUoKSwgcGF0aCwgZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgSU1vZHVsZVJlc291cmNlW10gbW9kdWxlUmVzb3VyY2VzID0gbmV3IElNb2R1bGVSZXNvdXJjZVtsaXN0LnNpemUoKV07CiAgICAgICAgbGlzdC50b0FycmF5KG1vZHVsZVJlc291cmNlcyk7CiAgICAgICAgcmV0dXJuIG1vZHVsZVJlc291cmNlczsKICAgIH0KICAgIAogICAgcHJvdGVjdGVkIElDb250YWluZXIgZ2V0Q29udGFpbmVyUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKXsKICAgICAgICByZXR1cm4gKElDb250YWluZXIpcmVzb3VyY2U7CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBJRmlsZSBnZXRGaWxlUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKXsKICAgICAgICByZXR1cm4gKElGaWxlKXJlc291cmNlOwogICAgfQoKCS8qKgoJICogSGVscGVyIG1ldGhvZCAtIHJldHVybnMgdGhlIG1vZHVsZSdzIG5hbWUuCgkgKiAKCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBuYW1lCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKCQkvL3JldHVybiBnZXRNb2R1bGUoKS5nZXROYW1lKCk7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbW9kdWxlIGN1cnJlbnRseSBleGlzdHMsIGFuZCBmYWxzZSBpZiBpdCBoYXMKCSAqIGJlZW4gZGVsZXRlZCBvciBtb3ZlZCBhbmQgaXMgbm8gbG9uZ2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9kdWxlLgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CgkJcmV0dXJuIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRQcm9qZWN0KCkuZXhpc3RzKCkpOwoJfQoJCgkvKioKCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCgkgKi8KCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CgkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgUHJvamVjdE1vZHVsZSkpCgkJCXJldHVybiBmYWxzZTsKCgkJUHJvamVjdE1vZHVsZSBkcCA9IChQcm9qZWN0TW9kdWxlKSBvYmo7CgkJLy9pZiAoZ2V0RmFjdG9yeUlkKCkgIT0gbnVsbCAmJiAhZ2V0RmFjdG9yeUlkKCkuZXF1YWxzKGRwLmdldEZhY3RvcnlJZCgpKSkKCQkvLwlyZXR1cm4gZmFsc2U7CgkJCQoJCUlQYXRoIHJvb3QyID0gbnVsbDsKCQl0cnkgewoJCQlyb290MiA9IGdldFJvb3RGb2xkZXIoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJCgkJSVBhdGggcm9vdDMgPSBudWxsOwoJCXRyeSB7CgkJCXJvb3QzID0gZHAuZ2V0Um9vdEZvbGRlcigpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCQkKCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgJiYgIXByb2plY3QuZXF1YWxzKGRwLmdldFByb2plY3QoKSkpCgkJCXJldHVybiBmYWxzZTsKCQkKCQlpZiAoZ2V0SWQoKSAhPSBudWxsICYmICFnZXRJZCgpLmVxdWFscyhkcC5nZXRJZCgpKSkKCQkJcmV0dXJuIGZhbHNlOwoKCQlpZiAocm9vdDIgPT0gbnVsbCAmJiByb290MyAhPSBudWxsKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKHJvb3QyICE9IG51bGwgJiYgIXJvb3QyLmVxdWFscyhyb290MykpCgkJCXJldHVybiBmYWxzZTsKCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGVzIG9mIHRoaXMgbW9kdWxlLgoJICoKCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVbXQoJICovCglwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcygpIHsKCQlyZXR1cm4gbnVsbDsKCX0KfQ==