LyoKICogQ29weXJpZ2h0IChjKSAyMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICoKICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CiAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCiAqCiAqIFBsZWFzZSBjb250YWN0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDQxNTAgTmV0d29yayBDaXJjbGUsIFNhbnRhIENsYXJhLAogKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgogKiBoYXZlIGFueSBxdWVzdGlvbnMuCiAqLwovKgogICAgQHRlc3QKICAgIEBzdW1tYXJ5IHRlc3QgSVNPNjM5LTIgbGFuZ3VhZ2UgY29kZXMKICAgIEBjb21waWxlIC1lbmNvZGluZyBhc2NpaSAtc291cmNlIDEuNCAtdGFyZ2V0IDEuNCBCdWc0MTc1OTk4VGVzdC5qYXZhCiAgICBAcnVuIG1haW4gQnVnNDE3NTk5OFRlc3QKICAgIEBidWcgNDE3NTk5OAoqLwovKgogKgogKgogKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk4IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAogKgogKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAogKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhLCA5NDMwMywgVS5TLkEuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24KICogb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAoIkNvbmZpZGVudGlhbCBJbmZvcm1hdGlvbiIpLiAgWW91CiAqIHNoYWxsIG5vdCBkaXNjbG9zZSBzdWNoIENvbmZpZGVudGlhbCBJbmZvcm1hdGlvbiBhbmQgc2hhbGwgdXNlCiAqIGl0IG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQKICogeW91IGVudGVyZWQgaW50byB3aXRoIFN1bi4KICoKICogVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBzb3VyY2UgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBpcwogKiBjb3B5cmlnaHRlZCBhbmQgb3duZWQgYnkgSUJNLiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3ZpZGVkCiAqIHVuZGVyIHRlcm1zIG9mIGEgTGljZW5zZSBBZ3JlZW1lbnQgYmV0d2VlbiBJQk0gYW5kIFN1bi4KICogVGhpcyB0ZWNobm9sb2d5IGlzIHByb3RlY3RlZCBieSBtdWx0aXBsZSBVUyBhbmQgSW50ZXJuYXRpb25hbAogKiBwYXRlbnRzLiBUaGlzIG5vdGljZSBhbmQgYXR0cmlidXRpb24gdG8gSUJNIG1heSBub3QgYmUgcmVtb3ZlZC4KICoKICovCgppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLmlvLio7CgovKioKICogIEJ1ZzQxNzU5OThUZXN0IHZlcmlmaWVzIHRoYXQgdGhlIGZvbGxvd2luZyBidWcgaGFzIGJlZW4gZml4ZWQ6CiAqICBCdWcgNDE3NTk5OCAtIFRoZSBqYXZhLnV0aWwuTG9jYWxlLmdldElTTzNMYW5ndWFnZSgpIHJldHVybnMgd3JvbmcgcmVzdWx0IGZvciBhIGxvY2FsZSB3aXRoCiAqICAgICAgICAgICBsYW5ndWFnZSBjb2RlICd0YScoVGFtaWwpLgogKi8KcHVibGljIGNsYXNzIEJ1ZzQxNzU5OThUZXN0IGV4dGVuZHMgTG9jYWxlVGVzdEZtd2sgewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3IEJ1ZzQxNzU5OThUZXN0KCkucnVuKGFyZ3MpOwogICAgICAgIC8vZ2VuZXJhdGVUYWJsZXMoKTsgICAgLy91bmNvbW1lbnQgdGhpcyB0byByZWdlbmVyYXRlIGRhdGEgdGFibGVzCiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYm9vbGVhbiBiYWQgPSBmYWxzZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPREVTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxvY2FsZUNvZGVzID0gQ09ERVNbaV07CiAgICAgICAgICAgIGZpbmFsIExvY2FsZSBsID0gbmV3IExvY2FsZShsb2NhbGVDb2Rlc1swXSwgIiIpOwogICAgICAgICAgICBmaW5hbCBTdHJpbmcgaXNvMyA9IGwuZ2V0SVNPM0xhbmd1YWdlKCk7CiAgICAgICAgICAgIGlmICghaXNvMy5lcXVhbHMobG9jYWxlQ29kZXNbMV0pIC8qJiYgIWlzbzMuZXF1YWxzKGxvY2FsZUNvZGVzWzJdKSovKSB7CiAgICAgICAgICAgICAgICBsb2dsbigiTG9jYWxlKCIrbCsiKSByZXR1cm5lZCBiYWQgSVNPMyBsYW5ndWFnZSBjb2RlLiIKICAgICAgICAgICAgICAgICAgICAgICAgKyIgICBHb3QgJyIraXNvMysiJyBpbnN0ZWFkIG9mICciK2xvY2FsZUNvZGVzWzFdKyInIi8qKyIgb3IgJyIrbG9jYWxlQ29kZXNbMl0rIiciKi8pOwogICAgICAgICAgICAgICAgYmFkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYmFkKSB7CiAgICAgICAgICAgIGVycmxuKCJCYWQgSVNPMyBsYW5ndWFnZSBjb2RlcyBkZXRlY3RlZC4iKTsKICAgICAgICB9CiAgICB9CgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gQ09ERVMgPSB7CiAgICAgICAgeyJwdCIsInBvciIsInBvciJ9LAogICAgICAgIHsiZXUiLCJldXMiLCJiYXEifSwKICAgICAgICB7InBzIiwicHVzIiwicHVzIn0sCiAgICAgICAgeyJldCIsImVzdCIsImVzdCJ9LAogICAgICAgIHsia2EiLCJrYXQiLCJnZW8ifSwKICAgICAgICB7ImVzIiwic3BhIiwic3BhIn0sCiAgICAgICAgeyJlbyIsImVwbyIsImVwbyJ9LAogICAgICAgIHsiZW4iLCJlbmciLCJlbmcifSwKICAgICAgICB7InBsIiwicG9sIiwicG9sIn0sCiAgICAgICAgeyJlbCIsImVsbCIsImdyZSJ9LAogICAgICAgIHsidXoiLCJ1emIiLCJ1emIifSwKICAgICAgICB7Imp2IiwiamF2IiwiamF2In0sCiAgICAgICAgeyJ1ciIsInVyZCIsInVyZCJ9LAogICAgICAgIHsidWsiLCJ1a3IiLCJ1a3IifSwKICAgICAgICB7InVnIiwidWlnIiwidWlnIn0sCiAgICAgICAgeyJ6dSIsInp1bCIsInp1bCJ9LAogICAgICAgIHsiamEiLCJqcG4iLCJqcG4ifSwKICAgICAgICB7Im9yIiwib3JpIiwib3JpIn0sCiAgICAgICAgeyJvbSIsIm9ybSIsIm9ybSJ9LAogICAgICAgIHsiemgiLCJ6aG8iLCJjaGkifSwKICAgICAgICB7InR3IiwidHdpIiwidHdpIn0sCiAgICAgICAgeyJkZSIsImRldSIsImdlciJ9LAogICAgICAgIHsib2MiLCJvY2kiLCJvY2kifSwKICAgICAgICB7InphIiwiemhhIiwiemhhIn0sCiAgICAgICAgeyJ0dCIsInRhdCIsInRhdCJ9LAogICAgICAgIHsiaXUiLCJpa3UiLCJpa3UifSwKICAgICAgICB7InRzIiwidHNvIiwidHNvIn0sCiAgICAgICAgeyJpdCIsIml0YSIsIml0YSJ9LAogICAgICAgIHsidHIiLCJ0dXIiLCJ0dXIifSwKICAgICAgICB7ImRhIiwiZGFuIiwiZGFuIn0sCiAgICAgICAgeyJpcyIsImlzbCIsImljZSJ9LAogICAgICAgIHsidG8iLCJ0b24iLCJ0b24ifSwKICAgICAgICB7InRsIiwidGdsIiwidGdsIn0sCiAgICAgICAgeyJ0ayIsInR1ayIsInR1ayJ9LAogICAgICAgIHsiaWsiLCJpcGsiLCJpcGsifSwKICAgICAgICB7InRpIiwidGlyIiwidGlyIn0sCiAgICAgICAgeyJ0aCIsInRoYSIsInRoYSJ9LAogICAgICAgIHsidGciLCJ0Z2siLCJ0Z2sifSwKICAgICAgICB7InRlIiwidGVsIiwidGVsIn0sCiAgICAgICAgeyJjeSIsImN5bSIsIndlbCJ9LAogICAgICAgIHsiaWUiLCJpbGUiLCJpbGUifSwKICAgICAgICB7ImlkIiwiaW5kIiwiaW5kIn0sCiAgICAgICAgeyJ0YSIsInRhbSIsInRhbSJ9LAogICAgICAgIHsiaWEiLCJpbmEiLCJpbmEifSwKICAgICAgICB7ImNzIiwiY2VzIiwiY3plIn0sCiAgICAgICAgeyJ5byIsInlvciIsInlvciJ9LAogICAgICAgIHsibm8iLCJub3IiLCJub3IifSwKICAgICAgICB7ImNvIiwiY29zIiwiY29zIn0sCiAgICAgICAgeyJubCIsIm5sZCIsImR1dCJ9LAogICAgICAgIHsieWkiLCJ5aWQiLCJ5aWQifSwKICAgICAgICB7Imh5IiwiaHllIiwiYXJtIn0sCiAgICAgICAgeyJzdyIsInN3YSIsInN3YSJ9LAogICAgICAgIHsibmUiLCJuZXAiLCJuZXAifSwKICAgICAgICB7InN2Iiwic3dlIiwic3dlIn0sCiAgICAgICAgeyJzdSIsInN1biIsInN1biJ9LAogICAgICAgIHsiaHUiLCJodW4iLCJodW4ifSwKICAgICAgICB7Im5hIiwibmF1IiwibmF1In0sCiAgICAgICAgeyJzciIsInNycCIsInNjYyJ9LAogICAgICAgIHsiY2EiLCJjYXQiLCJjYXQifSwKICAgICAgICB7InNxIiwic3FpIiwiYWxiIn0sCiAgICAgICAgeyJociIsImhydiIsInNjciJ9LAogICAgICAgIHsic28iLCJzb20iLCJzb20ifSwKICAgICAgICB7InNuIiwic25hIiwic25hIn0sCiAgICAgICAgeyJzbSIsInNtbyIsInNtbyJ9LAogICAgICAgIHsic2wiLCJzbHYiLCJzbHYifSwKICAgICAgICB7InNrIiwic2xrIiwic2xvIn0sCiAgICAgICAgeyJzaSIsInNpbiIsInNpbiJ9LAogICAgICAgIHsiaGkiLCJoaW4iLCJoaW4ifSwKICAgICAgICB7Im15IiwibXlhIiwiYnVyIn0sCiAgICAgICAgeyJzZCIsInNuZCIsInNuZCJ9LAogICAgICAgIHsiaGUiLCJoZWIiLCJoZWIifSwKICAgICAgICB7InNhIiwic2FuIiwic2FuIn0sCiAgICAgICAgeyJtdCIsIm1sdCIsIm1sdCJ9LAogICAgICAgIHsibXMiLCJtc2EiLCJtYXkifSwKICAgICAgICB7ImhhIiwiaGF1IiwiaGF1In0sCiAgICAgICAgeyJtciIsIm1hciIsIm1hciJ9LAogICAgICAgIHsiYnIiLCJicmUiLCJicmUifSwKICAgICAgICB7Im1vIiwibW9sIiwibW9sIn0sCiAgICAgICAgeyJibyIsImJvZCIsInRpYiJ9LAogICAgICAgIHsibW4iLCJtb24iLCJtb24ifSwKICAgICAgICB7ImJuIiwiYmVuIiwiYmVuIn0sCiAgICAgICAgeyJtbCIsIm1hbCIsIm1hbCJ9LAogICAgICAgIHsibWsiLCJta2QiLCJtYWMifSwKICAgICAgICB7InhoIiwieGhvIiwieGhvIn0sCiAgICAgICAgeyJtaSIsIm1yaSIsIm1hbyJ9LAogICAgICAgIHsiYmkiLCJiaXMiLCJiaXMifSwKICAgICAgICB7ImJoIiwiYmloIiwiYmloIn0sCiAgICAgICAgeyJtZyIsIm1sZyIsIm1sZyJ9LAogICAgICAgIHsiYmciLCJidWwiLCJidWwifSwKICAgICAgICB7InJ3Iiwia2luIiwia2luIn0sCiAgICAgICAgeyJiZSIsImJlbCIsImJlbCJ9LAogICAgICAgIHsicnUiLCJydXMiLCJydXMifSwKICAgICAgICB7Imd1IiwiZ3VqIiwiZ3VqIn0sCiAgICAgICAgeyJiYSIsImJhayIsImJhayJ9LAogICAgICAgIHsicm8iLCJyb24iLCJydW0ifSwKICAgICAgICB7InJtIiwicm9oIiwicm9oIn0sCiAgICAgICAgeyJnbiIsImdybiIsImdybiJ9LAogICAgICAgIHsiYXoiLCJhemUiLCJhemUifSwKICAgICAgICB7ImF5IiwiYXltIiwiYXltIn0sCiAgICAgICAgeyJnZCIsImdsYSIsImdsYSJ9LAogICAgICAgIHsibHYiLCJsYXYiLCJsYXYifSwKICAgICAgICB7Imx0IiwibGl0IiwibGl0In0sCiAgICAgICAgeyJnYSIsImdsZSIsImdsZSJ9LAogICAgICAgIHsiYXMiLCJhc20iLCJhc20ifSwKICAgICAgICB7ImFyIiwiYXJhIiwiYXJhIn0sCiAgICAgICAgeyJ3byIsIndvbCIsIndvbCJ9LAogICAgICAgIHsibG4iLCJsaW4iLCJsaW4ifSwKICAgICAgICB7ImFtIiwiYW1oIiwiYW1oIn0sCiAgICAgICAgeyJmeSIsImZyeSIsImZyeSJ9LAogICAgICAgIHsiYWYiLCJhZnIiLCJhZnIifSwKICAgICAgICB7InF1IiwicXVlIiwicXVlIn0sCiAgICAgICAgeyJhYiIsImFiayIsImFiayJ9LAogICAgICAgIHsibGEiLCJsYXQiLCJsYXQifSwKICAgICAgICB7ImFhIiwiYWFyIiwiYWFyIn0sCiAgICAgICAgeyJmciIsImZyYSIsImZyZSJ9LAogICAgICAgIHsiZm8iLCJmYW8iLCJmYW8ifSwKICAgICAgICB7ImZqIiwiZmlqIiwiZmlqIn0sCiAgICAgICAgeyJmaSIsImZpbiIsImZpbiJ9LAogICAgICAgIHsia3kiLCJraXIiLCJraXIifSwKICAgICAgICB7Imt1Iiwia3VyIiwia3VyIn0sCiAgICAgICAgeyJmYSIsImZhcyIsInBlciJ9LAogICAgICAgIHsia3MiLCJrYXMiLCJrYXMifSwKICAgICAgICB7InZvIiwidm9sIiwidm9sIn0sCiAgICAgICAgeyJrbyIsImtvciIsImtvciJ9LAogICAgICAgIHsia24iLCJrYW4iLCJrYW4ifSwKICAgICAgICB7ImtrIiwia2F6Iiwia2F6In0sCiAgICAgICAgeyJ2aSIsInZpZSIsInZpZSJ9LAogICAgfTsKCi8qCiAgICBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRhYmxlIGFib3ZlIGZyb20gdGhlIHR3byBJU08gc3RhbmRhcmRzLgogICAgSXQgbWF0Y2hlcyB0aGUgbGFuZ3VhZ2UgbmFtZXMgKG5vdCB0aGUgY29kZXMpIGZyb20gYm90aCBzdGFuZGFyZHMgdG8gYXNzb2NpYXRlCiAgICB0aGUgdHdvIGFuZCB0aHJlZSBsZXR0ZXIgY29kZXMuCgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTTzYzOSA9ICJkOlxcdGVtcFxcaXNvNjM5LnR4dCI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNPNjM5MiA9ICJkOlxcdGVtcFxcaXNvLTYzOS0yLnR4dCI7CiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdlbmVyYXRlVGFibGVzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIElTTzYzOUZpbGUgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoSVNPNjM5KSk7CiAgICAgICAgICAgIEhhc2h0YWJsZSBpNjM5ID0gbmV3IEhhc2h0YWJsZSgpOwogICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lID0gSVNPNjM5RmlsZS5yZWFkTGluZSgpOyBsaW5lICE9IG51bGw7IGxpbmUgPSBJU082MzlGaWxlLnJlYWRMaW5lKCkpIHsKICAgICAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmR4ID0gbGluZS5pbmRleE9mKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzEgPSBsaW5lLnN1YnN0cmluZygwLCBuZHgpOwogICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZHgyID0gbGluZS5pbmRleE9mKCcgJywgbmR4KzEpOwogICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmcyID0gbGluZS5zdWJzdHJpbmcobmR4KzEsIG5keDIgPCAwID8gbGluZS5sZW5ndGgoKSA6IG5keDIpOwogICAgICAgICAgICAgICAgICAgIGk2MzkucHV0KGFyZzEsIGFyZzIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBJU082MzkyRmlsZSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihJU082MzkyKSk7CiAgICAgICAgICAgIEhhc2h0YWJsZSBpNjM5MiA9IG5ldyBIYXNodGFibGUoKTsKICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA9IElTTzYzOTJGaWxlLnJlYWRMaW5lKCk7IGxpbmUgIT0gbnVsbDsgbGluZSA9IElTTzYzOTJGaWxlLnJlYWRMaW5lKCkpIHsKICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZHggPSBsaW5lLmluZGV4T2YoJyAnKTsKICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZHgyID0gbGluZS5pbmRleE9mKCcgJywgbmR4KzEpOwogICAgICAgICAgICAgICAgaW50IG5keDMgPSBsaW5lLmluZGV4T2YoJyAnLCBuZHgyKzEpOwogICAgICAgICAgICAgICAgaWYgKG5keDMgPCAwKSBuZHgzID0gbGluZS5sZW5ndGgoKTsKICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmcxID0gbGluZS5zdWJzdHJpbmcoMCwgbmR4KTsKICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmcyID0gbGluZS5zdWJzdHJpbmcobmR4KzEsIG5keDIpOwogICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzMgPSBsaW5lLnN1YnN0cmluZyhuZHgyKzEsIG5keDMpOwogICAgICAgICAgICAgICAgaTYzOTIucHV0KGFyZzMsIG5ldyBJU082MzkyRW50cnkoYXJnMSwgYXJnMikpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gaTYzOS5rZXlzKCk7CiAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CiAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5hbWUgPSBpNjM5LmdldChrZXkpOwogICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gaTYzOTIuZ2V0KG5hbWUpOwoKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlwiIitrZXkrIlwiLCIpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigifSwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKICAgICAgICB9CiAgICB9CgoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIElTTzYzOTJFbnRyeSB7CiAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjb2RlOwogICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKICAgICAgICBwdWJsaWMgSVNPNjM5MkVudHJ5KFN0cmluZyBjb2RlLCBTdHJpbmcgbmFtZSkgewogICAgICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOwogICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIH0KICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gIlwiIitjb2RlKyJcIixcIiIrbmFtZSsiXCIiOwogICAgICAgIH0KCiAgICB9CiovCgp9CgovKgoKZGF0YSBmcm9tIGZ0cDovL2RrdXVnLmRrIG9uIE1hcmNoIDQsIDE5OTkKdmVyaWZpZWQgYnkgaHR0cDovL3d3dy50cmlhY29tLmNvbS9hcmNoaXZlL2lzbzYzOS0yLmVuLmh0bWwKCmlzbyA2MzkgZGF0YQphYSBBZmFyCmFiIEFia2hhemlhbgphZiBBZnJpa2FhbnMKYW0gQW1oYXJpYwphciBBcmFiaWMKYXMgQXNzYW1lc2UKYXkgQXltYXJhCmF6IEF6ZXJiYWlqYW5pCmJhIEJhc2hraXIKYmUgQmVsYXJ1c3NpYW4KYmcgQnVsZ2FyaWFuCmJoIEJpaGFyaQpiaSBCaXNsYW1hCmJuIEJlbmdhbGkKYm8gVGliZXRhbgpiciBCcmV0b24KY2EgQ2F0YWxhbgpjbyBDb3JzaWNhbgpjcyBDemVjaApjeSBXZWxzaApkYSBEYW5pc2gKZGUgR2VybWFuCmR6IEJodXRhbmkKZWwgR3JlZWsKZW4gRW5nbGlzaAplbyBFc3BlcmFudG8KZXMgU3BhbmlzaApldCBFc3RvbmlhbgpldSBCYXNxdWUKZmEgUGVyc2lhbgpmaSBGaW5uaXNoCmZqIEZpamlhbgpmbyBGYXJvZXNlCmZyIEZyZW5jaApmeSBGcmlzaWFuCmdhIElyaXNoCmdkIEdhZWxpYwpnbCBHYWxpY2lhbgpnbiBHdWFyYW5pCmd1IEd1amFyYXRpCmhhIEhhdXNhCmhlIEhlYnJldwpoaSBIaW5kaQpociBDcm9hdGlhbgpodSBIdW5nYXJpYW4KaHkgQXJtZW5pYW4KaWEgSW50ZXJsaW5ndWEKaWQgSW5kb25lc2lhbgppZSBJbnRlcmxpbmd1ZQppayBJbnVwaWFrCmlzIEljZWxhbmRpYwppdCBJdGFsaWFuCml1IEludWt0aXR1dApqYSBKYXBhbmVzZQpqdyBKYXZhbmVzZQprYSBHZW9yZ2lhbgprayBLYXpha2gKa2wgR3JlZW5sYW5kaWMKa20gQ2FtYm9kaWFuCmtuIEthbm5hZGEKa28gS29yZWFuCmtzIEthc2htaXJpCmt1IEt1cmRpc2gKa3kgS2lyZ2hpegpsYSBMYXRpbgpsbiBMaW5nYWxhCmxvIExhb3RoaWFuCmx0IExpdGh1YW5pYW4KbHYgTGF0dmlhbgptZyBNYWxhZ2FzeQptaSBNYW9yaQptayBNYWNlZG9uaWFuCm1sIE1hbGF5YWxhbQptbiBNb25nb2xpYW4KbW8gTW9sZGF2aWFuCm1yIE1hcmF0aGkKbXMgTWFsYXkKbXQgTWFsdGVzZQpteSBCdXJtZXNlCm5hIE5hdXJ1Cm5lIE5lcGFsaQpubCBEdXRjaApubyBOb3J3ZWdpYW4Kb2MgT2NjaXRhbgpvbSBPcm9tbwpvciBPcml5YQpwYSBQdW5qYWJpCnBsIFBvbGlzaApwcyBQdXNodG8KcHQgUG9ydHVndWVzZQpxdSBRdWVjaHVhCnJtIFJhZXRvLVJvbWFuY2UKcm4gS2lydW5kaQpybyBSb21hbmlhbgpydSBSdXNzaWFuCnJ3IEtpbnlhcndhbmRhCnNhIFNhbnNrcml0CnNkIFNpbmRoaQpzZyBTYW5naG8Kc2ggQ3JvYXRpYW4gKFNlcmJvKQpzaSBTaW5oYWxlc2UKc2sgU2xvdmFrCnNsIFNsb3ZlbmlhbgpzbSBTYW1vYW4Kc24gU2hvbmEKc28gU29tYWxpCnNxIEFsYmFuaWFuCnNyIFNlcmJpYW4Kc3MgU2lzd2F0aQpzdCBTZXNvdGhvCnN1IFN1bmRhbmVzZQpzdiBTd2VkaXNoCnN3IFN3YWhpbGkKdGEgVGFtaWwKdGUgVGVsdWd1CnRnIFRhamlrCnRoIFRoYWkKdGkgVGlncmlueWEKdGsgVHVya21lbgp0bCBUYWdhbG9nCnRuIFNldHN3YW5hCnRvIFRvbmdhCnRyIFR1cmtpc2gKdHMgVHNvbmdhCnR0IFRhdGFyCnR3IFR3aQp1ZyBVaWdodXIKdWsgVWtyYWluaWFuCnVyIFVyZHUKdXogVXpiZWsKdmkgVmlldG5hbWVzZQp2byBWb2xhcHVrCndvIFdvbG9mCnhoIFhob3NhCnlpIFlpZGRpc2gKeW8gWW9ydWJhCnphIFpodWFuZwp6aCBDaGluZXNlCnp1IFp1bHUKCklTTyA2MzktMiBkYXRhCgphYXIgYWFyIEFmYXIKYWJrIGFiayBBYmtoYXppYW4KYWNlIGFjZSBBY2hpbmVzZQphY2ggYWNoIEFjb2xpCmFkYSBhZGEgQWRhbmdtZQphZmEgYWZhIEFmcm8tQXNpYXRpYyAoT3RoZXIpCmFmaCBhZmggQWZyaWhpbGkKYWZyIGFmciBBZnJpa2FhbnMKYWthIGFrYSBBa2FuCmFrayBha2sgQWtrYWRpYW4KYWxlIGFsZSBBbGV1dAphbGcgYWxnIEFsZ29ucXVpYW4gbGFuZ3VhZ2VzCmFtaCBhbWggQW1oYXJpYwphbmcgYW5nIEVuZ2xpc2gtT2xkIChjYS4gNDUwLTExMDApCmFwYSBhcGEgQXBhY2hlIGxhbmd1YWdlcwphcmEgYXJhIEFyYWJpYwphcmMgYXJjIEFyYW1haWMKYXJuIGFybiBBcmF1Y2FuaWFuCmFycCBhcnAgQXJhcGFobwphcnQgYXJ0IEFydGlmaWNpYWwgKE90aGVyKQphcncgYXJ3IEFyYXdhawphc20gYXNtIEFzc2FtZXNlCmF0aCBhdGggQXRoYXBhc2NhbiBsYW5ndWFnZXMKYXVzIGF1cyBBdXN0cmFsaWFuIGxhbmd1YWdlcwphdmEgYXZhIEF2YXJpYwphdmUgYXZlIEF2ZXN0YW4KYXdhIGF3YSBBd2FkaGkKYXltIGF5bSBBeW1hcmEKYXplIGF6ZSBBemVyYmFpamFuaQpiYWQgYmFkIEJhbmRhCmJhaSBiYWkgQmFtaWxla2UgbGFuZ3VhZ2VzCmJhayBiYWsgQmFzaGtpcgpiYWwgYmFsIEJhbHVjaGkKYmFtIGJhbSBCYW1iYXJhCmJhbiBiYW4gQmFsaW5lc2UKYmFzIGJhcyBCYXNhCmJhdCBiYXQgQmFsdGljIChPdGhlcikKYmVqIGJlaiBCZWphCmJlbCBiZWwgQmVsYXJ1c3NpYW4KYmVtIGJlbSBCZW1iYQpiZW4gYmVuIEJlbmdhbGkKYmVyIGJlciBCZXJiZXIgKE90aGVyKQpiaG8gYmhvIEJob2pwdXJpCmJpaCBiaWggQmloYXJpCmJpayBiaWsgQmlrb2wKYmluIGJpbiBCaW5pCmJpcyBiaXMgQmlzbGFtYQpibGEgYmxhIFNpa3Npa2EKYm50IGJudCBCYW50dSAoT3RoZXIpCmJvZCB0aWIgVGliZXRhbgpicmEgYnJhIEJyYWoKYnJlIGJyZSBCcmV0b24KYnRrIGJ0ayBCYXRhayAoSW5kb25lc2lhKQpidWEgYnVhIEJ1cmlhdApidWcgYnVnIEJ1Z2luZXNlCmJ1bCBidWwgQnVsZ2FyaWFuCmNhZCBjYWQgQ2FkZG8KY2FpIGNhaSBDZW50cmFsLUFtZXJpY2FuLUluZGlhbiAoT3RoZXIpCmNhciBjYXIgQ2FyaWIKY2F0IGNhdCBDYXRhbGFuCmNhdSBjYXUgQ2F1Y2FzaWFuIChPdGhlcikKY2ViIGNlYiBDZWJ1YW5vCmNlbCBjZWwgQ2VsdGljIChPdGhlcikKY2VzIGN6ZSBDemVjaApjaGEgY2hhIENoYW1vcnJvCmNoYiBjaGIgQ2hpYmNoYQpjaGUgY2hlIENoZWNoZW4KY2hnIGNoZyBDaGFnYXRhaQpjaGsgY2hrIENodXVrZXNlCmNobSBjaG0gTWFyaQpjaG4gY2huIENoaW5vb2stamFyZ29uCmNobyBjaG8gQ2hvY3RhdwpjaHAgY2hwIENoaXBld3lhbgpjaHIgY2hyIENoZXJva2VlCmNodSBjaHUgQ2h1cmNoLVNsYXZpYwpjaHYgY2h2IENodXZhc2gKY2h5IGNoeSBDaGV5ZW5uZQpjbWMgY21jIENoYW1pYyBsYW5ndWFnZXMKY29wIGNvcCBDb3B0aWMKY29yIGNvciBDb3JuaXNoCmNvcyBjb3MgQ29yc2ljYW4KY3BlIGNwZSBDcmVvbGVzLWFuZC1waWRnaW5zLUVuZ2xpc2gtYmFzZWQgKE90aGVyKQpjcGYgY3BmIENyZW9sZXMtYW5kLXBpZGdpbnMtRnJlbmNoLWJhc2VkIChPdGhlcikKY3BwIGNwcCBDcmVvbGVzLWFuZC1waWRnaW5zLVBvcnR1Z3Vlc2UtYmFzZWQgKE90aGVyKQpjcmUgY3JlIENyZWUKY3JwIGNycCBDcmVvbGVzLWFuZC1waWRnaW5zIChPdGhlcikKY3VzIGN1cyBDdXNoaXRpYyAoT3RoZXIpCmN5bSB3ZWwgV2Vsc2gKZGFrIGRhayBEYWtvdGEKZGFuIGRhbiBEYW5pc2gKZGF5IGRheSBEYXlhawpkZWwgZGVsIERlbGF3YXJlCmRlbiBkZW4gU2xhdmUgKEF0aGFwYXNjYW4pCmRldSBnZXIgR2VybWFuCmRnciBkZ3IgRG9ncmliCmRpbiBkaW4gRGlua2EKZGl2IGRpdiBEaXZlaGkKZG9pIGRvaSBEb2dyaQpkcmEgZHJhIERyYXZpZGlhbiAoT3RoZXIpCmR1YSBkdWEgRHVhbGEKZHVtIGR1bSBEdXRjaC1NaWRkbGUgKGNhLiAxMDUwLTEzNTApCmR5dSBkeXUgRHl1bGEKZHpvIGR6byBEem9uZ2toYQplZmkgZWZpIEVmaWsKZWd5IGVneSBFZ3lwdGlhbiAoQW5jaWVudCkKZWthIGVrYSBFa2FqdWsKZWxsIGdyZSBHcmVlayBNb2Rlcm4gKHBvc3QgMTQ1MykKZWx4IGVseCBFbGFtaXRlCmVuZyBlbmcgRW5nbGlzaAplbm0gZW5tIEVuZ2xpc2gtTWlkZGxlICgxMTAwLTE1MDApCmVwbyBlcG8gRXNwZXJhbnRvCmVzdCBlc3QgRXN0b25pYW4KZXVzIGJhcSBCYXNxdWUKZXdlIGV3ZSBFd2UKZXdvIGV3byBFd29uZG8KZmFuIGZhbiBGYW5nCmZhbyBmYW8gRmFyb2VzZQpmYXMgcGVyIFBlcnNpYW4KZmF0IGZhdCBGYW50aQpmaWogZmlqIEZpamlhbgpmaW4gZmluIEZpbm5pc2gKZml1IGZpdSBGaW5uby1VZ3JpYW4gKE90aGVyKQpmb24gZm9uIEZvbgpmcmEgZnJlIEZyZW5jaApmcm0gZnJtIEZyZW5jaC1NaWRkbGUgKGNhLiAxNDAwLTE2MDApCmZybyBmcm8gRnJlbmNoLU9sZCAoODQyLWNhLiAxNDAwKQpmcnkgZnJ5IEZyaXNpYW4KZnVsIGZ1bCBGdWxhaApmdXIgZnVyIEZyaXVsaWFuCmdhYSBnYWEgR2EKZ2F5IGdheSBHYXlvCmdiYSBnYmEgR2JheWEKZ2VtIGdlbSBHZXJtYW5pYyAoT3RoZXIpCmdleiBnZXogR2VlegpnaWwgZ2lsIEdpbGJlcnRlc2UKZ2RoIGdhZSBHYWVsaWMKZ2FpIGlyaSBJcmlzaApnbGcgZ2xnIEdhbGxlZ2FuCmdsdiBnbHYgTWFueApnbWggZ21oIEdlcm1hbi1NaWRkbGUgSGlnaCAoY2EuIDEwNTAtMTUwMCkKZ29oIGdvaCBHZXJtYW4tT2xkIEhpZ2ggKGNhLiA3NTAtMTA1MCkKZ29uIGdvbiBHb25kaQpnb3IgZ29yIEdvcm9udGFsbwpnb3QgZ290IEdvdGhpYwpncmIgZ3JiIEdyZWJvCmdyYyBncmMgR3JlZWstQW5jaWVudCAodG8gMTQ1MykKZ3JuIGdybiBHdWFyYW5pCmd1aiBndWogR3VqYXJhdGkKZ3dpIGd3aSBHd2ljaCdpbgpoYWkgaGFpIEhhaWRhCmhhdSBoYXUgSGF1c2EKaGF3IGhhdyBIYXdhaWlhbgpoZWIgaGViIEhlYnJldwpoZXIgaGVyIEhlcmVybwpoaWwgaGlsIEhpbGlnYXlub24KaGltIGhpbSBIaW1hY2hhbGkKaGluIGhpbiBIaW5kaQpoaXQgaGl0IEhpdHRpdGUKaG1uIGhtbiBIbW9uZwpobW8gaG1vIEhpcmkgTW90dQpocnYgc2NyIENyb2F0aWFuCmh1biBodW4gSHVuZ2FyaWFuCmh1cCBodXAgSHVwYQpoeWUgYXJtIEFybWVuaWFuCmliYSBpYmEgSWJhbgppYm8gaWJvIElnYm8KaWpvIGlqbyBJam8KaWt1IGlrdSBJbnVrdGl0dXQKaWxlIGlsZSBJbnRlcmxpbmd1ZQppbG8gaWxvIElsb2tvCmluYSBpbmEgSW50ZXJsaW5ndWEgKEludGVybmF0aW9uYWwgQXV4aWxhcnkgTGFuZ3VhZ2UgQXNzb2NpYXRpb24pCmluYyBpbmMgSW5kaWMgKE90aGVyKQppbmQgaW5kIEluZG9uZXNpYW4KaW5lIGluZSBJbmRvLUV1cm9wZWFuIChPdGhlcikKaXBrIGlwayBJbnVwaWFrCmlyYSBpcmEgSXJhbmlhbiAoT3RoZXIpCmlybyBpcm8gSXJvcXVvaWFuIGxhbmd1YWdlcwppc2wgaWNlIEljZWxhbmRpYwppdGEgaXRhIEl0YWxpYW4KamF3IGphdiBKYXZhbmVzZQpqcG4ganBuIEphcGFuZXNlCmpwciBqcHIgSnVkZW8tUGVyc2lhbgpqcmIganJiIEp1ZGVvLUFyYWJpYwprYWEga2FhIEthcmEtS2FscGFrCmthYiBrYWIgS2FieWxlCmthYyBrYWMgS2FjaGluCmthbCBrYWwgS2FsYWFsbGlzdXQKa2FtIGthbSBLYW1iYQprYW4ga2FuIEthbm5hZGEKa2FyIGthciBLYXJlbgprYXMga2FzIEthc2htaXJpCmthdCBnZW8gR2VvcmdpYW4Ka2F1IGthdSBLYW51cmkKa2F3IGthdyBLYXdpCmtheiBrYXogS2F6YWtoCmtoYSBraGEgS2hhc2kKa2hpIGtoaSBLaG9pc2FuIChPdGhlcikKa2htIGtobSBLaG1lcgpraG8ga2hvIEtob3RhbmVzZQpraWsga2lrIEtpa3V5dQpraW4ga2luIEtpbnlhcndhbmRhCmtpciBraXIgS2lyZ2hpegprbWIga21iIEtpbWJ1bmR1CmtvayBrb2sgS29ua2FuaQprb20ga29tIEtvbWkKa29uIGtvbiBLb25nbwprb3Iga29yIEtvcmVhbgprb3Mga29zIEtvc3JhZWFuCmtwZSBrcGUgS3BlbGxlCmtybyBrcm8gS3J1CmtydSBrcnUgS3VydWtoCmt1YSBrdWEgS3VhbnlhbWEKa3VtIGt1bSBLdW15awprdXIga3VyIEt1cmRpc2gKa3V0IGt1dCBLdXRlbmFpCmxhZCBsYWQgTGFkaW5vCmxhaCBsYWggTGFobmRhCmxhbSBsYW0gTGFtYmEKbGFvIGxhbyBMYW8KbGF0IGxhdCBMYXRpbgpsYXYgbGF2IExhdHZpYW4KbGV6IGxleiBMZXpnaGlhbgpsaW4gbGluIExpbmdhbGEKbGl0IGxpdCBMaXRodWFuaWFuCmxvbCBsb2wgTW9uZ28KbG96IGxveiBMb3ppCmx0eiBsdHogTGV0emVidXJnZXNjaApsdWEgbHVhIEx1YmEtTHVsdWEKbHViIGx1YiBMdWJhLUthdGFuZ2EKbHVnIGx1ZyBHYW5kYQpsdWkgbHVpIEx1aXNlbm8KbHVuIGx1biBMdW5kYQpsdW8gbHVvIEx1byAoS2VueWEgYW5kIFRhbnphbmlhKQpsdXMgbHVzIEx1c2hhaQptYWQgbWFkIE1hZHVyZXNlCm1hZyBtYWcgTWFnYWhpCm1haCBtYWggTWFyc2hhbGwKbWFpIG1haSBNYWl0aGlsaQptYWsgbWFrIE1ha2FzYXIKbWFsIG1hbCBNYWxheWFsYW0KbWFuIG1hbiBNYW5kaW5nbwptYXAgbWFwIEF1c3Ryb25lc2lhbiAoT3RoZXIpCm1hciBtYXIgTWFyYXRoaQptYXMgbWFzIE1hc2FpCm1kciBtZHIgTWFuZGFyCm1lbiBtZW4gTWVuZGUKbWdhIG1nYSBJcmlzaC1NaWRkbGUgKDkwMC0xMjAwKQptaWMgbWljIE1pY21hYwptaW4gbWluIE1pbmFuZ2thYmF1Cm1pcyBtaXMgTWlzY2VsbGFuZW91cyBsYW5ndWFnZXMKbWtkIG1hYyBNYWNlZG9uaWFuCm1raCBta2ggTW9uLUtobWVyIChPdGhlcikKbWxnIG1sZyBNYWxhZ2FzeQptbHQgbWx0IE1hbHRlc2UKbW5pIG1uaSBNYW5pcHVyaQptbm8gbW5vIE1hbm9ibyBsYW5ndWFnZXMKbW9oIG1vaCBNb2hhd2sKbW9sIG1vbCBNb2xkYXZpYW4KbW9uIG1vbiBNb25nb2xpYW4KbW9zIG1vcyBNb3NzaQptcmkgbWFvIE1hb3JpCm1zYSBtYXkgTWFsYXkKbXVsIG11bCBNdWx0aXBsZSBsYW5ndWFnZXMKbXVuIG11biBNdW5kYSBsYW5ndWFnZXMKbXVzIG11cyBDcmVlawptd3IgbXdyIE1hcndhcmkKbXlhIGJ1ciBCdXJtZXNlCm15biBteW4gTWF5YW4gbGFuZ3VhZ2VzCm5haCBuYWggTmFodWF0bApuYWkgbmFpIE5vcnRoIEFtZXJpY2FuIEluZGlhbiAoT3RoZXIpCm5hdSBuYXUgTmF1cnUKbmF2IG5hdiBOYXZham8KbmJsIG5ibCBOZGViZWxlLCBTb3V0aApuZGUgbmRlIE5kZWJlbGUsIE5vcnRoCm5kbyBuZG8gTmRvbmdhCm5lcCBuZXAgTmVwYWxpCm5ldyBuZXcgTmV3YXJpCm5pYSBuaWEgTmlhcwpuaWMgbmljIE5pZ2VyLUtvcmRvZmFuaWFuIChPdGhlcikKbml1IG5pdSBOaXVlYW4KbmxkIGR1dCBEdXRjaApub24gbm9uIE5vcnNlLCBPbGQKbm9yIG5vciBOb3J3ZWdpYW4KbnNvIG5zbyBTb2h0bywgTm9ydGhlcm4KbnViIG51YiBOdWJpYW4gbGFuZ3VhZ2VzCm55YSBueWEgTnlhbmphCm55bSBueW0gTnlhbXdlemkKbnluIG55biBOeWFua29sZQpueW8gbnlvIE55b3JvCm56aSBuemkgTnppbWEKb2NpIG9jaSBPY2NpdGFuIChwb3N0IDE1MDApCm9qaSBvamkgT2ppYndhCm9yaSBvcmkgT3JpeWEKb3JtIG9ybSBPcm9tbwpvc2Egb3NhIE9zYWdlCm9zcyBvc3MgT3NzZXRpYwpvdGEgb3RhIFR1cmtpc2gsIE90dG9tYW4gKDE1MDAtMTkyOCkKb3RvIG90byBPdG9taWFuIGxhbmd1YWdlcwpwYWEgcGFhIFBhcHVhbiAoT3RoZXIpCnBhZyBwYWcgUGFuZ2FzaW5hbgpwYWwgcGFsIFBhaGxhdmkKcGFtIHBhbSBQYW1wYW5nYQpwYW4gcGFuIFBhbmphYmkKcGFwIHBhcCBQYXBpYW1lbnRvCnBhdSBwYXUgUGFsYXVhbgpwZW8gcGVvIFBlcnNpYW4sIE9sZCAoY2EuIDYwMC00MDAgQi5DLikKcGhpIHBoaSBQaGlsaXBwaW5lIChPdGhlcikKcGhuIHBobiBQaG9lbmljaWFuCnBsaSBwbGkgUGFsaQpwb2wgcG9sIFBvbGlzaApwb24gcG9uIFBvaG5wZWlhbgpwb3IgcG9yIFBvcnR1Z3Vlc2UKcHJhIHByYSBQcmFrcml0IGxhbmd1YWdlcwpwcm8gcHJvIFByb3ZlbudhbCwgT2xkICh0byAxNTAwKQpwdXMgcHVzIFB1c2h0bwpxYWEtcXR6IHFhYS1xdHogUmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZQpxdWUgcXVlIFF1ZWNodWEKcmFqIHJhaiBSYWphc3RoYW5pCnJhcCByYXAgUmFwYW51aQpyYXIgcmFyIFJhcm90b25nYW4Kcm9hIHJvYSBSb21hbmNlIChPdGhlcikKcm9oIHJvaCBSYWV0by1Sb21hbmNlCnJvbSByb20gUm9tYW55CnJvbiBydW0gUm9tYW5pYW4KcnVuIHJ1biBSdW5kaQpydXMgcnVzIFJ1c3NpYW4Kc2FkIHNhZCBTYW5kYXdlCnNhZyBzYWcgU2FuZ28Kc2FoIHNhaCBZYWt1dApzYWkgc2FpIFNvdXRoIEFtZXJpY2FuIEluZGlhbiAoT3RoZXIpCnNhbCBzYWwgU2FsaXNoYW4gbGFuZ3VhZ2VzCnNhbSBzYW0gU2FtYXJpdGFuIEFyYW1haWMKc2FuIHNhbiBTYW5za3JpdApzYXMgc2FzIFNhc2FrCnNhdCBzYXQgU2FudGFsaQpzY28gc2NvIFNjb3RzCnNlbCBzZWwgU2Vsa3VwCnNlbSBzZW0gU2VtaXRpYyAoT3RoZXIpCnNnYSBzZ2EgSXJpc2gtT2xkICh0byA5MDApCnNobiBzaG4gU2hhbgpzaWQgc2lkIFNpZGFtbwpzaW4gc2luIFNpbmhhbGVzZQpzaW8gc2lvIFNpb3VhbiBsYW5ndWFnZXMKc2l0IHNpdCBTaW5vLVRpYmV0YW4gKE90aGVyKQpzbGEgc2xhIFNsYXZpYyAoT3RoZXIpCnNsayBzbG8gU2xvdmFrCnNsdiBzbHYgU2xvdmVuaWFuCnNtaSBzbWkgU2FtaSBsYW5ndWFnZXMKc21vIHNtbyBTYW1vYW4Kc25hIHNuYSBTaG9uYQpzbmQgc25kIFNpbmRoaQpzbmsgc25rIFNvbmlua2UKc29nIHNvZyBTb2dkaWFuCnNvbSBzb20gU29tYWxpCnNvbiBzb24gU29uZ2hhaQpzb3Qgc290IFNvdGhvIFNvdXRoZXJuCnNwYSBzcGEgU3BhbmlzaApzcWkgYWxiIEFsYmFuaWFuCnNyZCBzcmQgU2FyZGluaWFuCnNycCBzY2MgU2VyYmlhbgpzcnIgc3JyIFNlcmVyCnNzYSBzc2EgTmlsby1TYWhhcmFuIChPdGhlcikKc3N3IHNzdyBTd2F0aQpzdWsgc3VrIFN1a3VtYQpzdW4gc3VuIFN1bmRhbmVzZQpzdXMgc3VzIFN1c3UKc3V4IHN1eCBTdW1lcmlhbgpzd2Egc3dhIFN3YWhpbGkKc3dlIHN3ZSBTd2VkaXNoCnN5ciBzeXIgU3lyaWFjCnRhaCB0YWggVGFoaXRpYW4KdGFpIHRhaSBUYWkgKE90aGVyKQp0YW0gdGFtIFRhbWlsCnRhdCB0YXQgVGF0YXIKdGVsIHRlbCBUZWx1Z3UKdGVtIHRlbSBUaW1uZQp0ZXIgdGVyIFRlcmVubwp0ZXQgdGV0IFRldHVtCnRnayB0Z2sgVGFqaWsKdGdsIHRnbCBUYWdhbG9nCnRoYSB0aGEgVGhhaQp0aWcgdGlnIFRpZ3JlCnRpciB0aXIgVGlncmlueWEKdGl2IHRpdiBUaXYKdGtsIHRrbCBUb2tlbGF1CnRsaSB0bGkgVGxpbmdpdAp0bWggdG1oIFRhbWFzaGVrCnRvZyB0b2cgVG9uZ2EgKE55YXNhKQp0b24gdG9uIFRvbmdhIChUb25nYSBJc2xhbmRzKQp0cGkgdHBpIFRvayBQaXNpbgp0c2kgdHNpIFRzaW1zaGlhbgp0c24gdHNuIFRzd2FuYQp0c28gdHNvIFRzb25nYQp0dWsgdHVrIFR1cmttZW4KdHVtIHR1bSBUdW1idWthCnR1ciB0dXIgVHVya2lzaAp0dXQgdHV0IEFsdGFpYwp0dmwgdHZsIFR1dmFsdQp0d2kgdHdpIFR3aQp0eXYgdHl2IFR1dmluaWFuCnVnYSB1Z2EgVWdhcml0aWMKdWlnIHVpZyBVaWdodXIKdWtyIHVrciBVa3JhaW5pYW4KdW1iIHVtYiBVbWJ1bmR1CnVuZCB1bmQgVW5kZXRlcm1pbmVkCnVyZCB1cmQgVXJkdQp1emIgdXpiIFV6YmVrCnZhaSB2YWkgVmFpCnZlbiB2ZW4gVmVuZGEKdmllIHZpZSBWaWV0bmFtZXNlCnZvbCB2b2wgVm9sYXB1awp2b3Qgdm90IFZvdGljCndhayB3YWsgV2FrYXNoYW4Kd2FsIHdhbCBXYWxhbW8Kd2FyIHdhciBXYXJheQp3YXMgd2FzIFdhc2hvCndlbiB3ZW4gU29yYmlhbgp3b2wgd29sIFdvbG9mCnhobyB4aG8gWGhvc2EKeWFvIHlhbyBZYW8KeWFwIHlhcCBZYXBlc2UKeWlkIHlpZCBZaWRkaXNoCnlvciB5b3IgWW9ydWJhCnlwayB5cGsgWXVwaWsKemFwIHphcCBaYXBvdGVjCnplbiB6ZW4gWmVuYWdhCnpoYSB6aGEgWmh1YW5nCnpobyBjaGkgQ2hpbmVzZQp6bmQgem5kIFphbmRlCnp1bCB6dWwgWnVsdQp6dW4genVuIFp1bmkKCiovCg==